vim 基本常用操作
前言
这篇文章介绍的是 vim 的基本常用操作,完成本文的学习就可以跨越 vim 入门的障碍。这篇文章还没有涉及到使用插件,仅是使用 vim 原先就带有的基本编辑器功能。
强烈建议:阅读本文时最好打开 vim 配合操作学习以达到最佳阅读效果。
模式
在 vim 中,每次按键在不同的模式中产生的结果是不同的。vim 8.2 的版本中,一共有 7 种基本模式和 7 种附加模式,附加模式是基本模式的变种。虽然 vim 有着 14 种模式,但是我日常常用的只有以下几种模式:
- 插入模式(Insert mode):插入模式是我们用的最多的模式,正常码字就是在这个插入模式。
- 正常模式(Normal mode):如果我们不用鼠标上下滑动查看的话,我们就需要在正常模式下进行移动,当然移动只是在正常模式下的众多操作中的一个点。
- 命令行模式(Command-line mode / Cmdline mode):在这个模式下可以运行一些命令,包括查看命令帮助,输入命令进行查找、替换等一系列强大操作。
- 可视模式(Visual mode):在这个模式下我通常用来复制多个单词,然后粘贴。
- 替换模式(Replace mode):在这个模式下我会用来替换文本。
- 终端作业模式(Terminal-Job mode):这个模式可以让我进入终端暂时查看一些东西。
更多关于 vim 模式方面的知识,可以在正常模式下 :help vim-modes
查阅。下面分模式分别介绍下一些简单的操作。
正常模式
默认的,当我们使用 vim 打开文件时,vim 就处于正常模式。许多 vim 用户可能有一个习惯,就是喜欢狂按键盘左上角的 <esc>
键,因为从插入模式回到正常模式默认的操作就是按 <esc>
,不过有时按一次可能还没反应,然后就狂按了 😶。还有一个原因就是遇事不决狂按 <esc>
,这个至少我在用 vim 时是这样的。正常模式基本操作我分为以下几点:
- 移动
- 删除
- 撤销
- 替换
- 查找
- 复制 && 粘贴
切换到正常模式
正常模式是其他各种模式切换的中转站,譬如要从可视模式切换到插入模式,就得先切换到正常模式,然后再从正常模式切换到插入模式。那么如何切换到正常模式呢,从我的使用经验中总结有两种情况:
- 从终端作业模式切换:键入
Ctrl-\ Ctrl-N
,不过这个切换的模式理应叫终端正常模式(Termianl-Normal mode),它是 7 种附加模式之一,不过在这里把它归为正常模式的一种特殊情形了,具体信息请看下面的终端作业模式章节。 - 从其他模式切换:按一次
<esc>
/ 狂按<esc>
。这是我办公的大部分情况,不过真实情形是我把<esc>
按键禁用了,映射成了其他键,觉得<esc>
有点远,不方便按。
移动
^
k
<h l>
j
v
每次按下 h
就会向左移动,按下 j
就会向下移动,按下 k
就会向右移动,按下 l
就会向右移动。当然,vim 也是支持方向键移动的,不过当你习惯于用 hjkl
移动时,你的手指活动将集中在键盘的主要活动区域,而不用在需要移动时将手指从键盘主区域移开到方向键。唯一的 tips 就是勤加练习,多用 vim 打代码。
折行移动
在上图中使用 vim 进行移动时,你可能会发现这么一个问题,当你在一行中输入过长的字符之后,vim 默认会将超出屏幕的部分在下一行显示,这个和 vim 中默认的 wrap
属性相关,这个属性的内容会在下一篇文章中介绍。当文字被这行之后,用 jk
移动是到不了被折的那一行的,这时候你需要的是 gj
和 gk
,也就是快速键入两个字符。
总结:一般来说,正常的移动 hjkl
已经足够,但是当遇到折行时,你就可能需要 gj
和 gk
了。
删除
单词
为了更方便地描述,我在这里先说下 vim 中单词的含义,单词是指由 vim 中 iskeyword
变量指定的字符组成的字符串,单词之间由空白字符(空格、TAB、<EOL>)分隔的,特别的,一个空白行也是一个单词。在这篇文章中我们不讨论多字节字符集,譬如中文。在 vim 中,默认的,像 谢谢
这四个字是被当做一个单词的,谢谢关注
也是一个单词。在 vim 的正常模式下,键入 :echo &iskeyword
就可以看到 iskeyword
的定义了:@,48-57,_,192-255
,
-
@
表示isalpha()
返回true
的字符,也即是字母 -
48-57
和192-255
可通过以下方法查看:
:echo map(range(48, 57), 'nr2char(v:val)')
和:echo map(range(192, 255), 'nr2char(v:val)')
查看,命令具体的含义在之后的 vim 脚本系列会讲。这两条命令的输出如下:['0', '1', '2', '3', '4', '5', '6' , '7', '8', '9'] ['À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ' , 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í ', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', ' Ô', 'Õ', 'Ö', '×', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è' , 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï ', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', ' ö', '÷', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'þ', 'ÿ']
-
_
就是 ‘_’ 字符。
iskeyword
也是可以由我们用户来自定义修改的,譬如我要改成是字母和逗号::set iskeyword=@,\,
就可以了。
有了单词是什么的认知之后,接下来我们就可以学习有关删除的操作了。
删除操作我分为字符删除和单词删除,字符删除由 x
和 X
来控制,单词删除由 d
来操作,当然,通过一些小技巧,字符删除由 d
,单词删除由 x
也可以做到,不过就是不方便。
字符删除
在正常模式下,键入 x
将删除光标当前字符,键入 X
将删除光标前一个字符。
单词删除
删除一个单词由 d
来控制,既然 d
是操作单词的,那么它的行为就和 iskeyword
属性绑在了一起,读者可以自行修改 iskeyword
体验一番。d
常用的操作有以下这些:
dw
:删除一个单词到下一个单词开始位置,dw
会连空白字符一起删除。但是dw
除了删除单词之外,像--->
、<>
这样的也会当作一个单词删除。de
:行为和dw
类似,但是不会删除空白字符。db
:行为和dw
类似,但是不是删除后一个单词,而是删除前面一个单词。dd
:删除一整行。
撤销
撤销主要有两种行为:撤销和撤销之前的撤销。撤销是由u
控制,撤销之前的撤销由Ctrl-R
控制。
替换
替换分为单个字符替换和单词替换。
- 单个字符替换是由字符
r
控制的,先键入r
,然后键入要替换的字符。 - 单词替换由
c
来控制,将单词替换一节的d
换成c
就是对应的行为了,只不过c
会自动进入插入模式等待输入。 - 更强的替换:
R
进入替换模式,随移替换光标所在位置,替换完成之后按<esc>
退出替换模式。
查找
在正常模式中查找是键入/
,键入之后在 vim 窗口下方你会看到 vim 正在等待你输入要查找的字符串,输入字符串之后按回车就可以查找了。查找到之后按n
跳转到下一个匹配项,按N
跳转到上一个匹配项。vim 支持快速查找光标处单词,键入*
,不过这是完全匹配查找。
vim 还支持更加强大的正则表达式查找,不过这已经超出本文讨论的主题,留到之后的文章中再叙。
复制 && 粘贴
yy
:复制一行,vim 中的复制术语不是叫做 copy,而是 yank。p
:粘贴
vim 中使用了寄存器的概念,我们上述很多操作都使用了寄存器,只是这些工作 vim 在默默的做了,我们不知道罢了,譬如删除一行dd
,会将删除了的内容放在一个未命名的寄存器中,可以通过:reg "
来查看未命名的寄存器,yy
操作也会把内容默认放在未命名的寄存器中,粘贴时再从中将内容拿出来,所以如果 yy
之后 dd
,接着 p
,发现粘贴的结果和复制的不一样,可以查下寄存器内容。更多寄存器知识,请用 :help reg
查看。
插入模式
插入模式可以说是我们的工作模式,在插入模式中我们可以像在记事本中做文本输入一样。在正常模式中,键入 i
就可以进入插入模式了,狂按<esc>
就可以返回正常模式了。根据光标插入位置的不同,vim 为我们提供了其他指令从正常模式进入插入模式:
i
: 在光标之前进入I
:在行首进入a
:在光标之后进入A
:在行末进入o
:在下一行插入新行O
:在上一行插入新行s
:删除当前字符并进入插入模式,相当于xi
,先删除当前字符,再在当前位置进入插入模式。S
:删除当前行并进入插入模式。
在以上 8 条指令中,前 6 条是我用的最多的,这些都是可以快速提高效率的命令,需要勤加练习。
命令行模式
命令行模式是一个很强大的模式,从最简单的保存退出到支持各式各样的函数,插件。在本文中,我只挑选在办公中常用的命令叙述。
进入命令行模式
键入:
就可以看到 vim 窗口下方等待你键入命令了。
注意:以下操作都是进入命令模式之后的操作!
保存
- 保存文件:
w
。 - 退出:vim 要求文件如果修改了不能退出,如果要强制退出,使用
q!
。正常退出使用q
。 - 保存并退出:
wq
。
行数跳转
跳转到文件的哪一行可以通过:n
来实行跳转,n
表示要跳转到第几行,譬如要到第 100 行,就是 :100
。
帮助手册
:help 字符串
进入某条帮助手册,譬如 :help vim-modes
查看 vim-modes 的帮助手册,值得一提的是,vim 命令行模式支持 TAB
键帮忙补全。
执行 shell 命令
:! shell命令
可以到 shell 中执行 shell 命令,譬如 :!pwd
查看当前目录是什么(中间有无空格无所谓,如 :! pwd
也可以),按 q
返回到 vim。
进入终端工作模式
这个请阅读下面关于终端工作模式章节。
可视模式
在可视模式中,我们可以删除、复制任意多的字符。进入可视模式有两种方式:
v
:逐个字符选择,使用hjkl
、gg
、G
进行移动。V
:逐行选择,使用hjkl
、gg
、G
进行移动。
在可视模式下选择了字符之后,可以键入 d
就可以删除选择的字符,键入y
就可以复制选择的字符。譬如我要删除从光标行到首行的内容,就可以先键入V
进入逐行可视模式,然后键入gg
选中从光标处到首行的文本,键入d
删除这段内容。
替换模式
替换模式在正常模式的替换一节中也提到了,键入R
就进入替换模式,然后就可以随意输入替换光标处文本了。
终端作业模式
首先通过:echo has('terminal')
查看是否支持 terminal 模式,结果为 1 才支持。
进入终端作业模式就相当于进入了一个终端,然后就可以正常键入 shell 命令来执行了。我一般是直接通过:terminal
进入,在终端页面键入Ctrl-\ Ctrl-N
进入终端正常模式,在终端正常模式下,可以使用正常模式的那些指令,不过不能修改里面的内容,在终端正常模式下,键入i
就可以回到终端作业模式了,在作业模式下,键入exit
就可以退出作业模式了。在终端作业模式下,你可能还需要时不时地跳到 vim 的其他“面板”,可以用Ctrl-W + hjkl
来跳转,譬如 Ctrl-W j
跳到下面那个“面板”,Ctrl-W k
跳到上面那个“面板”。
结束语
至此,vim 的基本操作就结束了,学会这篇文章的内容之后,在 vim 上做一些基础编辑阅读操作基本上就没什么问题了,但是如果需要更有效率的码代码,就需要插件的配合了,关于插件的内容,在接下来 vim 系列文章中将会介绍。
由于 vim 的学习曲线是比较难,但是认真学习过一段时间之后,路就比较平坦了。重点是勤加练习,多使用 help 命令,多上网查资料。vim 还自带教程,在终端中通过vimtutor
可以查看。
更多好玩的内容欢迎关注我的公众号~
公众号主要介绍一些 linux 上的效率工具,C 语言, linux 咨询以及 linux 内核源码学习。