vim

增强的vi文本编辑器


语法格式

vim [-bCdDeELmMnNrRTvxXZ] [--] [files]
vim [-h|--help] [--version]
vi
ex
view

命令简介

vim是一个文本编辑器,完全兼容传统的vi编辑器。可用于编辑任何类型的文本文件,尤其是编辑程序。

其中,files是欲编辑或创建的一个或多个文件名,其中第一个文件将成为当前文件,并立即读入缓冲区。进入vim编辑器之后,光标将定位在缓冲区第一行的第一个字符位置。在编辑过程中,可以使用“:next”或缩写的“:n”命令编辑下一个文件(以命令行文件参数的顺序为准)。如果未指定文件名参数,直接进入vim编辑器,从一个空文件(缓冲区)开始编辑。如果指定的文件名为“-”,则编辑的文件来自标准输入,编辑命令来自标准错误输出(重定向到一个tty设备)。

在vi的基础上,vim提供大量的增强功能,如多级撤销功能、多窗口与缓冲区、语法高亮显示、命令行编辑、文件名补缺、联机帮助、可视化选择等。在vim中,利用“:help syntax.txt”等类似的命令,可以查阅所有的vim文档;利用“:help vi_diff.txt”,可以查阅vim与vi差别的汇总与说明。

在运行vim期间,输入“:help”命令可以从联机帮助系统中获取大量的帮助信息。输入“:help subject”命令可以获取特定主题的说明信息。例如,输入“:help ZZ”可以获得ZZ命令的说明信息。此外,使用制表键可以补齐不完整的主题。例如,输入“:help vi_”命令后按下制表键即可自动补缺,“:help vi_diff.txt”。

利用/usr/share/vim/vimrc文件,可以定义系统范围的初始化设置,定制vim编辑器。利用“~/.vimrc”文件,可以定制每个用户自己的初始化设置。

vim分为命令和输入两种工作模式。任何时刻,vim编辑器总是处于命令和输入两种工作模式之一。当启动vim编辑器、打开或创建一个文件时,vim即处于命令模式。通过发布vim命令,可使vim处于输入模式。在输入模式下,可以输入数据,编写文档或源程序。在命令模式下,可以输入vim命令,执行特定的vim编辑功能。命令模式是vim的默认工作模式。通过使用vim命令和Esc键,可以在两种工作模式之间相互转换。

第一次使用vim打开文件时,vim总是处于命令模式。在能够输入任何文本之前,首先必须输入vim的数据输入命令。例如,输入“i”字符命令,即可在当前光标所处字符位置之前插入数据。输入“a”字符命令,即可在当前光标所处字符位置之后附加数据。

无论何时需要返回命令模式,只需按下Esc键即可。如果不能确定vim当前处于何种工作模式,只要按下Esc键,即可确保vim总是处于命令模式,然后再决定下一步怎么做。如果在vim处于命令模式时按下Esc键,或按下其他不合法的键时,终端会发出鸣叫或发生屏幕闪烁现象,但不会影响正在编辑的文件。

在输入数据的过程中,可以利用退格键进行简单的校正(在按下Enter键之前)。在整个输入过程结束之后,按下Esc键,即可返回命令模式。此时,光标将处于刚才输入的最后一个字符位置。然后,还可以利用各种vim命令校正输入的数据。

在命令模式下,可以输入各种vim命令,以便完成各种编辑功能。vim命令几乎都是由一个字符、两个字符或一个选用的数字加字符组成的。通常,字母相同但大小写不同的字符命令的意义相同,但作用完全不同。例如,字符命令“a”意味着在当前光标位置之后附加数据,而“A”则意味着在当前光标所在行的行尾附加数据。

大多数vim命令不需要按Enter键即可立即执行。但是,以冒号“:”引入的命令需要在输入命令之后再按Enter键。在命令模式下输入冒号时,冒号将会出现在编辑窗口底部最后一行的左下角,然后即可接着输入编辑命令,如检索字符串、替换字符串等。

