参考地址:http://c.biancheng.net/view/519.html

命令汇总

三种模式及切换 文本删除(命令模式)
命令行模式 任何模式下按 Esc进入 nx / nX 删除光标右/左侧n个字符
文本输入模式 命令模式下按 i\a\o\c\r进入 dw / ndw 删除一/n个单词
末行模式 命令模式下按 :进入 dd / ndd 删除光标所在的整行/共n行
打开文件 D / d$ 删除光标到行尾内容
vi test.c 打开test.c文件 d0 删除光标到行首内容
vi +5 test.c 打开光标跳转第5行 d( / d) 删除光标到上/下一句开始内容
vi + test.c 光标跳转末尾 d{ / d} 删除光标到上/下一段开始内容
vi +/main test.c 查找跳转第一个main位置 d 删除包括当前行在内的两行(CR回车)
vi *.c 打开所有.c结尾的文件 文本复制(命令模式)
文本修改(进入编辑模式) yw / nyw 复制一/n个单词
i 光标位置插入文本 yy / nyy 复制光标所在的整行/共n行
I 行首插入文本 Y / y$ 复制光标到行尾内容
a 光标位置后插入文本 y0 复制光标到行首内容
A 行尾插入文本 y( / y) 复制光标到上/下一句开始内容
o 下一行行首插入文本 y{ / y} 复制光标到上/下一段开始内容
O 上一行行首插入文本 y 复制包括当前行在内的两行(CR回车)
字符替换 p 粘贴缓冲区命令
r / nr 替换1/n个字符 v / V 选择文本 按光标/按行选择
R 替换模式 撤销命令(命令模式)
光标移动 u 撤销上一步操作 可多次使用
h / l 左/右移动一个字符 U 撤销当前行操作,再次使用撤销撤销
k / j 上/下移动一行 字符检索替换
H / nH 移动到当前屏幕第1/n行 /string 光标后寻找string
M 移动到屏幕中间行 ?string 光标前寻找string
L / nL 移动到屏幕最后1/n行 n / N 重复上一个检索命令/方向改变
G / nG 全文移动 / n行行首 g/string 遇到第一个检索停止
w / W 右移至下个字字首 窗口切换
e /E 光标移到本字字尾 Ctrl+w,然后 j / k 移动光标到下 / 上面的一个窗口
b / B 光标移至本字字首 Ctrl+w,然后 q 关闭当前窗口
{ / } 光标移至上/下一个段落 Ctrl+w,然后 w 移动光标到另一个窗口
屏幕滚动 属性设置
Ctrl+u 将屏幕向前翻滚半屏 :set nu (nonu) 显示/关闭行号
Ctrl+d 将屏幕向后翻滚半屏 :set autoindent 程序语法自动缩进
Ctrl+f 文件尾方向翻滚一整屏 :syntax on (off) 程序语法高亮/不高亮显示
Ctrl+b 文件首方向翻滚一整屏 :set ignorecase(noignorecase) 忽略/区分大小写

一、三种模式及切换

1) 命令行模式

该模式是进入 vi 编辑器后的默认模式。任何时候,不管用户处于何种模式,按下Esc键即可进入命令模式。

在命令模式下,用户可以输入 vi 命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释。若输入的字符是合法的 vi 命令,则 vi 在接受用户命令之后完成相应的动作。

但需注意的是,所输入的命令并不回显在屏幕上。若输入的字符不是 vi 的合法命令,vi 会响铃报警。

2) 文本输入模式

在命令模式下输入插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。

在该模式下,用户输入的任何字符都被 vi 当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按下Esc键即可。

3) 末行模式

末行模式也称 ex 转义模式。

在命令模式下,用户按:键即可进入末行模式下,此时 vi 会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个:作为末行模式的说明符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。

末行命令执行完后,vi 自动回到命令模式。

vi 工作模式之间的切换

如果要从命令模式转换到编辑模式,可以输入命令a或者i

如果需要从文本模式返回,则按下Esc键即可。

在命令模式下输入:即可切换到末行模式,然后输入命令。

vi 编辑器的 3 种模式的转换如下图所示。

【VIM】基础 - 图1
图:vi 三种工作模式的切换

二、VI打开文件

打开一个 shell 终端,在说明符后输入 vi和 想要编辑(或建立)的文件名,便可进入 vi 编辑器,其格式如下:
vi filename

