引言
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)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。