一.vi/vim文本编辑器

回到顶部

我们经常需要对linux系统服务进行配置,不同的Linux distribution都配备了各自的系统配置管理工具, 比如Red Hat Enterprise Linux与Fedora的ntsysv与setup,SuSE则有YAST管理工具。 而配置服务最常用的方式就是编辑服务对应的配置文件。在Linux中,绝大部分服务的配置文件都是以ASCII纯文本形态存在, 这些管理工具都是通过修改配置文件来设置系统参数的。我们也可以直接利用文本编辑器来修改文本配置文件,来对系统进行参数配置。 在Linux系统中使用文本编辑器来编辑配置文件从而对系统进行配置,是系统管理员必备的一项技能! 在图形界面模式下有很多可用的文本编辑器如xemacs,而在命令行模式下,可用的文本编辑器也有很多, 经常听说的就有emacs, pico, nano, joe和vim等。 这么多文本编辑器我们该选择哪一个呢?我们为什么要学习vim编辑器?
所有的linux发行版默认的命令行文本编辑器都是vi。vi就相当于windows下的记事本,是系统内置的文本编辑器。 许多带有编辑功能的命令默认也是调用vi作为编辑接口。例如后面会介绍的crontab、visudo、edquota等。 所以如果不熟悉vi的话,很多命令都没法继续操作了。
vim作为vi的改进版本,具有更多高级强大的功能,例如支持正则表达式的搜寻模式、多文件编辑、区块复制等。 这对于我们在Linux上进行一些配置文件的修改工作时是很棒的功能。
利用vim我们不仅可以编辑修改服务的配置文件,也可以用来编写shell script, C program等程序文件, vim会根据文件的扩展名或者是文件内的开头信息, 自动判断文件中的语法信息,并用不同的颜色来区别显示。 所以我们也可以用vim来进行语法检查,方便程序设计;
所以vim不但可以修改编辑系统配置文件,更多的时候也被程序开发者作为开发程序的必备工具。 而vim自己也强调自己是程序开发工具。
另外由于vi/vim程序设计简单,编辑速度也非常快速。 总之,vi/vim就是linux下默认的命令行文本编辑器。是必须要掌握的。学会后,您将在Linux的世界里畅行无阻
在目前的绝大多数Linux发行版中,vim已经替换vi作为默认的文本编辑器。 所以不管是输入vi还是vim,实际运行的都是vim。 可以通过whereis追踪vi的可执行文件路径,最后会发现其实就是vim

二.vi/vim的使用

回到顶部

1.vi/vim三种模式切换

回到顶部

vi/vim一共有三种运行模式,分别是普通模式、编辑模式和命令行模式。 三种模式的说明如下:

vi三种运行模式
vi三种运行模式
vi模式 模式说明
普通指令模式
command mode
vi默认的打开模式,我们在命令行用vi打开一个文件就会直接进入普通模式。在普通模式下可以对vi下达不同的功能指令。 例如用上下左右按键移动光标,用d指令删除字符,使用y和p指令粘贴和复制文本等。 在一般模式中可以进行删除、复制和粘贴的功能,但是无法编辑文件内容。
以vi打开一个文件就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用上下左右按键来移动光标, 你可以使用删除字符或删除整行来处理文件内容, 也可以使用复制、粘贴来处理你的文件数据。
在编辑模式和命令行模式下,按ESC键都会返回到普通模式。
编辑模式
insert mode
在一般模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容。 在普通模式下按下进入编辑模式的指令即可进入编辑模式,这些按键指令包括:i, I, o, O, a, A, r, R等。 在编辑模式下,界面左下方会出现--INSERT--或--REPLACE--的字样。在编辑模式下可以对文件内容进行编辑。 按下Esc键就会退出编辑模式,并回到普通模式。 注意虽然在普通模式下可以进行删除字符、复制和粘贴等编辑动作,但那只是普通模式下某个指令的功能。只有编辑模式才可以真正的编辑文本。
命令行模式
command-line mode
在普通模式下输入':'、'/'、'?'这三个中的任意一个指令即可进入命令行模式。在命令行模式下,光标会移动到最底下一行,等待用户的输入。 在命令行模式下,用户可以执行文件内搜索,字符替换、设置vim编辑环境如显示行号、保存、退出等动作。 同样也是按下Esc键就会退出命令行模式,并回到普通模式。
需要注意编辑模式与命令行模式之间是不能互相切换的。

vim运行模式切换关系如下图所示:
vim运行模式切换 图 vi三种模式的相互切换
注意一般指令模式可以进入编辑模式和命令行模式, 但编辑模式与命令行模式不能互相切换。任何模式下都可以通过ESC进入普通指令模式!
另外注意普通指令模式和命令行模式的区别,普通指令模式直接执行用户的输入指令,但是不会提供光标输入。而命令行模式会在底部提供光标供用户输入。

