> 文章列表 > VIM编辑常用命令

VIM编辑常用命令

VIM编辑常用命令

本贴为学习小甲鱼【VIM快速入门】时的笔记,视频链接:【VIM快速入门】《带你学C带你飞》(番外篇)

VIM是Linux系统下强大的编辑器,能够方便使用者提升效率。
VIM 具有 6 种基本模式和 5 种派生模式。
基本模式:普通模式、插入模式、可视模式、选择模式、命令行模式和 Ex 模式;
派生模式:操作符等待模式、插入普通模式、插入可视模式、插入选择模式和替换模式
对于大多数VIM使用者来说,普通模式是最常用的模式。

1.练习hjkl键

hjkl按键必须在普通模式下使用,分别对应:h左、j下、k上、l右。
hjkl练习小程序,系统:ubuntu18.04。程序下载地址:使用hjkl移动你的光标
里面的vim_test_linux是Linux系统下的运行程序。不过该程序是32位的运行程序,要想在64位系统中运行,必须安装以下依赖项:

#添加多架构支持
sudo dpkg --add-architecture i386
#安装32位支持库
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 zlib1g:i386
#大多数情况下需要安装32位的libncurses5
sudo apt-get install lib32ncursesw5

vim_test_linux使用权限,就可运行。
如果觉得使用小程序练习hjkl麻烦的话,也可以略过此步,直接自己练习也行,不过最好熟练使用hjkl之后再来学习后面的命令

2.插入模式和退出VIM的方法

使用VIM编辑器打开文件命令:vi test.c,打开文件后默认是进入了普通模式。使用hjkl按键移动光标到达你需要编辑的地方。进入插入模式即可进行编辑。进入插入模式的各种方法如下:

按键 含义
i 在光标的前边进入插入模式
I 在光标所在行的行首进入插入模式
a 在光标的后边进入插入模式
A 在光标所在行的行尾进入插入模式
o 在光标所在行的下方插入空行并进入插入模式
O 在光标所在行的上方插入空行并进入插入模式
s 删除光标指定的字符并进入插入模式
S 将光标所在行清除并进入插入模式

注意:最后这个大 S 是清除所在行,而不是删除。清除的意思就是保留行,把内容清空,然后在行首进入插入模式。

回到普通模式

回到普通模式只需按一下 Esc 键即可。

退出 VIM 的方法

必须在普通模式下才能退出VIM。
一般退出 VIM 分两种:一种是保存修改并退出;另一种则是直接退出。
对于第一种(保存修改并退出),有两个命令,如下:

#1.两个大写字母Z,也就是Shift+z+z
ZZ
#2.先按出英文冒号:,即先进入命令行,然后按wq,w 表示保存,而 q 表示退出
:wq

对于第二种(直接退出),如果没有对文件进行编辑,直接输入:q即可;如果修改过文件但不希望保存(放弃修改),使用:!q即可。

3.删除命令、数字的奥义、撤销和恢复命令

删除命令

在插入模式下,使用删除键(Delete)来删除光标前面或当前的字符;
在普通模式下,删除单一字符可以用 x 命令。x命令是删除光标指定的字符。当光标对着某一字符时,按下x即可删除。

删除更多字符可以使用 d 命令。使用删除操作符 d 的删除命令的格式是 d motion。d 是 Delete(删除)的意思,motion 即指定要删除的对象。motion 其实是一些表示操作范围的指令,比如:

按键 含义
0 将光标定位(移动)到行首的位置
^ 同上
$ 将光标定位到行尾的位置
b 将光标定位到光标所在单词的起始处
e 将光标定位到光标所在单词的结尾处
w 将光标定位到下一个单词的起始处
gg 将光标定位到文件的开头
G 将光标定位到文件的末尾

可以发现,上面表格中的按键比单纯的hjkl按键更加灵活方便,也是VIM中常用的命令。

然后将d命令与上面表格的按键进行结合,就可实现多种删除操作。

按键 含义
d0 删除光标从当前位置(不包含)到该行行首的所有字符
d^ 同上
d$ 删除从光标当前位置(包含)到该行行尾的所有字符
db 删除从光标当前位置(不包含)到单词起始处的所有字符
de 删除从光标当前位置(包含)到单词结尾处的所有字符
dw 删除从光标当前位置(包含)到下个单词起始处的所有字符
dh 删除光标前面一个字符
dl 删除光标指定的字符
dj 删除光标所在行以及下一行的所有字符
dk 删除光标所在行以及上一行的所有字符
dd 删除光标所在行的所有字符
dgg 删除光标所在行(包含)到文件开头的所有字符
dG 删除光标所在行(包含)到文件末尾的所有字符

数字的奥义

VIM 利用数字是操作变得更加便捷。比如,普通模式下按一下 h 按键是将光标向左移动一格,而在其前面输入数字 3,即 3h 则是将光标向前移动 3 格,依此类推 3j 则是将光标向下移动三行,3w 则是将光标跳到三个单词后的开始位置……

