官网 http://www.vim.org/
一,vi与vim
1,为何要学vim?
a)所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在;
b)很多个别软件的编辑接口都会主动呼叫 vi (例如未来会谈到的 crontab, visudo, edquota 等指令);
c)vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计;
d)因为程序简单,编辑速度相当快速。
vim 视作 vi 的进阶版本,vim 可以用颜色或底线等方式来显示一些特殊的信息;
vim 会依据文件的扩展名或者是文件内的开头信息, 判断该文件的内容而自动的呼叫该程序的语法判断式,再以颜色来显示程序代码与一般信息;
vim 里面加入了很多额外的功能,例如支持正则表达式的搜寻架构、多文件编辑、区块复制等等
二, vi 的使用
vi 共分为三种模式,分别是『一般指令模式』、『编辑模式』与『指令列命令模式』
a)一般指令模式 (command mode)
以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在这个模
式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整列』来处
理文件内容, 也可以使用『复制、贴上』来处理你的文件数据
b)编辑模式 (insert mode)
在一般指令模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的! 要等到
你按下『i, I, o, O, a, A, r, R』等任何一个字母之后才会进入编辑模式。注意了!通常在 Linux
中,按下这些按键时,在画面的左下方会出现『 INSERT 或 REPLACE 』的字样,此时才可以进
行编辑。而如果要回到一般指令模式时, 则必须要按下『Esc』这个按键即可退出编辑模式
c)指令列命令模式 (command-line mode)
在一般模式当中,输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一列。在
这个模式当中, 可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显
示行号等等的动作则是在此模式中达成的!
注:一般指令模式可与编辑模式及指令列模式切换, 但编辑模式与指令列模式之间不可互相切换
1,简易执行范例
(1)使用『 vi filename 』进入一般指令模式
/bin/vim welcome.txt
打开后分为实际内容和状态信息行
(2)按下 i 进入编辑模式,开始编辑内容
a)在一般指令模式之中,只要按下 i, o, a 等字符就可以进入编辑模式
b)可以发现在左下角状态栏中会出现 –INSERT- 的字样,这个时候,键盘上除了 [Esc] 这个按键之外,其他的按键都可以视作为一般的输入按钮了
(3)按下 [ESC] 按钮回到一般指令模式
(4)进入指令列模式,保存文件并离开 vi 环境
保存 (write) 并离开 (quit) 的命令很简单,输入『:wq』即可保存退出! (按下 : 该光标就会移动到最底下一列去!
2,按键说明
(1)第一部份:一般指令模式可用的按钮说明,光标移动、复制贴上、搜寻取代等
a)移动光标的方法
h 或 向左箭头键(←) 光标向左移动一个字符
j 或 向下箭头键(↓) 光标向下移动一个字符
k 或 向上箭头键(↑) 光标向上移动一个字符
l 或 向右箭头键(→) 光标向右移动一个字符
注:进行多次移动,例如向下移动 30 列,可以使用 "30j" 或 "30↓" 的组合按键
[Ctrl] + [f] 屏幕向下移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕向上移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d] 屏幕向下移动半页
[Ctrl] + [u] 屏幕向上移动半页
+ 光标移动到非空格符的下一列
- 光标移动到非空格符的上一列
n
0或功能键[Home] 移动到这一列的最前面字符处 (常用)
$ 或功能键[End] 移动到这一列的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一列的第一个字符
M 光标移动到这个屏幕的中央那一列的第一个字符
L 光标移动到这个屏幕的最下方那一列的第一个字符
G 移动到这个文件的最后一列(常用)
nG n 为数字。移动到文件的第 n 列。例如 20G 则会移动到文件的第 20 列(可配合 :set nu)
gg 移动到这个文件的第一列! (常用)
n
b)查找与替换
/word 向光标之下寻找一个名称为 word 的字符串
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 重复前一个搜寻的动作。
N 与 n 刚好相反,为『反向』进行前一个搜寻动作
:n1,n2s/word1/word2/g 在第 n1 与 n2 列之间寻找 word1 这个字符串,并将该字符串取代为 word2
:1,$s/word1/word2/g 从第一列到最后一列寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
:1,$s/word1/word2/gc 在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)
c)删除、复制与粘贴
x, X x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nx n 为数字,连续向后删除 n 个字符。
dd 删除游标所在的那一整列(常用)
ndd n 为数字。删除光标所在的向下 n 列 (常用)
d1G 删除光标所在到第一列的所有数据
dG 删除光标所在到最后一列的所有数据
d$ 删除游标所在处,到该列的最后一个字符
d0 那个是数字的 0 ,删除游标所在处,到该列的最前面一个字符
yy 复制游标所在的那一列(常用)
nyy n 为数字。复制光标所在的向下 n 列(常用)
y1G 复制光标所在列到第一列的所有数据
yG 复制光标所在列到最后一列的所有数据
y0 复制光标所在的那个字符到该列行首的所有数据
y$ 复制光标所在的那个字符到该列行尾的所有数据
p, P p 为将已复制的数据在光标下一列贴上,P 则为贴在游标上一列!(常用)
J 将光标所在列与下一列的数据结合成同一列
c 重复删除多个数据,例如向下删除 10 列,[ 10cj ]
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用)
. 重复前一个动作的意思 (常用)
(2)第二部份:一般指令模式切换到编辑模式的可用的按钮说明
a)进入插入或替换的编辑模式
i, I 进入插入模式(Insert mode):i 为光标所在处插入, I 为在所在列的第一个非空格符处开始插入。
a, A 进入插入模式(Insert mode):a 为光标所在的下一个字符处插入, A 为从光标所在列的最后一个字符处插入。
o, O 进入插入模式(Insert mode):o 光标所在的下一列处插入新的一列; O 在光标所在处的上一列插入新的一列!
r, R 进入取代模式(Replace mode):r 只会取代光标所在的那一个字符一次;R 会一直取代光标所在的文字,直到按下 ESC为止;(常用)
[Esc] 退出编辑模式,回到一般指令模式中(常用)
(3)第三部份:一般指令模式切换到指令列模式的可用按钮说明
a)指令列模式的保存、离开等指令
:w 将编辑的数据写入硬盘文件中(常用)
:w! 若文件属性为『只读』时,强制写入该文件。
:q 离开 vi (常用)
:q! 为强制离开不储存文件。
:wq 保存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ 若文件没有更动,则不保存离开,若文件已经被更动过,则保存后离开!
:w [filename] 将编辑的数据储存成另一个文件(类似另存新文件)
:r [filename] 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到游标所在列后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个文件。
:! command 暂时离开 vi 到指令列模式下执行 command 的显示结果!
b)vim 环境的变更
:set nu 显示行号,设定之后,会在每一列的前缀显示该列的行号
:set nonu 与 set nu 相反,为取消行号!
3,一个案例练习
http://linux.vbird.org/linux_basic/0310vi/man_db.conf
忽略
4,vim 的暂存档、救援回复与开启时的警告讯息
在使用 vim 编辑时, vim 会在与被编辑的文件的目录下,再建立一个名为 .filename.swp 的文件;
vim提示两点主要的问题与解决方案:
问题一 :可能有其他人或程序同时在编辑这个文件
解决方法:
a)找到另外那个程序或人员,请他将该 vim 的工作结束,然后你再继续处理。
b)如果你只是要看该文件的内容并不会有任何修改编辑的行为,那么可以选择开启成为只读(O)文件,
问题二:在前一个 vim 的环境中,可能因为某些不知名原因导致 vim 中断 (crashed)
解决方法:
a)如果你之前的 vim 处理动作没有保存,此时你应该要按下『R』,亦即使用 (R)ecover 的项目, 此
时 vim 会载入 .man_db.conf.swp 的内容,那个 .man_db.conf.swp 并不会在你结束 vim 后自动删除,
所以你离开 vim 后还得要删除 .man_db.conf.swp 才能避免每次打开这个文件都会出现这样的警告!
b)如果你确定这个暂存盘是没有用的,那么你可以直接按下『D』删除掉这个暂存盘,亦即 (D)elete it
这个项目即可。 此时 vim 会载入 man_db.conf ,并且将旧的 .man_db.conf.swp 删除后,建立这
次会使用的新的 .man_db.conf.swp !
暂存盘警告讯息的画面中,有出现六个可用按钮,各按钮的说明如下:
a)[O]pen Read-Only:打开此文件成为只读文件
b)(E)dit anyway:还是用正常的方式打开你要编辑的那个文件, 并不会载入暂存盘的内容,容易出现冲突。
c) (R)ecover:就是加载暂存盘的内容,用在你要救回之前未保存的内容。 需要手动自行删除那个暂存档!
d) (D)elete it:删除暂存文件
e)(Q)uit:按下 q 就离开 vim ,不会进行任何动作回到命令提示字符。
f) (A)bort:忽略这个编辑行为,感觉上与 quit 非常类似! 也会回到命令提示字符!
三,vim 的额外功能
1,区块选择(Visual Block)
区块选择的按键意义
v 字符选择,会将光标经过的地方反白选择!
V 列选择,会将光标经过的列反白选择!
[Ctrl]+v 区块选择,可以用长方形的方式选择资料
y 将反白的地方复制起来
d 将反白的地方删除掉
p 将刚刚复制的区块,在游标所在处贴上!
2,多文件编辑
多文件编辑的按键
:n 编辑下一个文件
:N 编辑上一个文件
:files 列出目前这个 vim 的开启的所有文件
3,多窗口功能
多窗口情况下的按键功能
:sp [filename] 开启一个新窗口,如果有加 filename, 表示在新窗口开启一个新文件,否则表示两个窗口
为同一个文件内容(同步显示)。
[ctrl]+w+ j [ctrl]+w+↓ 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向
下箭头键),则光标可移动到下方的窗口。
[ctrl]+w+ k [ctrl]+w+↑ 同上,不过光标移动到上面的窗口。
[ctrl]+w+ q 其实就是 :q 结束离开啦! 举例来说,如果我想要结束下方的窗口,那么利用 [ctrl]+w+
↓ 移动到下方窗口后,按下 :q 即可离开, 也可以按下 [ctrl]+w+q 啊!
4,vim 的挑字补全功能
组合按钮 补齐的内容
[ctrl]+x -> [ctrl]+n 通过目前正在编辑的这个『文件的内容文字』作为关键词,予以补齐
[ctrl]+x -> [ctrl]+f 以当前目录内的『文件名』作为关键词,予以补齐
[ctrl]+x -> [ctrl]+o 以扩展名作为语法补充,以 vim 内建的关键词,予以补齐
5, vim 环境设定与记录: ~/.vimrc, ~/.viminfo
vim 的环境设定参数
:set nu :set nonu 设定与取消行号!
:set hlsearch :set nohlsearch hlsearch 就是 high light search(高亮度搜寻)。 这个就是设定是否将搜寻的字符串
反白的设定值。默认值是 hlsearch
:set autoindent :set noautoindent 是否自动缩排?autoindent 就是自动缩排。
:set backup 是否自动储存备份档?一般是 nobackup 的
:set ruler 右下角的一些状态栏说明 ,ruler 是显示或不显示该设定值!
:set showmode 是否要显示 --INSERT-- 之类的字眼在左下角的状态栏。
:set backspace=(012) 一般来说, 如果我们按下 i 进入编辑模式后,可以利用退格键 (backspace) 来删除任
意字符的。 但是,某些 distribution 则不许如此。此时,我们就可以透过 backspace
来设定啰~ 当 backspace 为 2 时,就是可以删除任意值;0 或 1 时,仅可删除刚刚
输入的字符, 而无法删除原本就已经存在的文字了!
:set all 显示目前所有的环境参数设定值。
:set 显示与系统默认值不同的设定参数, 一般来说就是你有自行变动过的设定参数啦!
:syntax on :syntax off 是否依据程序相关语法显示不同颜色
:set bg=dark :set bg=light 可用以显示不同的颜×××调,预设是『 light 』
6,vim 常用指令示意图
四,其他 vim 使用注意事项
1,中文编码的问题
a)Linux 系统默认支持的语系数据: /etc/locale.conf ;
b)终端界面 (bash) 的语系: LANG, LC_ALL;
c)文件原本的编码;
d)开启终端机的软件,例如在 GNOME 底下的窗口接口。
2,DOS 与 Linux 的换行字符
dos2unix [-kn] file [newfile]
unix2dos [-kn] file [newfile]
选项与参数:
-k :保留该文件原本的 mtime 时间格式 (不更新文件上次内容经过修订的时间)
-n :保留原本的旧档,将转换后的内容输出到新文件,如: dos2unix -n old new
3,语系编码转换
iconv --list
iconv -f 原本编码 -t 新编码 filename [-o newfile]
选项与参数:
--list :列出 iconv 支持的语系数据
-f :from ,亦即来源之意,后接原本的编码格式;
-t :to ,亦即后来的新编码要是什么格式;
-o file:如果要保留原本的文件,那么使用 -o 新档名,可以建立新编码文件。
五,重点回顾
1,Linux 底下的配置文件多为文本文件,故使用 vim 即可进行设定编辑;
2, vim 可视为程序编辑器,可用以编辑 shell script, 配置文件等,避免打错字;
3,vi 为所有 unix like 的操作系统都会存在的编辑器,且执行速度快速;
4,vi 有三种模式,一般指令模式可变换到编辑与指令列模式,但编辑模式与指令列模式不能互换;
5,常用的按键有 i, [Esc], :wq 等;
6,vi 的画面大略可分为两部份,(1)上半部的本文与(2)最后一行的状态+指令列模式;
7,数字是有意义的,用来说明重复进行几次动作的意思,如 5yy 为复制 5 列之意;
8,光标的移动中,大写的 G 经常使用,尤其是 1G, G 移动到文章的头/尾功能!
9,vi 的取代功能也很棒! :n1,n2s/old/new/g 要特别注意学习起来;
10,小数点『 . 』为重复进行前一次动作,也是经常使用的按键功能!
11,进入编辑模式几乎只要记住: i, o, R 三个按钮即可!尤其是新增一列的 o 与取代的 R
12,vim 会主动的建立 swap 暂存档,所以不要随意断线!
13,如果在文章内有对齐的区块,可以使用 [ctrl]-v 进行复制/贴上/删除的行为
14,使用 :sp 功能可以分区窗口
15,若使用 vim 来撰写网页,若需要 CSS 元素数据,可透过 [crtl]+x, [crtl]+o 这两个连续组合按键来取得关键词
16,vim 的环境设定可以写入在 ~/.vimrc 文件中;
17,可以使用 iconv 进行文件语系编码的转换
18,使用 dos2unix 及 unix2dos 可以变更文件每一列的行尾断行字符。