2.vi/vim简单示例

回到顶部

我们先通过一个简单的示例来了解vim的用法。通过vim打开一个文件,编辑后保存退出。
1.首先通过vi或者vim打开一个文件,文件名为initroot.txt,如果文件不存在默认就会创建该文件:

              [root@initroot ~]$ vim initroot.txt
            
上面的命令不管是用vi还是vim都是一样的,实际调用的都是vim。我们后面的示例都是以vim为例。
vim打开的界面如下图所示: vim打开文件 图 用vim打开一个新文件
整个画面分为两部份,上半部与最底下一行。上半部显示的是文件的实际内容,最底下一行则是 状态显示行(New File信息),或者是命令下达行!。最后一行的内容并不是在文件内,而是 vi 显示一些信息的地 方喔!
画面中的最底下一行,在左边显示该文件的属性,包括只读文件、内容共有 11176 行与 670293 个字符;
最底下一行的右边出现的 1,1 表示光标所在为第一行, 第一个字符位置之意(请看上图中的光标所在);
看到了喔!除了批注之外,其他的行就会有特别的颜色显示呢!可以避免你打错字啊!而且, 最右下角的 1% 代表目前这个画面占整体文件的 1% 之意!
此时vim处于普通指令模式,我们就可以输入vim指令了。
2. 按下i进入编辑模式,开始编辑文字
在一般指令模式之中,只要按下 i, o, a 等指令就可以进入编辑模式了!在编辑模式下, 左下角状态栏中会出现--INSERT--的字样,表示可以输入任意字符!除了Esc键, 键盘上的其他按键都可以被vim当做文本输入,也就是可以进行文本编辑了!
我们输入www.initroot.com,如下图所示: vim编辑模式 图 用vi编辑文件
3. 按下ESC按钮回到普通指令模式
我们已经编辑好了文件,需要保存退出了。但是在保存退出之前,需要先退回到普通指令模式。 只需要按下Esc即可回到普通指令模式。此时左下角的--INSERT--也就消失不见了!!
4. 在普通指令模式下,按下':'指令进入命令行模式
因为保存和退出的命令需要在命令行模式下才能下达,所以我们通过:指令进入命令行模式, 此时光标会移到最底下一行中去,等待用户输入。
5. 在命令行模式,输入wq保存退出vim
在命令行模式下,输入wq,w表示写入(write)保存的意思,q表示退出(quit)vim。 保存并退出vim 图 在命令行模式输入wq保存并离开vim
此时我们回到了linux命令行模式下,可以通过ls -l查看刚刚建立的文件:
              root@initroot:~# ls -al initroot.txt 
              -rw-r--r-- 1 root root 17 Jan 14 20:20 initroot.txt
            
这样initroot.txt文件建立好了!有时候可能因为权限问题, vim会提示无法保存,比如文件的权限为-r--r--r-- 时,是没有权限写入的。 不过可以在wq的后面加上一个!感叹号,表示强制执行!感叹号前面的命令。 不过,需要特别注意呦!那个是在你的权限可以改变的情况下才能成立的!
以上就是vim的简单使用。我们下面详细介绍vim的指令。

三.vi/vim常用按键指令说明

回到顶部

除了上面提到的i, Esc, :等指令外,vi/vim还有非常多的按键指令可以使用。 vi的三种模式只有一般指令模式可以与编辑、指令行模式切换,编辑模式与指令行模式 之间并不能切换的!

vi/vim按键指令
第一部份:普通指令模式的按键指令
移动光标
按键指令 指令说明
h或向左箭头键(←) 光标向左移动一个字符
j或向下箭头键(↓) 光标向下移动一个字符
k或向上箭头键(↑) 光标向上移动一个字符
l或向右箭头键(→) 光标向右移动一个字符。
[Ctrl] + [f] 屏幕向下移动一页,相当于[Page Down]按键 (常用)
[Ctrl] + [b] 屏幕向上移动一页,相当于[Page Up]按键 (常用)
[Ctrl] + [d] 屏幕向下移动半页
[Ctrl] + [u] 屏幕向上移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n<space> n表示数字,例如 20 。按下数字后再按空格键,光标会向后移动n个字符。例如20<space> 则光标会向后面移动20个字符距离。
0(数字)