进入 vi 编辑器编辑一个名为 test.c 的文件。
$ vi test.c

如果希望在进入 vi 后,光标处于文件中特定的某行上,可在 vi 命令上加上行号和文件名,其格式如下:
vi +行号 文件名
打开一个文件并进行定位,在 shell 终端中输入打开 vi 编辑器的命令如下:
$ vi +5 test.c
如果希望在进入 vi 之后光标处于文件最末行,则只需去掉命令中+后面的数字 n 即可,如下所示。
$ vi + test.c
这时光标会停留在最后一行的}字符。

vi 编辑器支持模式匹配,也就是说用户可以在命令中指定一个模式串。之后进入 vi 后,光标就处于文件中第一个与指定模式串相匹配的那行上。其格式如下:
vi +/模式字符串 文件名
查找 test.c 中的 main() 函数,并对其进行以下编辑:
$ vi +/main test.c

如果需要取消高亮显示,可以在末行模式下使用以下命令:
:set nohlsearch

使用 vi 可以同时编辑多个文件,只要在进入 vi 的命令中写入所要操作的文件即可,还可以使用通配符,其格式如下:
vi 需要打开文件的通配符
如果需要打开当前目录下所有的C语言源文件,则可以使用以下命令:
$ vi *.c

打开该程序中的所有源文件,并且将显示位置定位在 main() 函数上。
$vi +/main .c .h

三、文本修改命令

在命令行模式下,输入如下命令可进入文本编辑模式

  • i : 将文本插入到光标所在位置前
  • I : 将文本插入当前行首行
  • a : 将文本插入光标所在位置后
  • A : 将文本插入到当前行行尾
  • o : 将在光标所在行的下面插入一个空行,并将光标置于该行的行首
  • O : 命令在光标所在行的上面插入一个空行,并将光标置于该行的行首。

    四、文本删除命令

    表1:命令模式下常用的文本删除命令
文本删除命令 命令的意义 文本删除命令 命令的意义
x 删除光标处的字符 d( 删除到上一句开始的所有字符
X 删除光标前面的字符 d) 删除到下一句开始的所有字符
dd 删除光标所在的整行 d{ 删除到上一段开始的所有字符
D 或 d$ 删除从光标所在处开始到行尾 的内容 d} 删除到下一段开始的所有字符
d0 删除从光标前一个字符开始到 行首的内容 d 删除包括当前行在内的两行字符
dw 删除一个单词

删除文本的命令可以分为删除单个字符和删除多个字符两类。其中,删除单个字符的命令包括下面两种情况。

  • x 命令:删除光标处的字符。若在 x 之前加上一个数字 n,则删除从光标所在位置开始向右的 n 个字符。
  • X 命令:删除光标前面的字符。若在 X 之前加上一个数字 n,则删除从光标前面那个字符开始向左的 n 个字符。

删除多个字符的命令包括下面几种情况。

  • dd 命令:该命令删除光标所在的整行。在 dd 前可加上一个数字 n,表示删除当前行及其后 n-1 行的内容。
  • D 命令或 d$ 命令:两个命令功能一样,都是删除从光标所在处开始到行尾的内容。
  • d0 命令:该命令删除从光标前一个字符开始到行首的内容。
  • dw 命令:该命令删除一个单词。若光标处在某个词的中间,则从光标所在位置开始删至词尾。同 dd 命令一样,可在 dw 之前加一个数字n,表示删除 n 个指定的单词。
  • d( 命令:该命令删除到上一句开始的所有字符。
  • d) 命令:该命令删除到下一句开始的所有字符。
  • d} 命令:该命令删除到下一段开始的所有字符。
  • d{ 命令:该命令删除到上一段开始的所有字符。
  • d 命令:该命令(表示回车)删除包括当前行在内的两行字符。

    五、文本复制命令

    表1:命令模式下常用的文本复制命令
文本复制命令 命令的意义 文本复制命令 命令的意义
yy 复制光标所在的整行 y{ 复制到上一段的开始
Y 或 y$ 复制从光标所在处开始到行尾的内容 y} 复制到下一段的开始
y0 复制从光标前一个字符开始到行首的内容 y 复制包括当前行在内的两行内容
y( 复制到上一句的开始 yw 复制一个单词
y) 复制到下一句的开始
  • yy 命令:复制光标所在的整行。在 yy 前可加一个数字 n,表示复制当前行及其后 n-1 行的内容。
  • Y 或 y$ 命令:两命令功能一样,都是复制从光标所在处开始到行尾的内容。
  • yw 命令:复制一个单词。若光标处在某个词的中间,则从光标所在位置开始复制至词尾。同 yy 命令一样,可在 yw 之前加一个数字 n,表示复制 n 个指定的单词。
  • y) 命令:复制到下一句幵始的所有字符。
  • y} 命令:复制到下一段开始的所有字符。
  • y 命令( 表示回车):复制包括当前行在内的两行内容。

