最近读了读 Drew Neil 的 《Vim 使用技巧》,得到了一些收获。
-
当多种方式可以达到相同目的,思考应该采用哪种方式
举个例子,应该尽可能使用 ‘daw’ 而不是 ‘dbx’, ‘vbx’, 虽然都是 3 次按键,但是 ‘daw’ 可以被 ’.’ 重复, 应该多考虑可重复的过程是不是满足点范式,一个按键移动,一个按键(通常是 ’.‘)修改。
-
:normal 命令
有的时候记不住普通模式所对应的 Ex 命令或者 函数调用,直接使用 normal 命令是个很好的选择。
-
宏的并行执行
宏有两种执行模式,一种是串行执行,比如说在宏的结尾加一个 ‘j’,但是如果宏没编写好,或者中间的文本不匹配, 可能就会出现错乱,可以想办法变成并行模式,比如录制的宏并不包括切换到下一行 ‘j’ 或者下一个 buffer 的命令, 然后采用了
:'<,'>normal @a
或者bufdo
的方式进行循环。 -
最大化当前 Window
平时我会经常用 tmux 的
<C-b>z
的方式最大化当前窗格,vim 对应的做法应该是新开一个 Tab,把当前 Buffer 打开, 但是有时候也想在当前 Tab 最大化当前 Window,做法是使用快捷键<C-w>|
或者<C-w>_
。 -
模式中的 ’<’ ’>‘
模式
<the>
可以只匹配 the,但是不匹配 them,我们平时在 normal 模式按*
的时候,可以观察状态栏, 默认是使用了 ’<>‘。 -
重复替换
- :substitute 命令的查找字符串为空,表示当前的查找模式 (用了这么久 vim,每次都嫌查找替换输入原模式麻烦,才发现可以这么玩)
g&
相当于:%s//~/&
:[region]&&
相当于在 region 中,重复上次替换(第一个 & ),用上次的模式(第二个 & )
-
\zs 和 \ze Vim 中也有正则表达式的环视(零宽断言)功能,可以用 \zs 表示开头,用 \ze 表示结尾 比如
a\zsb\ze
只会匹配 ab 当中的 b。 -
查找可以作为 motion
我才发现,原来查找也可以作为 motion,比如可以使用
d/test<cr>
删除到 test 为止。 -
Vim 计算器 在插入模式和命令模式下,都可以用
<C-r> =
打开计算器,里面可以输入 VimScript 表达式,比如2+3
,sin(1)
等表达式。 -
替换中的 ’=‘
替换中的目标模式可以使用 = 后面接 VimScript 表达式,比如可以用下面的方式交换 man 和 dog。
/\v(<man>|<dog>) %s//\={"dog":"man","man":"dog"}[submatch(1)]/g