以冒号开始的命令实际上是ex命令ex与vim命令是同一编辑程序的两个不同的用户界面,vim提供面向屏幕的用户界面,而ex则提供面向命令行的用户界面。所有的ex命令均可在vim中使用。在输入冒号之后,实际上已经切换到面向命令行的ex用户界面。这种切换方式使用户能够在不离开vim的情况下执行许多文件编辑命令,甚至也可以执行其他Shell命令。

vim、ex、view和vi等是同一系列的程序文件,根据运行命令时使用的名字,vim程序文件具有不同的功能。

vim  常规的运行方式,所有的处理均采用默认设置。

ex  以ex模式运行vim(使用“-e”选项运行vim也可以进入ex模式)。此时,输入“:vi”命令后即可进入常规的vim模式。

view  以只读模式运行vim(等同于使用“-R”选项运行vim)。

命令选项

+[num]  将光标定位在当前文件的指定行num的第一个非空白字符位置。如果省略了num,光标将定位在文件最后一行的第一个字符位置。

+/pat  将光标定位在当前文件第一个匹配指定模式pat的行首位置。

-c cmd, +cmd  指定的命令是ex命令,在读入第一个文件之后开始执行。如果命令包含空格,前后需加双引号。例如,“vim "+set nu" main.c”。注意,最多可以利用“+”或“-c”选项提供10个命令。

--cmd cmd  类似于“-c”选项,但指定的命令必须在处理任何vimrc文件之前执行。注意,最多可以利用“-cmd”选项提供10个命令。

-b  二进制模式。设置部分选项,使得vim能够编辑二进制或可执行的目标文件。

-C  兼容模式。这将使vim更像vi,即使.vimrc文件存在。

-d  启动文件比较模式。指定的文件至少应为2、3或4个文件。vim将会打开指定的所有文件,展示文件之间的差别。其功能类似于直接运行vimdiff命令。

-D  调试模式。执行脚本中的第一个命令之后立即进入调试模式。

-e  启动vim,进入ex运行模式,类似于直接运行ex命令。

-E  启动vim,进入增强的ex运行模式。

-i viminfo  使用指定的文件替代默认的“~/.viminfo”文件。使用关键字NONE作为文件名,可以跳过读写“~/.viminfo”文件的步骤。

-m  禁止修改文件。清除“write”选项,从而禁止写文件。实际上,用户仍然能够编辑缓冲区中的文件内容,但不能写文件(而且也不能写到其他指定的文件中)。注意,可以使用ex命令“:set write”启用上述选项。

-M  类似于“-m”选项,禁止修改文件,清除“write”选项与“modifiable”选项,因而不能写文件,也不能编辑缓冲区中的文件内容。注意,可以使用ex命令“:set write”和“:set modifiable”分别启用上述两个选项。

-n  禁止使用“.swp”文件。即禁止恢复先前中断编辑的文件。

-N  采用非兼容的增强模式。清除“compatible”选项。这将使得vim的功能更强,但与vi的兼容性较差,即使“.vimrc”文件不存在。

-o [n]  打开n个横向的窗口。如果省略了n,针对每个文件名参数打开一个窗口。

-O [n]  打开n个纵向的窗口。如果省略了n,针对每个文件名参数打开一个窗口。

-p [n]  打开n个标签标识的页面。如果省略了n,针对每个文件名参数,打开一个标签页面。

-r, -L  显示编辑过程因故中断,缓冲区中尚未保存的文件内容(.swp文件)。用户可以根据显示的文件信息,使用“-r file”选项恢复系统保存的文件。

-r file  恢复模式。利用系统保存的“.swp”文件,可以恢复先前因故中断编辑的文件。“.swp”文件与先前中断编辑的文件名字相同,只是增加了一个“.swp”后缀。参见“:help recovery”命令。

