chengzi@blog:/posts$ cat /posts/vim-tricks.md

《Vim 实用技巧》阅读心得

Date
2024-08-24
Tags
vim trick

最近读了读 Drew Neil 的 《Vim 使用技巧》,得到了一些收获。

  1. 当多种方式可以达到相同目的,思考应该采用哪种方式

    举个例子,应该尽可能使用 ‘daw’ 而不是 ‘dbx’, ‘vbx’, 虽然都是 3 次按键,但是 ‘daw’ 可以被 ’.’ 重复, 应该多考虑可重复的过程是不是满足点范式,一个按键移动,一个按键(通常是 ’.‘)修改。

  2. :normal 命令

    有的时候记不住普通模式所对应的 Ex 命令或者 函数调用,直接使用 normal 命令是个很好的选择。

  3. 宏的并行执行

    宏有两种执行模式,一种是串行执行,比如说在宏的结尾加一个 ‘j’,但是如果宏没编写好,或者中间的文本不匹配, 可能就会出现错乱,可以想办法变成并行模式,比如录制的宏并不包括切换到下一行 ‘j’ 或者下一个 buffer 的命令, 然后采用了 :'<,'>normal @a 或者 bufdo 的方式进行循环。

  4. 最大化当前 Window

    平时我会经常用 tmux 的 <C-b>z 的方式最大化当前窗格,vim 对应的做法应该是新开一个 Tab,把当前 Buffer 打开, 但是有时候也想在当前 Tab 最大化当前 Window,做法是使用快捷键 <C-w>| 或者 <C-w>_

  5. 模式中的 ’<’ ’>‘

    模式 <the> 可以只匹配 the,但是不匹配 them,我们平时在 normal 模式按 * 的时候,可以观察状态栏, 默认是使用了 ’<>‘。

  6. 重复替换

    • :substitute 命令的查找字符串为空,表示当前的查找模式 (用了这么久 vim,每次都嫌查找替换输入原模式麻烦,才发现可以这么玩)
    • g& 相当于 :%s//~/&
    • :[region]&& 相当于在 region 中,重复上次替换(第一个 & ),用上次的模式(第二个 & )
  7. \zs 和 \ze Vim 中也有正则表达式的环视(零宽断言)功能,可以用 \zs 表示开头,用 \ze 表示结尾 比如 a\zsb\ze 只会匹配 ab 当中的 b。

  8. 查找可以作为 motion

    我才发现,原来查找也可以作为 motion,比如可以使用 d/test<cr> 删除到 test 为止。

  9. Vim 计算器 在插入模式和命令模式下,都可以用 <C-r> = 打开计算器,里面可以输入 VimScript 表达式,比如 2+3, sin(1) 等表达式。

  10. 替换中的 ’=‘

    替换中的目标模式可以使用 = 后面接 VimScript 表达式,比如可以用下面的方式交换 man 和 dog。

    /\v(<man>|<dog>)
    %s//\={"dog":"man","man":"dog"}[submatch(1)]/g