vi(m)
1. 准备工作
在一般情况下,无论何种
装它。当然,万一你的主机上还没安装 VIM, 请输入如下命令安装它。
[[email protected] ~]# yum install vim
2. 运行 vim
输入启动 vim 的命令:
[[email protected] ~]# vim file.txt
无论是哪个 Linux 发行版本, 这条命令都会让 Vim 创建名为 file.txt 的文件。
这是个新的文件,所以你会看到一个空白的窗口。 如果这个文件已经存在,那么
vim 将会打开这个文件。
3. vim 模式
Vim 是一个模式编辑器,也就是 vim 会根据所处的模式对不同行为作出不同
反应。 vim 在一般模式(NORMAL) 会在屏幕的底部显示文件名或者是空白;在
输入模式,底部会显示 –INSERT–;在可视模式,底部显示的是–VISUAL–。
在打开 vim 时默认处于一般模式。
4. 输入
要输入文字,你要让编辑器进入输入模式。按下 i 键,接着你会发现屏幕左
下方的文字变成了 –INSERT–(意味着编辑器进入了输入模式)。
现在输入一些文字。这些文字会被输入到文件中。不用怕出错,过一会儿你
就可以改正它们了。输入下面这首程序员的打油诗:
命令序列 错误!文档中没有指定样式的文字。 -1
A very intelligent turtle
Found programming Linux a hurdle
The system, you see,
Ran as slow as did he,
And that’s not saying much for the turtle.
输入完,按下<Esc>键, –INSER–消失了,编辑器又回到了命令模式。 此
时你的屏幕应该跟下图相似。
5. 移动
在一般模式中,你可以使用 h(左)、 j(下)、 k(上)和 l(右)在 vim 里移动。
咋看起来写 vim 的人随意地选取了这些字母。毕竟,谁用 L 键来向右移动?不过
这个做法有它很好的理由:移动是编辑器里最常做的事情,而这些键都在你右手
放在键盘上时手指正对的那一行。换句话说,它们就在你最方便按的地方。
记住这四个命令没有什么好的方法,只有通过不断练习直到形成条件反射为
止。另外一个方式是把下面这个图抄到便贴里,然后贴到显示器上面,直到你熟
悉这四个命令。
vim 中的移动命令
注意 |
Vim 用户常见的一个问题就是被编辑器的模式所困扰。这常常是因为 不清楚编辑器处在哪个模式,又或者不知道按下了哪个键导致编辑器 进入了另外一个模式引起的。 事实上, 无论编辑器当前在什么模式, 按下 Esc 键,它都会回到一般模式。有时需要按两次<Esc>,如果 Vim 以一声蜂鸣回答你,那说明你已经是在一般模式了 默认情况下, vim 里面的文字不会自动换行。如果你不按回车键而一 直不停地输入文字直到它们到了编辑器的右边栏,你所做的只是输入 了非常长的一行文字, vim 不会为你自动换行。要换行的话,你必须 按下回车键(这是正常模式的操作,可以通过配置 vim 来要求 vim 给 你自动换行, 不过如何配置在我们的课程中没有提到)。 |
注意 |
你也可以通过方向键来移动。只不过这样做反而会大大地地降低你编 辑文件的速度。因为你按下方向键的时候必然要把你的手从字母键上 移动到方向键上。如果你一个小时内要重复这个动作成百上千遍的 话,使用这四个键会节约数量可观的时间。因此,如果你想高效地编 辑的话,使用 h、 j、 k 和 l 吧。 |
6. 删除
删除的方法是将光标移到想删除的文字上面然后按下 x 键1。例如, 用“gg”
命令将光标移动到第一行头上, 按下 x 键 7 次以删除“A very ”。 如所示。然后
按下 i 键进入输入模式, 输入正确的字符 “A young ”。然后按“Esc”键退出
输入模式。 如所示。
删除“A very ”后的屏幕.
插入“A young ”后的屏幕
当然你也可以删除一行,删除一整行内容使用"dd"命令。删除后下面的行会
移上来填补空缺。接下来我们将光标移到第一行任意一处,按下“dd” 把文件的
第一行删除:
删除首行之后的屏幕
我们还可以通过“J”命令来删除换行符,如,将光标移到当前第二行任意一
处,按下“Shift+j”也即“J”来删除当前行的换行符:
1这是为了兼容以前的打字机的操作方式, 打字机是通过键入 x 来删除文字的
同时,也有些主机上的键盘是没有方向键或者不按常规方式排列方向 键的。所以,知道如何使用这四个键也能在遇到上述情况下对你编辑 文件有所帮助。 |
删除第二行换行符之后的屏幕
7. 撤销和重复
假如你删除过头了, 当然你可以再输入一次的。不过会有更简单的方法。命
令 u 会撤销你最后一次的编辑。按下 u 来撤销最后一次的删除操作。最后一次
的编辑删除了第二行的换行符,所以该操作被撤销。文件将回到如删除首行之后
的屏幕所示的状态。 再按一次 u 撤销删除首行的操作,文件将回到如插入“A
young ”后的屏幕所示的状态。 每输入一次 u 就会回撤一次操作。 如果你撤销过
头了,可以按下 Ctrl+r (重复)来取消撤销过多带来的效果,按下 Ctrl+r, 在上
面的例子中, 首行将又被删除。
8. 保存退出
你可以使用“:wq” 命令来退出 vim。这个命令会将修改的文件写回硬盘然后
退出。如果你输入了“:wq”,你的修改会被提交而且不可以进行撤销和重复操作,
然后退出 vim。 这个命令有三个部分:冒号(:),它会让编辑器进入命令模式;
命令 w,它告诉编辑器保存文件;命令 q,它告诉编辑器退出程序。
某些时候,你可能会在你改了一大堆东西后,突然意识到你就不应该修改这
个文件。不用担心, vim 有一个“退出然后放弃所有修改”的命令。它就是“:q!”。
这个命令同样有三个部分:冒号(:),它会让编辑器进入命令模式;命令 w,它
告诉编辑器保存文件;命令 q,它告诉编辑器退出程序;然后是强制命令修饰符
——感叹号(!)。感叹号是必须的,它告诉 vim 无需保存文件。
我们也可以通过“ZZ” 也即“Shift+z+z” 命令来退出 vim,如果文件作过改
动“ZZ”命令就保存文件并退出 vim,如果文件没有作过改动“ZZ”命令就直接
退出 vim。
9. 帮助
在最后,还有一个重要的命令要提到——帮助命令。要获取帮助,输入“:help”
或者按下 F1 键。 vim 会显示一个帮助概览的窗口,如帮助所示2。
2 vim 打开了两个文档,上面是新打开的帮助文档,下面是我们例子中的文档,我们会在下一任务中提到
vim 如何打开多个文档。
帮助
:help 会显示一个帮助的概览窗口。在帮助文档中可以使用 vim 的全部命令。
因此,按下 h、 k、 j 和 l 会向左、上、下、右移动。 同样可以通过“zz” 退出帮
助文档。
帮助文档中有些文字是被竖线封闭的(例如|usr_01.txt|)。它表示的是这个文
字是一个链接。如果你将鼠标放在两个竖线的中间然后按下 CTRL+](跳到该标
签), 可以进入相应的主题3。 可能在跳了几次后,你可能想要回到原来的位置。
CTRL+T(弹出标签)将你带回到之前的屏幕。
如果要完整地获取某个主题的帮助,使用下面的命令“:help 主题”。 例如,
要获取 x 命令的帮助就需要键入“:help x”
10.小结
现在你知道该怎么使用 vim 编辑器了。虽然不够快也不够好,但你起码可以
完成基本的操作了。花点时间,在完成下一个任务之前先练习下本任务中学习的
内容。在你吸收了这些内容后,你可以步入到下一任务去学习 vim 一些更高级的
特性。
3由于一个我们不在这里深究的原因, 在 vim 中用术语 tag 而不是 link 或者其他什么术语来表示链接。
接下来,我们来完成一个稍稍复杂一点的任务,当然这个任务也将涉及到 vim
更加高级的一些命令。 我们要完成的任务是这样的:
1. 请在 /tmp 这个目录下建立一个名为 vimtest 的目录, 进入 vimtest 这个目
录当中, 将 /etc/man.config 拷贝到本目录底下, 使用 vim 打开这个文本文
件;
2. 在 vim 中设定一下行号;
3. 移动到第 58 行行首, 再向右移动 30 个字符,移动到第 8 行行尾,再向左
移动 3 个单词;
4. 移动到第一行行首,并且向下搜寻一下『man 』这个字符串;
5. 将 50 到 100 行之间的 man 改为 MAN,并且一个一个挑选是否需要修
改
6. 复制 51 到 60 行这十行的内容,并且贴到最后一行之后;
7. 删除 11 到 30 行之间的 20 行;
8. 去第 29 行首,并且删除 15 个字符;
9. 修改完之后,突然反悔了,要全部复原;
10. 将这个文件另存成一个 名为 man.config.bak 的文件;
11. 在最后一行后插入错误!未找到引用源。 中所示的字样,并保存;
12. 在不关闭 man.config.bak 的文件情况下,再次打开 man.config;
13. 将步骤 11 中在 man.config.bak 中输入的字样的第 1 列到第 10 列拷贝并粘
贴到 man.config 中;
14. 储存两个文件后离开 vim。
1. 打开文件
[[email protected] ~]# mkdir /tmp/vimtest
[[email protected] ~]# cd /tmp/vimtest
[[email protected] ~]# cp /etc/man.config .
[[email protected] ~]# vim /tmp/vimtest/man.config
2. 设置行号
用“:set nu”命令来设置行号,设置后应如下所示, 可以用“:set nonu”来
取消行号设置。
3. 移动
用“数字+移动方向”来进行快捷移动,如我们可以用“3j” 来从当前行向下
移动 3 行,也可以用“数字+G”或者“数字+$”指定移动到某行行首或者行尾,
如我们可以用“3G”来移动到第 3 行行首。
用“gg”移动到首行行首,再用“57j”移动到第 58 行行首;也可以使
用“58G”直接移动到第 58 行行首;
用“40l”向右移动 40 个字符;
用“7G”移动到第 7 行行首,用“$”移动到本行行尾,“3b”向左移动
3 个单词。
表 vim 移动命令
命令键 | 命令用途 |
h 或 (←) | 光标向左移动一个字符 |
j 或 (↓) | 光标向下移动一个字符 |
k 或 (↑) | 光标向上移动一个字符 |
l 或 (→) | 光标向右移动一个字符 |
[Ctrl] + [f] |
屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) |
[Ctrl] + [b] |
屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) |
[Ctrl] + [d] | 屏幕『向下』移动半页 |
[Ctrl] + [u] | 屏幕『向上』移动半页 |
0 | 光标移动到这一行的最前面字符处 (常用) |
$ | 光标移动到这一行的最后面字符处(常用) |
H | 光标移动到这个屏幕的最上方那一行 |
M | 光标移动到这个屏幕的中央那一行 |
L | 光标移动到这个屏幕的最下方那一行 |
G | 光标移动到这个文件的最后一行(常用) |
gg | 光标移动到这个文件的第一行 (常用) |
<Enter> | 光标向下移动 1 行(常用) |
w | 光标向右移动 1 个单词 |
b | 光标向左移动 1 个单词 |
其中 h、 j、 k、 l、 $、 <Enter>、 G、 w、 b 均可以与数字组成组合键,如 “30j”表示向下移动 30 行, 30G 表示移动到本文件的第 30 行。 |
4. 查找替换
用“gg”移动到首行行首,用键入“/man” 来查找“man”字符串,用
“n”和“N”来遍历所有的“man”字符串;
用“:50,100s/man/MAN/gc”来用 MAN 替换 50 到 100 行之间的 man,
vim 会逐个在替换前询问你是否替换。
替换字符串
表 vim 查找和替换命令
命令键 | 命令用途 |
/word |
从光标所在往下查找一个名为 “word” 的字符串。 如要在文件内查找“man”这个字符串,就输入 /man (常用) |
?word | 向光标所在往上查找一个名为 “word” 的字符串。 |
n |
表示重复前一次查找。如果刚刚我们执行 /man 去 向下查找“man”这个字符串,则按下 n 后,会向 下继续查找下一个名为“man”的字符串“。如果 是执行 ?man 的话,那么按下 n 则会向上继续查 找名为“man”的字符串 |
N |
表示“反向”执行前一次查找。 例如 /man 后, 按下 N 则表示从光标处向上查找 “man” 。 |
:n1,n2s/word1/word2/g |
n1 与 n2 为数字。在第 n1 与 n2 行之间查找 word1 这个字符串,并用 word2 来替代, 例如在 100 到 200 行之间搜寻 man 并取代为 MAN 则可 以写作:“:100,200s/man/MAN/g”。 (常用) |
:1,$s/word1/word2/g |
在整个文件中查找 word1 这个字符串,并用 word2 来替代(常用) |
:1,$s/word1/word2/gc |
在整个文件中查找 word1 这个字符串,并用 word2 来替代, 且在取代前显示提示字符给使用者 确认 (conform) 是否需要取代! (常用) |
5. 复制粘贴
用“50G”来到文本的第 50 行,再用“10yy”复制 51 行到 60 行;
用“G”来到文件的最后 1 行,再用“p”进行粘贴。
在最后粘贴了 51 到 60 行之间的内容
表 vim 复制和粘贴命令
命令键 | 命令用途 |
yy | 复制游标所在的那一行(常用) |
nyy |
n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列(常用) |
p, P |
p 为将已复制的数据在光标下一行贴上, P 则为贴在游标上 一行! 举例来说,我目前光标在第 20 行,且已经复制了 |
10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么 原本的第 20 行会被推到变成 30 行。 (常用) |
6. 删除
用“10G”来到文本的第 10 行,再用“20dd”复制 11 行到 30-行;
用“29G”来到文本的第 29 行首,再用“15x”删除 15 个字符。
表 vim 删除命令
命令键 | 命令用途 |
x, X |
在一行字当中, x 为向后删除一个字符 (相当于 [del] 按 键), X 为向前删除一个字符(相当于 [backspace] 亦即是 退格键) (常用) |
nx |
n 为数字,连续向后删除 n 个字符。举例来说,我要连续 删除 10 个字符, 『10x』。 |
dd | 删除游标所在的那一整列(常用) |
ndd |
n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删 除 20 列 (常用) |
7. 撤销和重复
用“u”来撤销直到所有操作都被恢复(或者直接用“:e!”来恢复);
表 vim 撤销和重复命令
命令键 | 命令用途 |
u | 撤销前一个动作。 (常用) |
[Ctrl]+r | 重做上一个动作。 (常用) |
:e! | 将文件还原到最原始的状态 |
8. 打开、保存和退出
用“:w man.config.bak” 将文件另存;
用“i”切换到编辑模式, 将错误!未找到引用源。 中所示的字样输入,用“w”
保存;
表 vim 打开、保存和退出命令
命令键 | 命令用途 |
:w | 将编辑的数据写入硬盘档案中(常用) |
:w! | 若档案属性为『只读』时,强制写入该档案。不过,到底能 不能写入, 还是跟您对该档案的档案权限有关啊! |
:q | 离开 vi (常用) |
:q! |
若曾修改过档案,又不想储存,使用 ! 为强制离开不储存 档案。 |
:wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
ZZ | 若文件没有更动,则不储存离开,若文件已经经过更动,则 储存后离开 |
:w [filename] | 将编辑的数据储存成另一个文件(类似另存新文件) |
:r [filename] |
在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个档案内容加到游标所在行后面 |
:n1,n2 w [filename] |
将 n1 到 n2 的内容储存成 filename 这个文件。 |
9. 同时编辑多个文件
vim 提供了同时编辑多个文件的功能,在 vim 后面同时可以接多个文件名,
用户来同时打开多个文件。 vim 同时提供了在多个窗口打开文件的功能,输入
“:sp 文件名”命令即可在不关闭当前文件的情况下打开新文件。
可用“ZZ” 先退出 vim,然后用“vim 文件名 1 文件名 2… 文件名 n”
打开多个文件,如这里可以用“vim man.config.bak man.config”同时打
开这两个文件,然后用“:n”和“:N”在这两个文件间切换。
或者用“:sp man.config”直接打开此文件,并用“[ctrl]+wj”和“[ctrl]+wk”,
在这两个文件间切换。
表 vim 打开多个文件命令
命令键 | 命令用途 |
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出目前这个 vim 的打开的所有文件 |
:sp [filename] |
开启一个新窗口,如果有加 filename, 表示在新窗口开启 一个新文件,否则表示两个窗口为同一个文件内容(同步显 示)。 |
[ctrl]+wj |
按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有 的按键,然后再按下 j ,则光标可移动到下方的窗口。 |
[ctrl]+wk | 同上,不过光标移动到上面的窗口。 |
[ctrl]+wq |
要结束下方窗口,那么利用 [ctrl]+wj 移动到下方窗口,按 下 :q 即可, 也可以按下 [ctrl]+wq |
10. 可视模式
vim 提供了一种可视模式,按 Esc 键,然后按 Ctrl+v 就进入可视模式。可视
模式为我们提供了极为友好的选取文本范围,以高亮显示;在屏幕的最下方显示
有-- 可视 -- 或--VISUAL--进入可视模式,我们就可以用前面所说的命令行模式
中的光标移动指令,可以进行文本范围的选取。
切换到 man.config.bak 中;
按下“ctrl+v” 进入可视模式下的区块选择模式,用光标选中要拷贝的区
域(这些区域会反白);
按下“y”进行拷贝;
切换到 man.config 中,按“G”来到最后一行,按下“p”进行粘贴。
表 vim 可视模式下的选择、复制和删除命令
命令键 | 命令用途 |
v | 字符选择,会将光标经过的地方反白选择 |
V | 行选择,会将光标经过的行反白选择 |
[Ctrl]+v | 区块选择,可以用长方形的方式选择文本 |
y | 将反白的地方复制起来 |
d | 将反白的地方删除掉 |
可视模式下的区块选择和粘贴
11. 环境配置
vim 提供了环境设定功能,利用 vim 的环境设定,可以给我们的工作提供非
常大的一个帮助。 vim 的环境设定参数有很多,可以在一般模式时输入:“ :set
all” 来查阅,这里仅列出一些平时比较常用的一些简单的设定值。
表 vim 的环境配置命令
命令键 | 命令用途 |
:set nu | 设定行号,取消的话,就是 :set nonu |
:set hlsearch |
是否将搜寻的字符串反白。 默认值就是 hlsearch ,如果 不想要反白,就 :set nohlsearch 。 |
:set autoindent |
autoindent 就是自动缩排, 不想要缩排就 :set noautoindent 。 |
:set backup |
是否自动储存备份档,一般是 nobackup 的, 如果设定 backup 的话,那么当你更动任何一个档案时,则源文件会 被另存成一个档名为 filename~ 的档案。 |
:set ruler | 右下角是否显示状态列说明 |
:set showmode |
这个则是,是否要显示 --INSERT-- 之类的字眼在左下角的 状态列。 |
:set all | 显示目前所有的环境参数设定值。 |
:syntax (off|on) |
是否依据程序相关语法显示不同颜色? 举例来说,在编辑 一个纯文字文件时,如果开头是以 # 开始,那么该行就会 变成蓝色。 但是, 如果您仅是编写纯文本文件,要避免颜 色对您的屏幕产生的干扰,则可以取消这个设定 :syntax off 。 |
12. 暂时存档文件和恢复
当编辑一个文件时,在这个文件所处的目录底下就会有一个临时文件,文件
名为“编辑的文件名.swp”这是一个隐藏文件, 所有修改都会暂时存在这个文件
中。 在编辑过程中,系统或者 vi 非正常关闭了,那么再重新用 vi 打开这个文件
时时,系统就会询问要回复『Recovery』。按下 (R) ,就可以将数据回复到修改
过程的样子,再将 swp 文件删除。
vim 在编辑文件时发生意外崩溃或者退出后再打开同一文件