-R  只读模式。设置“readonly”选项。此时只能编辑缓冲区中的文件内容,但不能写文件,以防覆盖文件。如果确实需要写文件,可以使用加感叹号的ex命令,如“:w!”。“-R”选项蕴含着同时指定了“-n”选项。此外,使用“:set noro”命令也可以清除“readonly”选项。参见“:help readonly”命令的说明。

-s script  读取指定的脚本文件script。文件中的字符按交互方式用户输入的字符解释。利用“-w”或“-W”选项保存的脚本可以编辑相同的文件。如果在退出vim之前已经读到脚本文件中的结尾,再从键盘开始读取命令、输入数据或编辑文件。注意,也可以在编辑文件期间使用“:source! script”命令执行脚本文件。

-T terminal  指定当前使用的终端名。仅当TERM环境变量定义的终端无法正常工作时才需要用到这个选项。指定的终端名必须是合法的termcap或terminfo定义的终端名。

-u vimrc  使用指定文件vimrc中的命令初始化vim,跳过其他任何初始化步骤。使用这个选项可以编辑特殊类型的文件。此外,使用关键字NONE作为文件名,也可以跳过所有的初始化步骤。使用“:help initialization”命令可以获取更详细的说明信息。

-V [n]  详细显示模式。显示vim的启动过程,读取的初始化文件,读写的viminfo文件,以及加载的插件等。选用的数字参数n是显示的详细程度,默认值是10。

-v  启动vim,进入vi运行模式,类似于直接运行vi命令。仅当运行ex命令时选用这个选项才有作用。

-w script  在编辑期间,输入的所有字符(包括命令与输入数据)将会记录在指定的文件script中,直至退出vim编辑器。如果想要创建一个脚本文件,以便在“vim -s”或“:source!”命令的情况下使用,这个选项是非常有用的。如果文件script存在,记录的内容将会追加到文件后面。

-W script  类似于“-w”选项,但会覆盖现有的文件script(如果文件已存在)。

-x  以加密形式保存写到文件中的数据。编辑和读取加密文件时需要提供密码。

-Z  限制的模式。类似于直接运行rvim或rvi命令。

--  标志选项的结束。之后的参数均作为文件名处理。主要用于编辑文件名首字符为连字符“-”的文件。

--noplugin  跳过加载插件的步骤。相当于指定了“-u NONE”选项。

-h, --help  显示命令的用法与选项说明等帮助信息,然后退出。

--version  显示命令的版本等帮助信息,然后退出。

编辑命令

在下述编辑命令的说明中,CR表示回车键。ESC用于结束输入模式,返回命令模式(如itextESC)。也可用于取消不完整的命令。作为一个前缀,大部分编辑命令在输入前均可输入一个数字,表示重复的次数,如字符数(如x命令等)、行数(如dd命令等)或滚动窗口数量(如Ctrl-D或Ctrl-U命令等)等。

文件操作

ZZ  如果文件已经修改,写入文件后退出,否则仅仅退出编辑器。

ZZ  退出编辑器,保存先前的修改与处理结果。

:wCR  把编辑缓冲区中的修改内容写入当前文件。

:w!CR  如果先前的访问权限不允许(如只读文件),强行写入当前的文件。

:qCR  退出编辑器。

:q!CR  强行退出编辑器,放弃先前所做的任何修改。

:e nameCR  编辑指定的文件。

:e!CR  重新编辑,放弃先前所做的任何修改。

:e + nameCR  从指定文件的结尾(最后一屏)开始编辑。

:e +nCR  从指定的行开始编辑当前文件。

:e #CR  在当前编辑的两个文件间来回切换。

:e! #CR  在当前编辑的两个文件间来回切换,并放弃先前所做的任何修改。

:w nameCR  把编辑器当前缓冲区中的内容写入指定的文件。

:w! nameCR  把编辑器当前缓冲区中的内容强制写入指定的文件。

:shCR  进入当前的Shell,直至退出后返回编辑器。

