1. 创建和编辑


1.1 启动vim

使用vim命令可以启动vim,如下所示:

[Linux] vim编辑器_Linux

该命令可以实现文件test.txt的编辑和创建,vim的界面如下:

[Linux] vim编辑器_vim编辑器_02

屏幕左端的代字符"~"表明文件的空行,当用户向空行添加文本行时,代字符就会消失。


1.2 命令模式和输入模式

vim有两个模式:命令模式和输入模式。当vim处于命令模式,可输入vim命令,如删除、退出。可以通过输入命令将vim切换到输入模式,在输入模式中,vim将接受用户输入的任何文本信息,直到按下ESCAPE键,vim将返回到命令模式。

默认情况下,vim会显示其所处的模式,例如,当vim处于插入模式时,屏幕左下角将显示:-- 插入--(-- INSERT --)。

在命令模式下使用冒号":"将vim切换到尾行模式。在这种模式下,光标将始终处于屏幕底部。当输入完命令按RETURN键后,vim才将光标恢复到原来在文本中的位置。例如输入": set number",将显示行号。注意vim中是区分大小写的。

[Linux] vim编辑器_Linux_03


1.3 输入文本

启动vim之后,在输入文本之前,必须通过按下i键(在光标前插入)或者a键(在光标后追加)将vim切入到输入模式。如果不能确定vim当前是否处于输入模式,那么可以按下ESCAPE键将使得vim进入命令模式,然后再按入i或a键进入输入模式。

在vim输入模式下,那些校正shell命令行的回退键具有同样的功能,这些键包括字符删除键(CONTROL+H),行删除键(CONTROL+U) 和字删除键(CONTROL+W)。有时删除字符后,vim在屏幕上仍显示这些文本,只要光标经过或按下RETURN时,就会发现实际已将它们删除。


1.4 结束会话

在编辑过程中,vim将编辑的文本放置在工作缓冲区中,当结束编辑时,必须将工作缓冲区的内容写到磁盘,才能将对文本的修改保存起来,以便下次使用。

在vim处于命令模式下,输入命令ZZ即可将新写入的内容保存,并且结束会话,返回到shell控制。如果不想保存,那么用户可以在尾行模式下使用命令"q!"退出。


2. vim特性


2.1 联机帮助

使用vim时可以查看帮助信息,在尾行模式下输入命令"help feature"将获得feature的相关信息。当滚动浏览时,会看到用两条竖线括起来的单词,如|tutor|,这些都是活动链接,将光标移到活动链接上,按下CONTROL+]即可跳到对应的链接文本,使用CONTROL+o可返回帮助文本。


2.2 操作模式

vim编辑器是ex编辑器的一部分,共有5个操作模式:

1) ex命令模式。

2) ex输入模式。

3) vim命令模式。

4) vim输入模式。

5) vim尾行模式。

在命令模式下,vim将输入的字符作为命令对待,并对每个命令做出回应,但不显示这些字符。在输入模式下,vim将输入字符作为文本放置在正编辑的文本中。尾行模式输入的命令将在最后一行显示。尾行模式和命令模式的还有一点区别在于,命令模式结束命令不必按下RETURN键,而尾行模式必须在结束命令时按下RETURN键。通常情况下,不使用ex模式。


2.3 显示

vim编辑器在显示区域的底部行显示状态信息,这些信息包括:错误消息、删除和添加的文本块信息、文件状态信息。此外,vim在状态行还将显示尾行模式下的命令。

有时屏幕会被扭曲或重写,有时程序的输出会与工作缓冲区的内容混在一起,如果出现这种情况,可以按下ESCAPE键将vim切换到命令模式,再按下CONTROL+L来重绘屏幕。

当屏幕显示到文件末尾时,vim将在文件最后一行的下一行的最左端显示一个代字符"~"。当开始编辑一个新的文件时,vim使用该符号标识每一行的开始。


2.4 工作缓冲区

vim在工作缓冲区中进行所有工作。启动编辑会话时,vim将要编辑的文件从磁盘读入工作缓冲区。在会话过程中,vim将所做的修改保存在缓冲区,直到将工作缓冲区内容写回到磁盘。如果只想使用vim浏览文件而不修改文件,可以使用工具view,如下所示:

[Linux] vim编辑器_Linux_04


2.5 窗口

