引言
2013 年的时候我才开始接触 Vim,简单学了一下,也没用起来,后来只记得普通模式以及怎么进入插入模式,然后就是保存退出这几个命令了。
直到最近买了一个 HHKB 键盘以及发现使用 Vim 编码效率要高很多,所以我决定重拾 Vim,为了加强自己的记忆,于是我就整理了这篇文章。
模式
这个是 Vim 区别普通编辑器的最大差别。Vim 有好几种模式,在不同的模式下可以干不同的事情。
普通模式
这个是 Vim 的默认模式,在这种模式下,你可以通过键盘移动光标,可以删除文字。
方向键
h:左 ←j:下 ↓k:上 ↑l:右 →
这几个是最常用的方向键盘,怎么记呢?除了记住『j 长得有点像 ↓』之外就是勤加练习了。
其他
w:移动到下一个单词的开头e:移动到下一个单词的结尾0:移动到行首$:移动到行尾b:移动到上一个单词的开头gg:移动到文件的开头G:移动到文件的结尾nG:移动到第 n 行dd:删除当前行d$或者D:删除当前光标到行尾d0:删除当前光标到行首yy:剪切当前行p:粘贴内容到下一行v$yjp:选中光标到行尾内容,跳转下一行粘贴内容
插入模式
专门用来插入文字的模式,你可以把其他编辑器的默认模式理解为 Vim 的插入模式。
如何从普通模式进入插入模式?
i:在光标之前插入(insert 插入)a:在光标之后插入(append 追加)I:在光标行行首插入A:在光标行行尾插入o:在光标行下面插入新一行并且保持插入模式O:在光标行上面插入新一行并且保持插入模式
除了以上命令我们还可以使用 c 命令进入插入模式:
cc:删除当前行内容,并且进入插入模式c$或者C:删除当前光标到行尾,并且进入插入模式cw:从光标处删除到单词结尾并且进入插入模式caw:删除整个单词并且进入插入模式(即使你的光标在单词中间)
如何回到普通模式?
按 Esc 键最方便。
可视模式
可以理解为选中模式,通过一些命令选中字符、行、块,再针对选中区域做操作。
普通模式和可视模式可以这样互相切换
v:切换面向字符的可视模式V:切换面向行的可视模式Control+v:切换面向块的可视模式(当你需要对几行字符做相同操作的时候,这种模式非常有用)
相关命令
gv:进入上次可视模式状态o:切换选中区域的活动端(试一下vwwoe自己感受一下)
实际场景示例
vi'c:从当前光标位置删除'之前的内容,并且进入插入模式vi}:选中{}之间的内容,同理}可以换成'、"、]等(i 可以立即为 inside)va}:选中{}以及其之间的内容,同理}可以换成'、"、]等(a 可以理解为 around)vit:选中两个标签之间的内容viw:选中当前字符viW:选中当前字串(字串含义见后面内容)
更多可以参考下图,来源《VIM 学习笔记 文本对象(Text Objects)》