:!cmdCR  在Shell中运行指定的命令,然后返回编辑器。

:nCR  编辑命令行文件参数表中的下一个文件。

:n argsCR  指定新的命令行文件参数表。

^G  显示当前文件的名字与行号。

文件定位

^F, Pg Dn  向前(文件结尾方向)滚动一屏。

^B, Pg Up  向后(文件开始方向)滚动一屏。

^D  向前滚动半屏。

^U  向后滚动半屏。

[n]G  跳至指定行号的数据行行首(省略行号n时直接跳至文件结尾)。

/pat  检索并跳至下一个匹配指定模式的数据行。

?pat  检索并跳至前一个匹配指定模式的数据行。

n  重复执行最近一个“/”或“?”检索命令。

N  反向重复执行最近一个“/”或“?”检索命令。

/pat/+n  转入匹配指定模式的数据行之后的第n行。

?pat?-n  转入匹配指定模式的数据行之前的第n行。

]]  将光标移至下一节或下一个函数。

[[  将光标移至上一节或上一个函数。

(  将光标移至前一个句子的起始字符位置。

)  将光标移至下一个句子的起始字符位置。

{  将光标移至当前段落之前。

}  将光标移至当前段落之后。

%  将光标定位至匹配的圆括号、方括号或花括号。

屏幕调整

^L  清除并刷新终端窗口。

^R  清除并刷新终端窗口(如果Ctrl-L是右箭头键“→”)。

zCR  以当前数据行作为第一行,刷新终端窗口。

z-  以当前数据行作为最后一行,刷新终端窗口。

z.  以当前数据行作为中间一行,刷新终端窗口。

/pat/z-CR  把匹配指定模式的文本行作为最后一行,滚动终端窗口。

^E  终端窗口内容前滚一行。

^Y  终端窗口内容后滚一行。

标记与返回

``  把光标移至先前的上下文环境。

''  两个单引号。把光标移至先前上下文环境中当前行的第一个非空白字符位置。

mx  使用小写字母标记当前的光标位置。

`x  把光标移至使用x标记的位置。

'x  把光标移至x标记位置的当前行的第一个非空白字符位置。

行定位

H  光标跳至终端窗口第一行行首的第一个非空白字符位置。

L  光标跳至终端窗口最后一行行首的第一个非空白字符位置。

M  光标跳至终端窗口中间一行行首的第一个非空白字符位置。

+, CR  光标移至下一行行首的第一个非空白字符位置。

-  光标移至上一行行首的第一个非空白字符位置。

↓, j  光标移至下一行的同一字符位置。

↑, k  光标移至上一行的同一字符位置。

字符定位

^  光标跳至同一行行首的第一个非空白字符位置。

0  光标跳至同一行的行首。

$  光标跳至同一行的行尾。

←, l  光标左移一个字符位置。

→, h  光标右移一个字符位置。

^H  光标左移一个字符位置(命令模式)。

空格  光标右移一个字符位置(命令模式)。

fx  光标移至下一个字符x

Fx  光标移至前一个字符x

tx  光标移至下一个字符x 之前的位置。

Tx  光标移至前一个字符x 之后的位置。

;  重复执行最近一个f、F、t或T命令。

,  反向重复执行最近一个f、F、t或T命令。

n |  把光标移至第n列。

%  将光标定位至匹配的圆括号、方括号或花括号。

字、句与段落

[n]w  把光标移至下一个或后数第n个字(由字母、数字和下画线组成的字符串)的字首。

[n]W  把光标移至下一个或后数第n个由空格分隔的字的字首。

[n]b  把光标移至前一个或前数第n个字(由字母、数字和下画线组成的字符串)的字首。

[n]B  把光标移至当前、前一个或后数第n个由空格分隔的字的字首。

[n]e  把光标移至当前、下一个或后数第n个字(由字母、数字和下画线组成的字符串)的字尾。

[n]E  把光标移至当前、下一个或后数第n个由空格分隔的字的字尾。

)  把光标移至下一个句子的句首。

(  把光标移至前一个句子的句首。

}  把光标移至当前段落之后(下一个段落之前)。

{  把光标移至当前段落之前(上一个段落之后)。

插入期间校正

^H, 退格符  删除光标位置的前一个字符。

^W  删除光标位置的前一个字。

ESC  结束数据输入模式,返回命令模式。

DEL  删除光标位置的字符。

^V  引入不可打印的字符,包括控制字符。

输入数据

a  在光标位置之后附加输入数据,直至按下Esc键。

A  在行尾附加输入数据,直至按下Esc键。

i  在光标位置之前插入输入数据,直至按下Esc键。

I  在行首或数据行第一个非空白字符之前插入输入数据,直至按下Esc键。

o  从光标位置下一行开始插入数据行,直至按下Esc键。

O  从光标位置前一行开始插入数据行,直至按下Esc键。

rx  使用字符x替换光标位置的字符。

RtextESC  使用输入的数据text替换从光标位置开始的字符。

!CRcmdCR  执行Shell命令,把命令的输出插入光标位置。

修改、删除与替换

cc  替换当前数据行,直至按下Esc键。

cl  替换光标位置的字符,直至按下Esc键。

cw  替换从光标位置开始的字,直至按下Esc键。

c$  修改当前行光标位置之后的剩余数据部分。

C  修改当前行光标位置之后的剩余数据部分(相当于“c$”命令)。

[n]dw  删除从光标位置开始的1个或n个字,包括随后的空白字符,直至下一个字首止。

D  删除当前行光标位置之后的剩余数据部分(相当于“d$”命令)。

rx  使用指定的单个字符替换光标位置的字符。

RtextESC  使用输入的数据text覆盖从光标位置开始的任何内容,直至按下Esc键。

s  替换光标位置的字符,直至按下Esc键(相当于“cl”命令)。

S  替换当前数据行,直至按下Esc键(相当于“cc”命令)。

J  把后续行合并到当前行。

:[#] r file  把指定的文件读入当前行或指定的行之后。

[n]x  删除光标位置的一个字符或光标位置开始的n个字符。

[n]X  删除光标位置之前的一个或n个字符。

~  把光标位置的字母替换为相应的大写字母或小写字母。

剪切、复制与粘贴

[n]dd  删除当前行或从当前行开始的n行数据(暂存于缓冲区)。

[n]yy  把当前行或从当前行开始的n行数据复制到缓冲区。

[n]Y  同上。

[n]yl  把光标位置的字符或从光标位置开始的n个字符复制到缓冲区。

p  把先前删除或复制到缓冲区的数据行附加到当前行之后。

P  把先前删除或复制到缓冲区的数据行附加到当前行之前。

撤销、恢复与重复执行

u  撤销最近一次的修改。连续输入多个u命令,可以回溯,逐步撤销先前的修改。

U  恢复当前数据行的原貌。

.  重复执行最近一次的修改命令。

"np  取回最近第n次删除的数据,插入当前行之后。

位置调整命令

<CR, <<  当前数据行整体左移一个制表符位置。

>CR, >>  当前数据行整体右移一个制表符位置。

部分ex命令

:#1, #2 co #3  把第#1行~第#2行数据复制到第#3行之后。

:#1, #2 m #3  把第#1行~第#2行数据移至第#3行之后。

:#1, #2 d  删除第#1行至第#2行的所有数据行。

:#1, #2 s/old/new/[g][c]  检索第#1行~第#2行之间数据,使用字符串new替换所有的old

:/old/s//new/[g][c]  从当前行开始检索,使用字符串new替换第一个出现或所有的old

:set  显示已修改的选项。

:set opt  启用指定的选项。

:set noopt  禁用指定的选项。

:set all  显示vim支持的所有选项及其设置。

:set opt=val  把指定的值赋予指定的选项。


索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z