vim允许打开、关闭和隐藏多个窗口,用于编辑不同的文件。多数窗口命令由CONTROL+W后跟某字母组成。如"CONTROL+W s"打开另一个窗口来编辑同一个文件,"CONTROL+W n"打开一个窗口编辑一个空文件,"CONTROL+W w"将光标在窗口间移动,"CONTROL+W q"退出窗口,如下所示:

[Linux] vim编辑器_Linux_05


2.6 锁定文件

当编辑一个已有文件时,vim将显示该文件的前面部分内容,在状态行给出文件的状态信息,并将文件锁定,如果使用vim打开一个已经锁定的文件,那么vim将显示提示消息,如下所示:

[Linux] vim编辑器_Linux_06


2.7 非正常结束

可以采用两种方式结束编辑会话:保存编辑会话过程中所做的修改或放弃编辑会话中所做修改。在命令模式下,使用ZZ或":wq"可以将所做修改保存后退出。如果不想保存,可以使用":q!"命令。

有时会遇到不能从vim中退出,如当调用vim时忘记指定文件名,使用ZZ命令会看到"No file name"的信息,输入命令":w filename"可以将内容写入到filename。

在写命令结束后,可使用":q"退出,此时不必使用" ! ",它仅适用于自上次将工作缓冲区内容写回磁盘又做了修改的怀脱 。


2.8 文本恢复

vim会将操作的交换文件临时存储起来。当使用vim编辑文件时,如果系统崩溃,可以使用这些交换文件恢复。可以使用"vim -r"检查是否存在交换文件,如下所示:

[Linux] vim编辑器_vim编辑器_07


3. 命令模式下移动光标


3.1 按字符移动

空格键、l键和方向键中的右移键都可以将光标往右移动,每次移动一个字符。"7SPACE"或"7l"可以将光标移动7个字符。这些键不能将光标从当前行的末尾移动到下一行的开始。h键和方向键中的左移键与l键相似,只是方向是向左移动。


3.2 移到特定字符

使用查找命令f/F可以将光标从当前行的某个指定字符移到该字符下一次出现的位置。比如"fa"可以将光标移动到下一个a出现的位置,而"Fa"可以将光标移动到a上一次出现的位置。


3.3 按字移动光标

w键将把光标向前移到下一个字的第1个字母。标点符号也被看作一个字。如果下一字位于下一行,那么该命令可以将光标移到下一行。命令"15w"将把光标移到后面第15个字的首字母处。W与w类似,只是W键按照空白分隔字来移动光标。

b键将光标向后移到前一个字的开始字母,B键按照空白分隔字向后移动光标。类似的,e键将光标移到下一个字的末尾字符,E键将把光标移到下一个空白分隔字的末尾。


3.4 按行移动光标

RETURN键可以将光标移到下一行的开始处,j键和方向键的向下键将把光标移到当前字符正下方的字符处。如果当前字符下面没有字符,那么光标将移到下一行末尾。k键和方向键中的向上键与j键相似,只是方向相反,减号" - "键与RETURN键类似只是方向相反。