同样的,d3h 表示删除光标前的 3 个字符,d3j 表示删除光标所在行以及下面 3 行的所有字符,而 d3w 则表示向后删除当前光标到后面第三个单词前的所有字符。

撤销和恢复命令

小写的 u 表示撤销最后一次修改;而大写的 U 表示撤销对整行的修改。

如果想恢复撤销的内容,可以使用Ctrl + r 快捷键。

注意:上面所有的“删除”操作并不是真的删除,它们事实上是存放在 VIM 的一个缓冲区(VIM 把它称之为寄存器)中,相当于 Windows 的剪切功能。

4.粘贴命令、替换命令、替换模式和修改命令

粘贴命令

在 VIM 下使用删除命令,并不会直接将你的东西删掉,而是放到 VIM 的寄存器中。这样做有一个好处,就是可以让我们简单的实现类似于 Windows 的剪切功能。即执行删除命令之后,可以直接使用粘贴命令。

使用 p 命令可以将最后一次删除的内容粘贴到光标之后。(大写的 P 则是粘贴到光标之前)

注意:如果你需要粘贴的是整行为单位,那么 p 命令将在光标的下一行开始粘贴;如果你拷贝的是非整行的局部字符串,那么 p 命令将在光标后开始粘贴。

拷贝命令

大多时候,我们使用的是拷贝粘贴。VIM 用 y 命令实现拷贝。语法跟删除的 d 命令一样:
y motion

其中的 motion 同样是用来表示操作范围的指令,即
yy 表示拷贝当前行;
3yy 则表示拷贝 3 行;
y$ 表示从光标所在的位置拷贝到行尾的所有字符;
yG 则表示从光标所在行拷贝到文件末尾行的所有字符。

拷贝完成之后同样使用 p 命令进行粘贴。

替换命令

VIM 提供 r 命令进行替换操作。

r 用于替换光标所在的字符,做法是先将光标移动到需要替换的字符处,按一下 r 键,然后输入新的字符。注意,全程无需进入插入模式,也不会进入插入模式。

替换模式

对于需要替换多个字符,更好的方案是直接进入替换模式。方法:在普通模式下按下大写的 R 键。此时输入字符可以连续替换光标及其后边的内容。注意:退格键(Backspace)在替换模式中被解释为如果左边内容被替换过,则恢复到原来的样子;如果没有被替换过,则简单的向左移动。修改完毕后,按下 Esc 回到普通模式。

修改命令

修改命令使用 c 键来启动,格式是:c [number] motion
motion 依然表示范围,[数字]依然拥有奥义,同样是可选的,加上数字表示重复执行多次 motion 范围。
比如 cw 是修改光标指定单词的内容(VIM 的做法就是删除当前光标位置到下个单词前的所有字符,并进入插入模式);而 c2w 便是修改当前光标指定的单词以及下一个单词共计两个单词的内容。

按键 含义
c0 删除光标从当前位置(不包含)到该行行首的所有字符,并进入插入模式
c^ 同上
c$ 删除从光标当前位置(包含)到该行行尾的所有字符,并进入插入模式
cb 删除从光标当前位置(不包含)到单词起始处的所有字符,并进入插入模式
ce 删除从光标当前位置(包含)到单词结尾处的所有字符,并进入插入模式
cw 删除从光标当前位置(包含)到下个单词起始处的所有字符,并进入插入模式
ch 删除光标前边一个字符,并进入插入模式
cl 删除光标指定的字符,并进入插入模式
cj 删除光标所在行以及下一行的所有字符,并在光标下一行进入插入模式
ck 删除光标所在行以及上一行的所有字符,并在光标下一行进入插入模式
cc 删除光标所在行的字符,并进入插入模式

5.文件信息、跳转、定位括号和缩进

文件信息

有时候,你可能需要知道当前的文件信息,比如文件名,文件状态,文件的总行数,以及光标所在的相对位置。可以使用ctrl + g命令查看当前的文件信息。
VIM编辑常用命令

跳转

将光标从某一位置跳转到另一较远的位置可以使用数字 + hjkl 的方式。这种方式需要进行计算,不太方便。
在 VIM 有两种方式可以将光标跳转到指定的位置:

  • 行号 + G
  • :行号

比如将光标跳转到第 333 行的位置,你就输入数字 333,再输入大写字母 G 即可;或者输入冒号:进入命令行模式,再输入数字 333,最后回车,也可以跳转到目的地。

定位括号

VIM 有个按键可以帮你快速定位到另一半括号,就是 % 键。将光标移动到 (),[],{},中的任何一半括号上,按下 % 键,便可看到此时光标已经跳转到另外一半的括号上了。

缩进

如果只对一行代码进行缩进,可以进入插入模式使用Tab键。但是如果对于多行代码,这种操作不可取。

VIM 可以使用尖括号(< 或 >)来控制缩进,常用的就是两个同方向的尖括号表示将光标所在的语句进行缩进和反缩进操作。很明显 >> 表示缩进,而 << 则表示反缩进。