功能键[Home]
移动到本行的行首字符处 (常用)
$ 或功能键[End] 移动到本行的行尾字符处(常用)
w 光标跳到下个字的开头
e 光标跳到下个字的字尾
H 光标移动到屏幕最上方那一行的第一个字符
M 光标移动到屏幕中央那一行的第一个字符
L 光标移动到屏幕最下方那一行的第一个字符
G 移动到文件的最后一行(常用)
nG nG n 为数字。移动到文件的第n行。例如20G则会移动到这个文件的第20行(可配合 :set nu)
gg 移动到文件的第一行,相当于1G啊! (常用)
n<Enter> n为数字。光标向下移动n行(常用)
删除、复制与粘贴
x, X 在光标所在行中,x为向后删除光标所在位置的一个字符 (相当于del按键), X为向前删除光标前面的一个字符(相当于backspace 亦即是退格键) (常用)。 x和X不会跨行删除字符。
nx n为数字,连续向后删除n个字符。举例来说,我要连续删除10个字符, 按下10x。
dd dd 删除光标所在的一整行(常用)
ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
d1G 删除光标所在到第一行的所有数据
dG 删除光标所在到最后一行的所有数据
d$ 删除游标所在处,到该行的最后一个字符
d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy 复制游标所在的那一行(常用)
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
y1G 复制光标所在行到第一行的所有数据
yG 复制光标所在行到最后一行的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前 光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本 的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
J 将光标所在行与下一行的数据结合成同一行
c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用) 这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿! 很快乐的啦!
. 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重 复贴上等等动作,按下小数点『.』就好了! (常用)
第二部份:普通指令模式切换到编辑模式,编辑模式分为插入模式和替换模式
i, I 进入插入模式(Insert mode): i 为『从目前光标所在处插入』 , I 为『在目前所在行的第一个非空格符处开始插入』 。 (常用)
a, A 进入插入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始插入』 , A 为『从光标所在行的最后一个 字符处开始插入』。(常用)
o, O 进入插入模式(Insert mode): 这是英文字母 o 的大小写。 o 为『在目前光标所在的下一行处插入新的一行』; O 为 在目前光标所在处的上一行插入新的一行!(常用)
r, R 进入替换模式(Replace mode): r 只会替换光标所在的那一个字符一次; R 会一直替换光标所在的文字,直到按下 ESC 为止;(常用)
上面这些按键中,在 vi 画面的左下角处会出现『--INSERT--』或『--REPLACE--』的字样。 由名称就知道该动作了 吧! !特别注意的是,我们上面也提过了,你想要在文件里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔!
[Esc] 退出编辑模式,回到一般指令模式中(常用),任何模式下都可以按Esc回到普通指令模式
第三部份:普通指令模式切换到命令行模式
保存与退出
:w 将编辑的数据写入硬盘文件中(常用)
:w! 若文件属性为『只读』时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件 的文件权限有关啊!
:q 离开 vi (常用)
:q! 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存文件。 注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用) ZZ 这是大写的 Z 喔!若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开!
:x 保存后离开
ZZ 若文件没有更动,则不保存离开,若文件已经被更改过,则保存后离开
:w [filename] 将编辑的数据储存成另一个文件(类似另存新档)
:r [filename] 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到游标 所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个文件。
:! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的文件信息!
文件内搜索与替换
/word 向光标之下寻找一个名称为 word 的字符串。例如要在文件内搜寻 initroot 这个字符串, 就输入 /initroot 即可! (常用)
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 这个 n 是英文按键。代表『重复前一个搜寻的动作』。举例来说, 如果刚刚我们执行 /initroot 去向下搜寻 initroot 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 initroot 的字符串。如果是执行 ?initroot 的话,那么按下 n 则会向上继续搜寻名称为 initroot 的字符串
N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /initroot 后,按下 N 则表示『向上』搜寻 initroot 。 使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词! 使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词!
:n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串替换 为 word2 !举例来说,在 100 到 200 行之间搜寻 initroot 并替换为 INITROOT 则: 『:100,200s/initroot/INITROOT/g』 。(常用)
:1,$s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串替换为 word2 !(常用)
:1,$s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串替换为 word2 !且在替换前显 示提示字符给用户确认 (confirm) 是否需要替换!(常用)
vim 环境的设置
:set nu vim显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu 与 set nu 相反,为取消行号!
上述是几个最常用的光标移动指令,hjkl在键盘上是排行在一起的,可以使用这四个按钮来快速移动光标。
对于刚接触vim来说,可能不太习惯这样的按键用法,大部分新手更习惯用箭头键来移动光标。 这里强调一定要多多练习使用hjkl来移动光标,一旦习惯了以后,会比使用箭头键效率更高。这也是vim强烈推荐的专业用法。
特别注意,在 vi 中,『数字』是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表 去到第几个什么什么的意思。举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之 前~那我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。如果想要进行多次移动的话,例如向下移动30行,可以使用30j或30↓的组合按键, 即加上想要进行的次数(数字)后,按下动作即可! OK!会这些指令就已经很厉害了,因为常用到的指令也只有不到一半!通常 vi 的指令除了上面鸟 哥注明的常用的几个外,其他是不用背的,你可以做一张简单的指令表在你的屏幕墙上, 一有疑问 可以马上的查询呦!这也是当初使用 vim 的方法啦!
为了方便大家查询在不同的模式下可以使用的 vim 指令,查询了一些 vim 与 Linux 教育训练 手册, 发现底下这张图非常值得大家参考!可以更快速有效的查询到需要的功能喔!看看吧!
vim常用指令示意图 图 vim 常用指令示意图