命令行模式
进入命令行模式之后我们可以执行一些命令对文本进行操作。
进入命令行模式
::进入命令行模式/:向下进行搜索,按n跳转到下一个,按N跳转到上一个?:向上进行搜索,按n跳转到下一个,按N跳转到上一个
一些常用的命令
:x:保存并且退出:wq:保存并且退出:w:保存:q:退出:0:跳转到文件头,0 代表行号:t:复制,把一行或者多行复制到指定位置:m:移动,在用法上和复制类似<或者>:缩进或者反缩进
一些示例
:2,3t.:把第 2 和 3 行的内容复制到当前光标行下方:2,.t5:把第 2 行到当前光标行复制到第 5 行下方:2m.:把第 2 行移动到当前行下方:t5:把当前行复制到第 5 行下方:t$:把当前行复制到最后一行:t.:把当前行复制到下一行,同yyp:%s/echocai/forecho:把当前文件每行第一个echocai替换为forecho:%s/echocai/forecho/g:把当前文件的所有echocai替换为forecho:'<,'>s/field/echo:把当前高亮区域中所有的field替换为echo(高亮区域可以事先通过Vjjj选中,再输入:的时候,会自动输入'<,'>):![cmd]:运行 shell 命令(示例::!pwd、:!ls)10<<:缩进 10 行,10>>:反缩进 10 行
移动光标
这个是非常常用的功能,在普通模式下我们除了使用 h、j、k、l 移动外,我们还可以:
Control+d:向下滚动半屏幕Control+u:向上滚动半屏幕gg:跳转到文件头部12gg:跳转到第 12 行G:跳转到文件末尾f{char}:行内搜索,跳转到下一个{char}所在的位置上(示例:fx跳转到下一个 x 所在的位置)F{char}:行内搜索,跳转到上一个{char}所在的位置上。(示例:Fx跳转到上一个 x 所在的位置)t{char}:行内搜索,跳转到下一个{char}的前一个位置上。(示例:光标在行首的时候,在有 ActiveForm 的行内使用tc跳转到 A 所在的位置)T{char}:行内搜索,跳转到上一个{char}的前一个位置上。w:跳转到下一个单词的第一个单词上b:跳转到上一个单词的第一个单词上e:跳转到下一个单词的最后一个单词上ge:跳转到上一个单词的最后一个单词上zz:让光标处于屏幕正中间,不会移动光标。
上面的 w、b、e 都有对应的大写 W、B、E,区别就是大写范围更大。小写范围是单词(word),大写范围是字串(WORD),区别:
- 单词(word):由数字、字母、下划线或者其他非空白字符串组成
- 字串(WORD):以空白字符串分割
另外在使用 f、F、t、T 命令的时候,要注意:
- 尽量找低频字母
;:重复上一次行内搜索,可以理解为跳转到下一个目标位置,:撤回上一次行内搜索,可以理解为跳转到上一个目标位置
动作
动作是指再普通模式下执行的一些行为,需要跟其他指令一起使用。最常用的有这些:
d:删除c:删除并且进入插入模式r:替换,在普通模式下替换一个字符,比方说把光标移动 t 上,按下rT会直接把 t 替换为 T 并且还处于普通模式下R: 进入替换模式,会替换光标所在的文字,直到按Esc为止x:普通模式下删除一个字符,保持普通模式u:撤销操作Control+r:重做
以上这些动作都可以用数字或者其他指令组合,一些示例:
daw:即使你处于单词中间,你也可以通过这个命令把整个单词删除。4dd:dd是删除一行,4dd是删除 4 行
宏录制
Vim 的录制宏是一个非常强大的功能,当我们需要对一些重复的操作进行批量处理的时候,可以使用宏来完成。比方说,我们需要下面每行文字都用双引号包起来,并且在结尾加上逗号
|
|
不用 Vim 宏录制功能的话,我一般用 Sublime Text 的批量选中(按住 Option 然后按住鼠标往下拉就能批量选中),然后批量操作来完成。
要处理的行数比较少,这种方式还挺快的。但是遇到要处理几百甚至几千行,这种方式就不太适合了。这时候就可以用 Vim 的宏录制功能来完成了。
宏录制的功能你可以理解为记录一系列按键操作,然后批量「播放」执行。
宏录制步骤:
- 普通模式下
q+a,然后开始录制,这里的a是宏的名字,可以是任意字母或者数字 - 开始正常的 Vim 操作,比方说移动光标,删除,插入等等。这里需要注意的是不能用方向键移动光标,只能用
hjkl或者w等移动光标的命令 - 普通模式下
q,结束录制。如果是批量操作行,记得在结束之前要按一下j换行
宏使用步骤:
普通模式下 @ + a,这里的 a 是你之前保存的宏的名字,100 行的话,按一下 100@a 就可以了,依次类推。
实战
上面的需求,我们可以用下面的宏来完成:
- 开始录制:
Esc + q + 1 - 具体操作:
0 + i + " + Esc + A + " + , + Esc + j + q这个操作可以用宏来完成,具体操作如下: - 执行宏:
Esc + 18@1
配置 Vim
插件
安装插件有几种方式,我是使用的是 pathogen.vim 的方式,方法:
|
|
然后插入:
|
|
下面推荐几个插件
vim-abolish
转换单词,示例:
crm:把下划线风格转换成大驼峰风格(foo_bar转换为FooBar)crc:把下划线风格转换成小驼峰风格(foo_bar转换为fooBar)crs:把小驼峰风格转换成下划线风格(fooBar转换为foo_bar)cru:转化为下划线分割全大写风格cr-:转化为小写中划线分割风格cr.:转化为小写点分割风格cr.:转化为小写点分割风格cr.:转化为小写点分割风格- 其他功能看文档吧
安装
|
|
ybian/smartim
自动切换输入法,保证回到普通模式的时候是英文输入法。
安装
|
|
如果不是 com.apple.keylayout.US 就要修改设置:
|
|
添加这行
|
|
最后
Vim 要了解 Vim 的哲学,学 Vim 带来的收益我认为是指数增长的,但是绝对是值得的,虽然现在很少有人直接在终端用 Vim 写代码,但是几乎所有的编辑器都可以开启 Vim 模式了。
《Vim 实用技巧 第二版》这本书我还没看完,所以本篇文章会持续更新。
参考链接
- 原文作者: forecho
- 原文链接: https://blog.forecho.com/re-study-vim.html
- 版权声明:本作品采用 署名-非商业性使用 4.0 国际 (CC BY-NC 4.0)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