如果要进行多行缩进,比如十行,先输入数字 10 再输入 >> 表示将光标所在行以及下面9行共十行同时插入一个缩进。

但是如果行数太多,不知道具体多少行时,可以进行如下操作:按一下 v 进入可视模式(按完之后看不出有反应是正常的),然后通过 h、j、k、l 或 其他 motion 来移动你的光标,此时光标所到之处必被一道亮光所包围(表示被选中),选择好需要缩进的目标后,只需按一下 > 即可完成任务。

6.搜索命令和替换命令

搜索命令

VIM 的查找是通过/进行的。在普通模式下按下斜杠(/)也是进入命令行模式,此时该字符和光标均出现在屏幕的底部,这跟冒号(:)一样。

紧挨着斜杠(/)的是搜索目标,比如 /love,说明你找的是 love 这个字符串在光标后边第一次出现的位置是哪里,当然你也可以输入中文,比如 /只因你太美。按 n 键即可定位到下一个符合的目标(向下查找),而按 N 键则返回上一个(向上查找)。

注意:第一个搜索到的目标不是文件中的第一个目标,而是从你的光标所在处开始找到的那个目标。所以你如果想要搜索文件中第一个匹配的目标,你应该先 gg 将光标移动到文件头,然后再使用搜索命令。

替换命令

通过搜索功能,我们将光标定位到目标位置,如果你想替换该目标,你可以输入 :s/old/new,这样即可将光标所在行的第一个 old 替换为 new;你如果输入的是 :s/old/new/g,则表示将光标所在行的所有 old 替换为 new;如果你想替换整个文件中的某个字符串,需要输入 :%s/old/new/g,表示替换整个文件中每个匹配的字符串。

如果你想在替换的时候,VIM能咨询你的意见,那么你可以输入 :%s/old/new/gc。终端下方出现(y/n/a/q/l/^E/^Y)

  • y 表示替换
  • n 表示不替换
  • a 表示替换所有
  • q 表示放弃替换
  • l 表示替换第一个并进入插入模式
  • ^E 表示用 Ctrl+e 来滚动屏幕
  • ^Y 表示用 Ctrl+y 来滚动屏幕

如果想要替换指定多行中的某些字符串,比如第5行到第13行,可以输入:5,13s/old/new/g。5 表示开始替换的行号,13 表示结束替换的行号。

7.执行shell命令、文件另存为、合并文件和打开多个文件

当使用VIM编辑文件的时候,如果想要知道某个路径下有哪些文件(程序调用需要它们),可以不用关闭VIM,直接在当前VIM编辑中进行操作。使用的命令是!。比如你想知道主目录下某个文件夹下有哪些文件,可以输入:!ls ~/XXX,敲回车即可看到。

总之,在输入冒号(:)进入命令行模式,输入感叹号(!),在其后便可以加上 shell 命令。此后 VIM 将临时跳转回 shell,并执行命令。再次按下 Enter 键回到 VIM。

文件另存为

VIM可以使用:w 新文件名的方式将当前打开的文件另存为新文件。比如我使用VIM打开的test.c文件,可以使用:w test2.ctest.c另存为test2.c。该命令会以test2.c为文件名拷贝保存整个test.c文件。

VIM 除了支持文件另存为之外,还支持另一种新技能:文件局部另存为。即VIM 可以将文件中的局部文本另存为一个新的文件。操作:按一下 v 进入可视模式(按完之后看不出有反应是正常的),然后通过 h、j、k、l 或 其他 motion 来移动你的光标,此时光标所到之处必被一道亮光所包围(表示被选中);选好范围之后的操作就跟“文件另存为”一样了,按下冒号(:)屏幕左下方出现 :'<,'>,然后输入w test2.c即可将选中的文本另存为新的文件。

合并文件

合并文件也就是在 VIM 打开的一个文件中读取并置入另一个文件的内容。命令很简单,只需要输入冒号(:)进入命令行模式,然后输入 r 文件名即可。

打开多个文件

VIM 还可以同时打开多个文件,并且允许你通过水平或垂直的方式并排它们。

VIM 使用 –o–O 选项打开多个文件,其中 –o 表示垂直并排,例如 vim -o lesson4 lesson5 lesson6
VIM编辑常用命令
-O 表示水平并排,例如 vi -O lesson4 lesson5 lesson6
VIM编辑常用命令
打开后默认光标是落在第一个文件中的,此时之前学过的所有命令都可以上,不过仅限于第一个文件。使用 ctrl + w + w 将光标切换到下一个文件;或者使用 ctrl + w + 方向(方向键或 h、j、k、l)。

  • 对于垂直并排的文件:使用 ctrl + w + 上、下方向,表示上、下切换文件;
  • 对于水平并排的文件:使用 ctrl + w + 左、右方向,表示左、右切换文件。

退出文件的话可以使用原来的 q、q!、wq 或者 ZZ(shirt + z + z),依次退出每个文件。

如果想一次性退出所有打开的文件,只需要在原来退出命令的后边加上小写 a,则表示退出动作是针对所有的(ALL):qa、qa!、wqa