与文本复制有关的命令分为两类。

1. 文本粘贴命令

  • p 命令:粘贴命令,粘贴当前缓冲区中的内容。

    2. 文本选择命令

  • v 命令:在命令模式下进行文本选择。在需要选择的文本的起始处按下 v 键进入块选择模式,然后移动光标到块尾处。这之间的部分被高亮显示,表示被选中。

  • V 命令:在命令模式下按行进行文本选择。在需要选择的文本的第一行按下 V 键,然后移动光标到块的最后一行。这之间的所有行被高亮显示,表示被选中。

    六、撤销命令

    撤销命令分为以下两种。

  • u 命令:该命令撤销上一次所做的操作。多次使用 u 命令会一步一步依次撤销之前做过的操作(在一次切换到文本输入模式中输入的所有文本算一次操作)。

  • U 命令:该命令会一次性撤销自上次移动到当前行以来做过的所有操作,再使用一次 U 命令则撤销之前的 U 命令所做的操作,恢复被撤销的内容。

    七、重复命令

    当用户在文本编辑中碰到需要机械地重复一些操作的时候,重复命令就派上了用场。它可以让用户方便地再执行一次前面刚完成的某个复杂的命令。重复命令只能在命令模式下工作,在该模式下按下.键即可。下面实例演示了使用重复命令。

1) 在 vi 编辑器中编辑以下代码:
#include
int main (void)
{
return 0;
}

2) 让光标位于return 0;所在的行,输入命令O,并输入一行内容后,再按下 Esc 键回到命令模式下,屏幕显示内容为:
#include
int main(void)
{
printf (“http://c.biancheng.net\n“);
return 0;
}

3) 此时输入命令.,重复上次键入printf ("http://c.biancheng.net\n");的操作,屏幕显示内容为:
#include
int main (void)
{
printf (“http://c.biancheng.net\n“);
printf (“http://c.biancheng.net\n“);
return 0;
}

八、退出命令

1. 命令q

在末行模式下,输入命令如下:
:q
如果退出时当前编辑文件尚未保存,则 vi 并不退出,而是继续等待用户的命令,并且会在显示窗口的最末行说明如下信息:
No write since last change (use! to overrides)
说明:当用户不清楚自己当前编译的文件是否被修改时,可以使用该命令进行测试,而不必担心因为误操作导致文件数据丢失。

2. 命令 q!

在末行模式下,输入命令如下:
:q!
该命令不论文件是否改变都会强行退出 vi 编辑器,对于此命令用户应当慎用。

3. 命令 w

在末行模式下,输入命令如下:
:w 新文件名
vi 保存当前编辑文件,但并不退出,而是继续等待用户输入命令。在使用 w 命令时,可以再给当前编辑文件起一个新的文件名。这个功能相当于将该文件另存为为一个新的文件。下面实例演示了将 main.c 文件另存为 test.c 文件。
#include “common.h”
int main(void)
{
int a, b;
sacnf(“%d %d”, &af &b);
swap (a, b);
printf (“%d, %d\n”, a, b);
return 0;
}
:w test.c
保存之后使用:q命令退出 vi 编辑器,使用 ls 命令查看当前目录下的文件时,会发现多了一个 test.c 文件,该文件的内容和 main.c 一致。可以使用 cat 命令查看该文件的内容,main.c 文件的内容不受影响。若指定的新文件是一个已存在的文件,则 vi 在显示窗口的状态行给出如下说明信息:
File exists (use! to override)
说明:这样做同样可以防止因误操作覆盖已经存在的文件,用户可以选择另外的文件名来保存当前文件。

4. 命令 w!

在末行模式下,输入命令如下:
:w! 新文件名
说明:该命令与:w命令相同,所不同的是,即使指定的新文件存在,vi 编辑器也会用当前编辑文件对其进行替换,而不再询问用户。因此,此命令同样要慎用。

5. 命令 wq

在末行模式下,输入命令如下:
:wq
vi 将先保存文件,然后退出 vi 返回到 shell。如果当前文件尚未取名,则需要现指定一个文件名。

6. 命令 x

在末行模式下,输入命令如下:
:x
说明:若当前编辑文件曾被修改过,则 vi 会保存该文件。否则 vi 直接退出,不保存该文件。

九、字符替换命令

1. r 命令

该命令将当前光标所指的字符替换为提供的字符。可以在该命令之前加上数字 n,表示将从当前字符开始的 n 个字符替换为提供的字符。

2. R命令

该命令会让 vi 进入 replace 模式。在此模式下,每个输入的字符都会替换当前光标下的字符,直到输入 结束该模式。

十、光标移动命令

1.基本命令

表:vi 最基本的移动光标命令

光标移动命令 命令意义 光标移动命令 命令意义
h 光标左移一个字符 k 光标上移一行
j 光标下移一行 l 光标右移一个字符

2. 按行移动

1) H命令 移动到行首

H 命令将光标移至当前屏幕的第 1 行,而不是整个文件的第 1 行。若在 H 命令之前加 上数字 n,则将光标移至第 n 行的行首。下面实例演示了使用 H 命令快速移动光标。

2) M命令 移动到行间