vim自测练习

回到顶部

来来来!赶紧测试一下你是否已经熟悉 vi 这个指令呢?请依照底下的需求进行指令动作。 (底下的 操作为使用 CentOS 7.1 中的 man_db.conf 来做练习的,该文件你可以在这里下载:
http://linux.initroot.org/linux_basic/0310vi/man_db.conf。) 看看你的显示结果与的结果是否相同啊?
1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录;2. 进入 vitest 这个目录当中;
3. 将 /etc/man_db.conf 复制到本目录底下(或由上述的连结下载 man_db.conf 文件);
4. 使用 vi 开启本目录下的 man_db.conf 这个文件;
5. 在 vi 中设定一下行号;
6. 移动到第 43 行,向右移动 59 个字符,请问你看到的小括号内是哪个文字?
7. 移动到第一行,并且向下搜寻一下『 gzip 』这个字符串,请问他在第几行?
8. 接着下来,我要将 29 到 41 行之间的『小写 man 字符串』改为『大写 MAN 字符串』,并且一个一个挑 选是否需要修改,如何下达指令?如果在挑选过程中一直按『y』 , 结果会在最后一行出现改变了几个 man 呢?
9. 修改完之后,突然反悔了,要全部复原,有哪些方法?
10. 我要复制 66 到 71 这 6 行的内容(含有 MANDB_MAP),并且贴到最后一行之后;
11. 113 到 128 行之间的开头为 # 符号的批注数据我不要了,要如何删除?
12. 将这个文件另存成一个 man.test.config 的檔名;
13. 去到第 25 行,并且删除 15 个字符,结果出现的第一个单字是什么?
14. 在第一行新增一行,该行内容输入『I am a student...』;
15. 储存后离开吧!
整个步骤可以如下显示:
1. 『mkdir /tmp/vitest』
2. 『cd /tmp/vitest』
3. 『cp /etc/man_db.conf .』
4. 『/bin/vi man_db.conf』
5. 『:set nu』然后你会在画面中看到左侧出现数字即为行号。
6. 先按下『43G』再按下『59→』会看到『 as 』这个单字在小括号内;
7. 先执行『1G』或『gg』后,直接输入『/gzip』 ,则会去到第 93 行才对!
8. 直接下达『 :29,41s/man/MAN/gc 』即可!若一直按『y』最终会出现『在 13 行内置换 13 个字符串』的 说明。
9. (1)简单的方法可以一直按『 u 』回复到原始状态,(2)使用不储存离开『 :q! 』之后,再重新读取一次 该文件;
10. 『66G』 然后再『 6yy 』之后最后一行会出现『复制 6 行』之类的说明字样。 按下『 G 』到最后一行, 再给他『 p 』贴上 6 行!
11. 因为 113~128 共 16 行,因此『 113G 』→『 16dd 』就能删除 16 行,此时你会发现游标所在 113 行 的地方变成 『 # Flags. 』 开头啰
12. 『 :w man.test.config 』 ,你会发现最后一行出现 "man.test.config" [New].. 的字样。
13. 『25G』 之后,再给他『 15x 』即可删除 15 个字符,出现『 tree 』的字样;
14. 先『 1G 』去到第一行,然后按下大写的『 O 』便新增一行且在插入模式;开始输入『I am a student...』 后, 按下[Esc]回到一般指令模式等待后续工作;
15. 『:wq』 如果你的结果都可以查的到,那么 vi 的使用上面应该没有太大的问题啦!剩下的问题会是在...打字 练习...。

四.vim的缓存文件、救援恢复与启动时的警告信息

回到顶部

当我们在编辑文件的时候,如果遇到突然断电等原因而导致linux系统意外关机,编辑的文件没有来得及保存, 那么没有来得及保存的数据还能不能找回来呢?vim可以通过缓存文件恢复意外丢失的数据。
当使用vim编辑文件时, vim会在与被编辑文件的目录下,再建立一个名为.filename.swp的缓存文件。 文件前面有个.,所以这是一个隐藏文件。我们对文件的编辑操作都会同步到这个隐藏的缓存文件中。 如果系统因为意外关机,意外崩溃,导致文件没有正常保存,那么这个暂存文件就会发挥作用。我们就可以利用vim创建的缓存文件恢复没有来得及保存的数据。
我们在家目录下创建一个测试目录vimtest,然后用vim打开一个文件test.txt。 此时vim会在vimtest目录下创建一个.test.txt.swp文件,这个文件就是vim为test.txt创建的缓存文件。 我们通过ctrl-z组合键将vim放到后台暂停运行。这时就会回到shell命令行, 我们通过ls -al观察会发现当前目录下多了一个.test.txt.swp文件:

              root@initroot:~/vimtest# vim test.txt 
              #此时进入vim界面,直接按下ctrl-z组合键将vim进程放到后台暂停运行。
              [1]+  Stopped                 vim test.txt
              root@initroot:~# ls -al
              total 20
              drwxr-xr-x  2 root root 4096 Jan 15 10:11 .
              drwx------ 14 root root 4096 Jan 15 10:11 ..
              -rw-r--r--  1 root root   39 Jan 15 10:11 test.txt
              -rw-r--r--  1 root root 4096 Jan 15 10:11 .test.txt.swp
            
如果vim正常退出,那么.test.txt.swp也会随之消失了。 因为vim是正常退出的,没有数据丢失,不需要救援恢复,所以这个文件也就没有必要保留了。
但是如果vim意外退出,那么这个文件就会保留下来用于数据的恢复救援。
我们通过kill命令将vim进程杀掉,来模仿vim意外退出:
              root@initroot:~# ps aux | grep vim
#一种方法
root@initroot:~# kill -9 n
root@initroot:~# jobs
#另外一种方法
root@initroot:~# kill -9 %1 [1]+ Killed vim test.txt root@initroot:~# ls -al total 20 drwxr-xr-x 2 root root 4096 Jan 15 10:11 . drwx------ 14 root root 4096 Jan 15 10:11 .. -rw-r--r-- 1 root root 39 Jan 15 10:11 test.txt -rw-r--r-- 1 root root 4096 Jan 15 10:11 .test.txt.swp
这样导致暂存盘无法通过正常的流程结束,所以暂存文件不会消失,而是继续保留下来。 通过ls -al命令观察,.test.txt.swp文件依然还在。
因为vim已经退出了,所以我们重新用vim打开test.txt文件:
              root@initroot:~# vim test.txt 
            
进入vim界面后,会出现如下提示:
              E325: ATTENTION          #错误代码

              #下面是对缓存文件的说明信息
            Found a swap file by the name ".test.txt.swp"
                      owned by: root   dated: Wed Jan 15 10:11:22 2020
                    file name: ~root/test.txt    #缓存文件所缓存的实际文件
                      modified: no
                    user name: root   host name: initroot
                    process ID: 3395
            While opening file "test.txt"
                        dated: Wed Jan 15 10:11:18 2020

            #下面说明可能发生这个错误的两个主要原因与解决方案!
            (1) Another program may be editing the same file.  If this is the case,
                be careful not to end up with two different instances of the same
                file when making changes.  Quit, or continue with caution.
            (2) An edit session for this file crashed.
                If this is the case, use ":recover" or "vim -r test.txt"
                to recover the changes (see ":help recovery").
                If you did this already, delete the swap file ".test.txt.swp"
                to avoid this message.

            Swap file ".test.txt.swp" already exists!   #下面给出可以执行的动作按键
            [O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort: 
            
如果打开文件的目录下,有对应文件的缓存文件,那么vim就会主动判断这个文件可能存在问题。 vim首先会行出缓存文件的基本信息,然后给出出现这个缓存文件可能发生的原因以及解决方案:
1.可能有其他用户或程序同时在编辑这个文件。
由于Linux是多用户多任务的环境,因此很有可能会出现多个用户同时编辑某一个文件。 如果多个用户同时编辑同一个文件,势必会造成文件内容的混乱。所以为了避免这个问题,vim希望这个文件同时只能有一个用户在编辑。 所以在用vim打开一个有缓存文件的文件时,vim认为可能已经有人在编辑这个文件了,于是就会给出警告提示。
如果是这种情况的话,我们可以先按q键退出(Q)uit vim,找出正在编辑该文件的用户或者进程,等待用户或者进程结束编辑后,再重新打开文件编辑。 或者如果只是想看看文件的内容而不编辑,可以以只读方式打开[O]pen Read-Only,根据最后一行的提示,只需要输入o键,即可以只读模式打开[O]pen Read-Only。
2.vim给出的第二个可能的原因是,vim可能因为意外原因而崩溃中断了。
我们上面通过kill命令将vim杀死了,就是模拟的这种情况。 这时候如果想要恢复(R)ecover意外丢失的数据,我们就是按下r键,这样vim就会载入.test.txt.swp的内容,覆盖掉test.txt,然后就可以正常编辑文件了。 但是如果你正常结束vim的工作,那个.test.txt.swp文件还是会存在的,需要通过rm命令手动删除该文件。
另外在出现上面的警告界面时,如果确定那个缓存文件是没有用的,也可以按下d键,直接将缓存文件删除(D)elete it。 这时候vim就会加载真正要打开的文件test.txt,同时为该文件建立新的缓存文件.test.txt.swp。
上述输出的最后一行,给出了可用的按键信息。这些按键我们在上面的说明中也已经提到过了:
[O]pen Read-Only:以只读模式打开文件,可以用在你只是想要查阅该文件内容并不想要进行编辑行为时。这样即使有别人在编辑该文件,也不会出现冲突;
(E)dit anyway:仍然打开要编辑的文件, 并不会载入缓存文件的内容。除非你非常确定在做什么,否则不建议用这个;
(R)ecover:用缓存文件恢复要编辑的文件。也就是如果出现意外,我们就通过这个按键恢复丢失的文件数据。 不过当文件恢复,并且正常退出vim后,该缓存文件仍然存在,需要用rm命令手动删除;否则每次打开对应的文件时都会出现这样的提示。

(D)elete it:如果确定缓存文件的内容并不重要,对你是无用的。那么可以用d键直接删除该缓存文件;
(Q)uit:按下q直接退出vim ,不执行任何动作即回到命令提示字符;
(A)bort:忽略这个编辑行为,类似(Q)uit! 也会回到命令提示字符!

五.vim的额外功能

回到顶部

以上介绍的内容,vim的用法与vi都是完全一模一样的,几乎没有什么区别。 目前大部分linux发行版已使用vim替代vi。我们通过type或者whereis命令可以看出vi的可执行文件为/usr/bin/vi。 通过ls命令我们追踪到/usr/bin/vi其实就是vim命令的符号链接。
其实,目前大部分的Linux发行版本都以vim替换了vi。为什么要用vim呢?因为vim具有颜色显示的功能,并且还支持许多的程序语法(syntax)和相应的提示信息。 不过和vi相比,vim多了很多额外的功能。例如支持编程语法的颜色显示等。本节就来介绍vim独有的高级功能。

1.区块选择(Visual Block)

回到顶部

我们提到的vi/vim操作指令,大部分都是以行为单位的操作。区块选择指令除了以行为单位,也可以以字符和区块为单位进行选择操作。 区块选择的指令有v、V和Ctrl+v,这个功能可以让我们复制一个矩形区域的内容,十分方便。
指令的含义如下表所示:

vim区块选择指令
vim区块选择指令
按键指令 指令说明
v 字符选择,按下v键后,通过hjkl移动光标,将光标经过的地方反白选择!
V 行选择,按下V键后,通过hjkl移动光标,将光标经过的行反白选择! 注意如果V是通过大写锁定键Capslock输入的,按下V键后,此时键盘处于大写锁定状态,需要先解除大写锁定,然后在通过hjkl移动光标。 可以通过shift+v输入大写V。
Ctrl+v 区块选择,按下Ctrl+v键后,通过hjkl移动光标,将光标起点和结束点组成的矩形区域反白选择
y 将反白的地方复制起来
d 将反白的地方删除掉
p 将刚刚复制的区块,在游标所在处贴上!。需要注意的是,粘贴时候也是粘贴在一个块的范围内,而不是以行为单位来处理的。
按下v家族指令后,vim界面的左下角会出现-- VISUAL BLOCK --的字样,表示此时可以移动光标进行选择操作了。
我们通过一个简单的示例来实际操作一下选择与复制粘贴操作。br /> 将/etc/hosts文件复制到/tmp目录下,并看产hosts文件的内容如下:
              root@initroot:/tmp# cp /etc/hosts .
              root@initroot:/tmp# cat hosts
              192.168.1.1 host1.initroot.com
              192.168.1.2 host2.initroot.com
              192.168.1.3 host3.initroot.com
              192.168.1.4 host4.initroot.com
              ...省略...
            
我们将host1, host2,host3,host4复制,然后粘贴到每行的后面,最后的文件看起来应该像这样:
              root@initroot:/tmp# cp /etc/hosts .
              root@initroot:/tmp# cat hosts
              192.168.1.1 host1.initroot.com host1
              192.168.1.2 host2.initroot.com host2
              192.168.1.3 host3.initroot.com host3
              192.168.1.4 host4.initroot.com host4
              ...省略...
            
操作步骤如下:
1. 使用vim hosts打开文件;
2. 使用hjkl指令将光标移动到第一行host1的前面,按下ctrl-v ,左下角出现-- VISUAL BLOCK --字样;
3. 使用hjkl指令将光标移动到最后一行host4单词4的位置,此时光标移动过的区域会反白显示,表示处于选择状态;
4. 按下y复制被选择的区域,此时反白的区块就消失不见了;
5. 最后,使用hjkl指令将光标移动到第一行的最后,输入a指令进入编辑模式,键入两个空格键; 然后按Esc回到普通指令模式后, 按下p键,这样就将刚才复制的内容粘贴到每行的末尾了。

2.多文件编辑

回到顶部

vim可以同时编辑多个文件。只需要在vim命令后面输入多个要打开的文件名即可。vim会将这些文件同时打开. 但是vim只有一个编辑窗口,所以只能显示当前正在编辑的文件,通过:n和:N指令可以切换当前编辑的文件。 大家在使用vim的时候,可能会碰到你需要复制一个文件中的某段到另外一个文件中,而vim不能够在关闭的时候,把这段保留住。或者是用其它的方法复制。
【vim file1 file2】
我们在两个或多个文件之间复制粘贴内容时,这个功能会让我们方便很多。
使用命令vim name1 name2 name3...(各个文件名之间用空格隔开)可以同时打开多个文件。

vim多文件切换指令
vim多文件切换指令
按键指令 指令说明
:n 编辑下一个文件
:N 编辑上一个文件
:files 行出目前vim打开的所有文件
我们前面修改了/tmp/hosts文件的四行内容,现在想将这四行内容复制粘贴到/etc/host文件中。 这时候就用到多文件同时编辑了。操作步骤如下:
1. 通过vim hosts /etc/hosts同时打开两个文件;
2. 先使用:files察看当前已经打开的文件;按下任意键回到一般指令模式;
3. 在第一行输入4yy复制四行;
4. 输入:n切换到第二个编辑的文件,此时编辑的文件为/etc/hosts;
5. 按下G指令将光标移动到最后一行,输入p指令粘贴刚才复制的内容;
6. 按下多次的u指令可以还原原本的文件数据;
7. 按下:q退出vim!
利用多文件编辑的功能,可以让你很快速的就将需要的资料复制到正确的文件内。
上面vim只显示了一个编辑界面。vim也可以同时显示多个编辑窗口。 这就是下面即将介绍的多窗口功能。

3.多窗口功能

回到顶部

:sp {filename}指令可以将vim的编辑窗口分区为多个编辑窗口。注意filename可有可无, 如果想要在新窗口打开另一个文件,就加入文件名,只输入:sp时, vim会为同一个文件开启不同的编辑窗口!
按ctrl+w可以将光标移动到不同的窗口中。
有两个需要对照着看的文件
【:sp filename】开启一个新窗口,如果有加 filename, 表示在新窗口开启一个新文件,否则表示两个窗口为同一个文件内容(同步显示)。
可以在一个窗口中打开多个文件。
输入命令:sp{filename}便可以实现这个功能。如果想要在新窗口启动另外一个文件,则加入文件名。如果省略文件名,则打开的是同一个文件。
vim manpath.config打开一个文件。在一般模式下输入:sp。发现打开的是同一个文件。如果再输入:sp /etc/hosts。则变成:

vim多窗口指令
vim多窗口指令
按键指令 指令说明
:sp {filename} 打开一个新窗口,如果有加filename, 表示在新窗口打开filename文件,否则两个窗口同时打开同一个文件
ctrl+w 不同窗口之间切换
【ctrl+w+j】
【ctrl+w+↓】按键的按法是:先按下 【ctrl】 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下箭头键),则光标可移动到下方的窗口。
【ctrl+w+k】
【ctrl+w+↑】同上,不过光标移动到上面的窗口。
Ctrl+w+j:先按下Ctrl不放,再按下w后放开所有的按键,再按下j(或向下箭头键),则光标可以移到下方的窗口;
Ctrl+w+k:同上,不过光表移到上面的窗口;
Ctrl+w+q:离开。
多窗口编辑功能在实际应用中也是很有帮助的,比如需要对比两个文件的内容, 或者一个文件很大,想同时查看文件的开头和结尾,就可以用多窗口功能了。

4.vim文字自动补全功能

回到顶部

bash下可以按下tab键来对命令、选项、参数等进行补全。 现在非常多的图形界面下的编辑器都具有内容自动补全功能,比如比较流行的程序编辑器vscode, 在你输入程序关键词的时候,vscode会自动显示出可能的关键词供用户选择,同时对关键词显示不同的颜色。 vim同样也可以做到内容自动补全。 vim常用的内容补全指令如下表所示:

vim文字自动补全指令
vim文字自动补全指令
按键指令 指令说明
[ctrl]+x -> [ctrl]+n 通过当前正在编辑的文件的内容作为关键词,予以补齐
[ctrl]+x -> [ctrl]+o 按照文件扩展名所表示的语言语法,以vim内建的关键词,予以补齐
[ctrl]+x -> [ctrl]+f 以当前目录内的文件名作为关键词,予以补齐
比较常用的就是前两条指令了。第一个组合按键中,你可能会在同一个文件里面重复出现许多相同的关键词, 那么就能够透过这个补全的功能来处理。如果你是想要使用vim内建的语法检验功能来处理取得关键词的补全,那么第二个组合就很有用了,这个组合需要注意编辑文件的扩展名。
光看说明可能比较难以理解,我们实践一下很快就能明白了。
我们编辑一个网页html文件,由于网页通常会支持 CSS 的语法,而 CSS 的美化语法使用的是 style 这个关键词, 这个关键词后面接的就是 CSS 的元素与元素值。 若想要取得可能的元素有哪些,例如背景 (background) 的语法中, 想要了解有哪些跟它有关的内建元素,直接输入 b 然后按下 [crtl]+x 再按下 [crtl]+o: vim文字补全 图 vim文字补全功能
通过上图我们发现vim会把关键词以不同的颜色显示。输入b然后按下crtl+x,再按下crtl+o组合键后就会出现相关字词可以选择,此时就能够使用上下按钮来挑选所需要的关键元素! 这样使用上当然方便很多啊!只是要注意,一定要使用正确的扩展名,否则会无法出现任何关键词词喔!

六.vim环境设定与记录: ~/.vimrc, ~/.viminfo

回到顶部

需要注意的是,vim会将i我们的以前的行为都记录下来,以方便我们操作。它保存在文件:~/.viminfo中。
如果我们以vim软件来查找一个文件内部的某个字符串时,这个字符串会被反白, 而下次我们再次以vim编辑这个文件时,该查找的字符串反白情况还是存在。 另外,当我们重复编辑同一个文件时,当第二次进入该文件时, 光标竟然就在上次离开的那一行的开头。这个功能可能是方便,但也有不方便的时候。
怎么会这样呢?这是因为我们的vim会主动的将你曾经做过的行为登录下来,那个记录动作的文件就是: ~/.viminfo,不想用这个功能,就直接删除~/.viminfo。只要你曾经使用过vim,那么你的家目录就会有这个文件。 这个文件是自动产生的,你在vim里头所做过的动作,就可以在这个文件内部找到。有兴趣的朋友可以自己查看文件里面的内容。
不过,对于每个不同的发行版本对vim的预设环境都不太相同。举例来说,某些版本在查找到关键词时并不会高亮度反白, 有些版本则会主动的帮你进行缩排(所谓的缩排,就是当你按下 Enter 编辑新的一行时,光标不会在行首,而是在与上一行的第一个非空格符处对齐)的行为。其实这些都可以自行设定的,下面我们就来看看vim的环境设定。 vim的环境设定参数有很多,如果你想要知道目前的设定值,可以在一般模式时输入【 :set all】来查阅,由于设定项目实在太多了, 我们在这里就仅行出一些平时比较常用的一些简单的设定值,给大家提供参考。
有没有发现,如果我们以 vim 软件来搜寻一个文件内部的某个字符串时,这个字符串会被反白, 而 下次我们再次以 vim 编辑这个文件时,该搜寻的字符串反白情况还是存在呢!甚至于在编辑其他文 件时, 如果其他文件内也存在这个字符串,哇!竟然还是主动反白耶!真神奇! 另外,当我们重复 编辑同一个文件时,当第二次进入该文件时, 光标竟然就在上次离开的那一行上头呢!真是好方便啊~但是,怎么会这样呢?
这是因为我们的 vim 会主动的将你曾经做过的行为记录下来,好让你下次可以轻松的作业啊! 那个 记录动作的文件就是: ~/.viminfo !如果你曾经使用过 vim, 那你的家目录应该会存在这个文件才 对。这个文件是自动产生的, 你不必自行建立。而你在 vim 里头所做过的动作,就可以在这个文件 内部查询