3.5 按句子和段落移动

)和}可分别将光标向前移动到下一个句子的开始和下一个段落的开始,而(和{可分别将光标向后移到前一个句子的开始和前一个段落的开始。


3.6 在屏幕内移动

H键将光标定位到屏幕顶部一行的最左端。M键将光标定位到屏幕的中间一行。L键将光标定位到屏幕的底部一行。


3.7 浏览不同部分

按下CONTROL+D组合键可将屏幕向下滚动,显示半屏新文本,CONTROL+U组合键可将屏幕向上滚动,同样显示半屏新文本。在这些命令前加入数字,而在后面会话中,每次使用这两个组合键都会按照该数字指定的行数滚动屏幕。CONTROL+F组合键和CONTROL+B组合键是显示一屏新文本,为了保持连续性,保留前面一屏的两行。

输入数字后跟命令G,vim将把光标定位到工作缓冲区的对应行。GG将把光标移到第一行,$G则是移动到最后一行。


4. 输入模式


4.1 插入文本

i命令使vim进入输入模式,可以在光标所在字符之前插入文本。I命令是在当前行的开始处插入文本。命令i和I有时会覆盖屏幕上的文本,但在工作缓冲区中字符是不会被覆盖的,只是显示受到了影响,按下ESCAPE键进入命令模式,被覆盖的文本会再次显示出来。


4.2 追加文本

命令a与命令i类似,命令a是在当前字符之后追加文本,命令A是在当前行的最后一个字符后追加文本。


4.3 打开行

命令o和O是在当前文本中打开一个空白行,将光标放置在新行的开始处,并使vim进入输入模式。命令O在当前行的上面打开一行,命令o在当前行的下面打开一行。


4.4 文本替换

命令r和R使得新输入文本覆盖已有文本。命令r后跟某个字符将替换掉当前字符,在输入该字符后,不必输入ESCAPE键,vim会自动返回到命令模式。命令R将替换所有后续字符直到按下ESCAPE键退回到vim的命令模式。


4.5 转义特殊字符

在输入模式下,命用转义命令CONTROL+V便可向文本中输入任何字符,比如CONTROL+L、CONTROL+R、CONTROL+W和ESCAPE等。


5. 命令模式下删除和修改


5.1 撤销修改

命令u可以将错误删除或修改的文本恢复。执行一次撤销命令只能撤销上一次对文本的操作。命令U只能对修改的最后一行内容进行恢复,将其恢复到启动个之前的状态,即使期间进行了很多修改。


5.2 删除字符

命令x可以删除当前字符。在命令x前使用重复因子可以删除当前行上从当前字符开始的后续多个字符。命令X删除光标左边的字符。


5.3 删除文本

命令d将文本从工作缓冲区中删除,命令d删除文本的多少取决于其后的重复因子,文本删除后,vim仍处于命令模式。"dd"可以删除一行,在"dd"前加入重复因子可以删除多行。

也可以从当前光标位置删除到同一行上的某个特定字符,如"dt"可以删除到下一个分号,命令D或"d$"可以删除当前行上从光标开始后的内容。


5.4 修改文本

命令c可以将旧文本替换为新文本,其中新文本不一定与旧文本占据相同的空间,如可以将某个单词替换为几个单词。命令C是从光标位置替换到行的末尾。

命令c删除文本的多少取决于重复因子,它可以使vim进入输入模式。当新文本输入完毕时,按下ESCAPE键,旧的文本将被替换。如果删除指定文本后没有输入新内容就按下了ESCAPE键,那么该操作相当于只删除文本。


5.5 替换文本

命令s和S也可以将旧文本替换为新文本。命令s删除光标所在字符,使vim进入输入模式,然后可输入新内容直到按下ESCAPE键。命令S与命令"cc"相同,可以修改当前行。


5.6 修改大小写

代字符"~"可以改变光标所在字符的大小写,可以在代字符前加入数字来说明要修改大小写的字符个数。如果修改到达光标所在行的末尾,那么修改将结束。


6. 查找和替换


6.1 查找字符

命令f可以在当前行查找指定字符,并将光标移到该字符的下一次出现的位置。t和T与查找命令具有相同的使用方式。命令t将光标定位在指定字符下一次出现的前一个字符的位置,命令T将光标定位在指定字符前一次出现的后一个字符的位置。分号";"将重复执行最后一个f、F、t或者T命令。

查找命令可以与其他命令合并到一起使用,例如"d2fq"可以删除当前行在光标后第2次出现的字母表。

6.2 查找字符串

vim编辑器可以在整个工作缓冲区中查找与正则表达式匹配的文本或字符串。斜杠"/"后跟要查找的文本,按下RETURN键便开始搜索(向前搜索)字符串下一次出现的位置。vim将在状态行显示输入的斜杠和要查找的字符串。如果用问号"?"代替斜杠,那么vim将查找字符串的前一次出现的位置。

键N和n在不必再输入搜索字符串的情况下,将重复上一次搜索,键n的搜索与上一次的搜索完全相同,而键N则以相反的方向重复上一次的搜索。

当脱字符"^"作为搜索字符串的第1个字符时,vim将每行的开始字符串与搜索字符串匹配。如命令"/^go"是向下搜索以"go"开始的行,而美元符"$"作为搜索字符串的最后1个字符时则是与行的结束匹配。

句点"."可以与任何字符匹配,它可以出现在搜索字符串的任意位置。"*"则是与某个字符的0次或多次出现相匹配。

"\>"与字的末尾匹配,如命令"/d\>"查找下一个以d结尾的字,这里的\不是用来转义的。类似的是,"\<"与字的开始匹配,如命令"/\<d"查找下一个以d开始的字。

方括号将两个或者多个字符括起来与括号内的单个字符匹配。例如命令"/ca[td]"匹配"cat"或"cat"。在定义字符类中,脱字符"^"和连字符"-"分别表示排开和范围。


6.3 字符串的替换

替换命令首先查找某个字符串,当找到匹配的字符串时,替换命令就来修改该字符串,语法格式如下:

:[g][address]s/search-string/replacement-string[/option]

vim是在尾行模式下执行替换命令的。

如果堆垛换命令中不指明address,那么替换命令将权搜索当前行,如果使用某个行号作为address,那么替换命令将搜索对应行。如果address是以逗号隔开的两个行号,那么,替换命令将搜索这两行和它们之间的行。也可以使用斜杠括起来的字符串作为address,vim将对包含地址字符串的下一行进行查找和替换。如果在地址字符串之前带上字母g,那么vim将对包含地址字符串的所有行进行查找和替换。address中的句点代表当前行,美元符号代表工作缓冲区中的最后一行,百分号代表整个工作缓冲区。

在替换命令的语法格式中,address后的s表明命令是一个替换命令。s后的分隔符标志着search-string的开始。replace-string用来替换匹配的search-string,它的后面应该跟一个分隔符,如果后面没有跟选项,该分隔符可以省略。search-string和replace-string中同样可以包含查找模式下的特殊字符。

通常情况下,替换命令只替换第1次出现的与search-string相匹配的字符串,如果要进行全局替换,可以在replace-string的末尾分隔符之后追加g选项。vim的选项c用来询问是否修改每个匹配的字符串,按下y键将执行替换,按下q键则终止命令,按下l键进行替换并退出,按下a键将所有剩余的匹配字符串替换,按下n键则不进行替换继续搜索。


7. 其他命令


7.1 连接命令

命令J当前行的末尾与下一行连接起来,在两行之间插入一个空格,并将光标定位到空格,如果当前行以句点结束,那么,vim将插入两个空格。


7.2 状态命令

状态命令CONTROL+G将显示在正在编辑中的文件的名字和相关信息,其中包括:文件修改时间、文件在工作缓冲区中的总行数、当前行之前部分占整个工作缓冲区内容的百分比、当前行的行号和当前光标所指向的字符的位置。


7.3 句点

命令" . "将重复执行最近一次的修改命令。如"dw"、"cw"等。


7.4 复制文本

命令y与d类似,只是它将文本复制到通用缓冲区。vim编辑器具有一个通用缓冲区和26个命令缓冲区。当使用p命令时,将把文本复制到工作缓冲区的另一位置。命令Y将把整行移出到通用缓冲区。

命令P将把这些内容插入到通用缓冲区光标所在行之前,命令p则是插入到光标所在行之后。P或p命令并不改变通用缓冲区的内容,因此,可以多次使用。使用d命令删除的文本也放置在通用缓冲区之中,这样就可以从缓冲区中恢复删除的内容。


8. 参数设置


8.1 设置参数

当使用vim时要设置参数,可办理入命令":set parameter_name",其中parameter_name为参数名。按下RETURN键即可执行命令。


8.2 初始化文件中设置参数

如果用户使用的是bash,那么可以在用户的初始化文件"~/.bash_profile"中输入如下格式的语句:

export VIMINIT='set param1 param2...'

VIMINIT是vim要读的shell变量。


8.3 参数

下表列出了vim中有用的参数。

参数列表
参数名
描述
magic允许搜索特殊字符串。
autoindent, ai自动缩进。
autowrite, aw自动写回。
flash, fl闪烁。
ignorecase, ic忽略大小写搜索。
incsearch, ic增量搜索。
list不可见字符。
laststatus=n, ls=n状态行。
number, nu行号。
wrap换号。
wrapmargin=nn, wm=nn右页边距。
report=nn信息报告。
scroll=nn, scr=nn滚动。
shell=path, sh=path设置shell路径。
shiftwidth=nn, sw=nn移距。
showmatch, sm显示括号的匹配。
showmode, smd显示模式。
compatible, cp与vi兼容。
wrapscan, ws循环扫描。