M 命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行;否则,移动到显示文本的那些行的中间行。

利用此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。

3) L命令 移动到行尾

L 命令将光标移至屏幕显示文件的最底行的行首。即如果文件内容需要超过一个屏幕显示时,该命令将光标移至屏幕上最底行的行首;否则该命令将光标移至文件最后一行的行首。可见,利用此命令可以快速准确地将光标移至屏幕底部或文件的最后一行。

若在 L 命令之前加上数字 n,则将光标移至从屏幕底部算起第 n 行的行首。

4) G命令 任意移动

在全文的范围内移动光标,此时的光标移动范围不再受屏幕的限制。例如,在上例中,在命令模式下输入命令 5G 之后光标将移到第 5 行的行首

3. 按字移动

1) w 和 W 命令

w 和 W 命令将光标右移至下一个字的字首。这两个命令的区别在于:

  • w 命令所指的字是指英文单词、标点符号和非字母字符;
  • W 命令所指的字是指两个空格之间的任何内容。

    2) e 和 E 命令

    如果光标起始位置处于字内,则 e 和 E 命令将把光标移到本字字尾;如果光标起始位置处于字尾,则 e 和 E 命令将把光标移动到下一个字的字尾。

e 和 E 命令的区别在于:

  • e 命令所指的字是指英文单词、标点符号和非字母字符;
  • E 命令所指的字是指两个空格之间的任何内容。

    3) b 和 B 命令

    如果光标处于所在字内,则 b 和 B 命令将把光标移至本字字首;如果光标处于所在字字首,则 b 和 B 命令将把光标移到上一个字的字首。两个命令的区别在于:

  • b 命令所指的字是指英文单词、标点符号和非字母字符;

  • B 命令所指的字是指两个空格之间的任何内容。

    4) 按段落移动

    在 vi 编辑器中,一个段落被定义为是以一个空白行开始和结束的片段。按段落移动光标的命令有以下两种。

  • {命令:该命令将光标向前移至上一个段落的开头。

  • }命令:该命令将光标向后移至下一个段落的开头。

    十一、文本移动/跨行

    1.文本移动

    | 命令介绍 | 命令 | | —- | —- | | 右移5行 | >5 | | 左移当前行 | <0 | | 右移4行 | 4>> | | 左移3行 | 3<< |

>命令将指定的正文行向右移动,通常是右移 8 个空格。移动正文行的范围由光标所在行和随后输入的光标移动命令所限定
n 表示光标所在位置后面的文本行数。也可以不写 n,此时默认为 1;换句话说,只使用>命令将会移动光标所在的文本行,以及下一个文本行。
如果只想移动光标所在的文本行,可以写>0
<命令将指定的正文行向左移动。其使用方式与命令相同,但是方向相反。
>>该命令将光标所在行右移 8 个空格。如果在>>命令之前给出一个数字 n,例如 4,则表示光标当前行及其下面的 3 行(共4行)都右移 8 个空格。下面实例演示了使用>>命令移动文本。
<<命令将光标所在行左移 8 个空格。其使用与>>命令相同,但是移动方向相反。

2.跨行移动

vi 编辑器使用 m 命令实现文本的跨行移动。该命令的使用方法为:
imj
表示把第 i 行移至第 j 行的下方。

十二、屏幕滚动

如果文件太大,一个屏幕不能将其内容完全显示出来,vi 编辑器会采用分屏显示的方法。使用屏幕命令可以以屏幕为单位移动光标,方便地完成文件的滚屏和分页。

需要注意的是,屏幕命令不是光标移动命令,不能作为文本限定符用于删除命令中。在命令模式下和文本输入模式下均可以使用滚屏和分页命令。滚屏和分页命令如下表所示。

表:滚屏和分页命令

滚屏和分页命令 命令意义
Ctrl+u 将屏幕向前(文件头方向)翻滚半屏
Ctrl+d 将屏幕向后(文件尾方向)翻滚半屏
Ctrl+f 将屏幕向文件尾方向翻滚一整屏
Ctrl+b 将屏幕向文件首方向翻滚一整屏


可以在滚屏和分页命令之前加上一个数字 n,表示屏幕向前或向后翻滚 n 行,或者屏幕向前或向后移动 n 页。这些设置会被 vi 编辑器记住,下次用户在使用滚屏和分页命令时,还会滚动和上次设置相同的行数或者页数。

十三、字符串检索/替换

vi 编辑器提供简单的字符串检索功能。在末行模式下,用户可以使用不同的命令对需要的字符串进行查找。查找命令有 5 种。

1. / 命令

/命令的格式为:
/string
/命令从光标处开始向后寻找字符串 string。

2. ? 命令

? 命令的格式为:
?string
? 命令从光标处开始向前寻找字符串 string。

3. n 命令

n 命令重复上一条检索命令。

4. N 命令

N 命令重复上一条检索命令,但检索方向改变。例如上次的检索命令是向前检索,那么此次检索的方向是向后;如果上次的检索命令是向后检索,那么此次检索的方向是向前。

5. g/ 命令

g/ 命令的格式是为:
g/string
检索 string。g/命令使光标停止在第一个检索到的 string 串的行首。

字符串替换

vi 编辑器提供简单的字符串替换命令,在末行模式下可以使用替换命令,其命令格式如下:
[range]s/s1/s2/ [option]

  • [range] 表示检索范围,省略时表示当前行。下面是一些检索范围的例子。
    • 1,10表示从第 1 行到 10 行。
    • %表示整个文件,同1, $
    • . ,$从当前行到文件尾。
  • s 为替换命令。
  • s1 要被替换的串,s2 为替换的串。
  • option 表示选项:
    • /g表示在全局文件中进行替换。
    • /c表示在每次替换之前需要用户进行确认。
    • 省略时仅对每行第一个匹配串进行替换。

十四、窗口切分

在末行模式中,输入 split 命令即可实现窗口的切分,其命令格式如下:
: split文件名

其中: 表示进入末行模式。

split 也可简写为 sp。这时窗口切分为上下两部分,下半部分对应原来的文件,上半部分对应新打开的文件。

有时用户需要在多窗口之间进行切换,vi 编辑器提供一组命令支持用户切换多个窗口,其命令如下表所示。

表:窗口切换命令

切换命令 命令的意义
Ctrl+w,然后 j 移动光标到下面的一个窗口
Ctrl+w,然后 k 移动光标到上面的一个窗口
Ctrl+w,然后 q 关闭当前窗口
Ctrl+w,然后 w 移动光标到另一个窗口

十五、属性设置

vi 编辑器提供可以设置其环境属性的命令,这些命令如下所示。

行号设置命令

:set nu (nonu)
该命令显示行号(或者不显示行号)。

显示设置命令

:set hlsearch (nohlsearch)
该命令设定搜寻字符串反白显示(或者不反白显示)。

语法缩进命令

:set autoindent
该命令显示程序语法自动缩进。

文件存储命令

:set backup(nobackup)
该命令自动储存备份文件(或者不自动备份文件)。

显示选项命令

:set all
该命令显示所有的选项。

语法高亮命令

:syntax on (off)
该命令实现程序语法高亮显示(或者不高亮显示)。

大小写区分命令

:set ignorecase(noignorecase)
该命令忽略大小写(或者区分大小写)。