精确编辑关键时使用的 Vim 命令
Source: Dev.to
请提供您希望翻译的正文内容,我将为您翻译成简体中文。
Vim tricks that solve real‑world friction
每个 Vim 使用者都会随着时间积累自己的工具箱。下面的命令是我在实际工作中屡次碰到的——不是在教程里,而是在常规方法显得多余一步时出现的。每个技巧都解决了真实的使用摩擦,而不是单纯为了炫技。
1) 能自行停止的递归宏
为什么重要
当你录制一个宏来处理 N 项时,通常需要事先知道 N。大多数人会使用类似 99@q 的大计数并希望足够。递归宏更简洁:它在宏体末尾调用自身,并在序列中的任意命令失败时自动停止——无需计数。
qqq " clear register q
qq{your commands}@qq " record macro and finish with @q
@q " start the loop真实场景
你有一系列行,每行都需要删除首个单词,但不知道有多少行。录制 qqdw0j@qq,然后执行 @q。宏会删除首个单词、移动到列 0、下移一行并递归——直到最后一行的 j 失败,整个链条停止。
注意事项
如果宏陷入无限循环,“ 可以中断它。另外:如果某个命令在行中途而不是文件末尾失败,宏会提前停止。确保你的“停止条件”是工作完成时自然会失败的那条命令。
2) 基于模式的相对偏移在 Ex 范围中
为什么重要
Ex 命令的范围通常使用行号或标记,但 Vim 也允许你用搜索模式加数值偏移来写范围。这意味着你可以对“TODO 注释之后的三行”或“两段标记之间的所有内容”进行操作,而无需知道任何行号。
:/pattern/+N,/other-pattern/-N delete/pattern/+1 形式表示“下一个匹配该模式的行的下一行”。-1 形式表示“上一行”。这些地址可以与任何接受范围的 Ex 命令一起使用::delete、:yank、:move、:copy、:substitute、:normal 等等。
真实场景
一个配置文件用 # BEGIN 和 # END 注释划分区块,你需要删除它们之间的所有内容(不包括标记本身):
:/# BEGIN/+1,/# END/-1delete这是一条完整的命令。无需查找行号,也不需要可视选区。无论块位于文件何处都能工作。
注意事项
如果缓冲区中不存在搜索模式,Vim 会报错。编写此类范围的脚本时,最好用 :silent! 包裹命令或先进行模式检查。另外记住,/pattern/ 是从光标位置向前搜索——当模式出现多次时,光标位置会影响结果。
3) 在输入命令时打开命令行窗口
为什么重要
Vim 的命令行窗口(普通模式下 q:)非常适合编辑和重新执行历史命令。鲜为人知的是,你可以在已经开始键入命令时打开它——在 :s 替换命令的中途按 “,Vim 会把你带到命令行窗口,并加载你半输入的命令,供完整的 Vim 编辑。
" press while in : / ? mode这在任何命令行模式下都有效::、/、? 或 !。进行中的命令会出现在窗口底部,你可以使用任意普通模式的移动来修改它,然后按 “ 执行。
真实场景
你正在键入一个复杂的替换:
:%s/\v(class|module)\s+\zs\w+/这时发现正则表达式在前两个分组里写错了。与其使用 和方向键纠正,不如直接按。命令会在可编辑的缓冲区中打开。使用 F( 跳到左括号,ci( 修正,然后在该行上按 “ 运行。
注意事项
普通模式下的 q: 也会打开命令行窗口,但它只显示历史记录,无法捕获你当前正在键入的内容。“ 专门用于“中途输入”情形。关闭窗口时使用常规的 :q 或 <C‑w>q 即可。
Source: …
dow without running with :q or “.
4) '^ 标记 – 返回到上一次插入的位置
为什么重要
Vim 每次离开 Insert 模式时都会自动更新 ^ 标记。在 Normal 模式下按 '^ 会跳回你按下 “ 时光标所在的确切位置。不同于 gi —— 会跳回并立刻重新进入 Insert 模式 —— '^ 只是一次普通的标记跳转:你可以先到达位置、环视一下,再决定何时开始编辑。
'^真实场景
你正在编辑一个函数,暂时退出去检查上面的相关代码块,然后使用 /search 或 % 进行一些浏览。当你准备返回时,'^ 能直接把你带回到精确的列和行——无需搜索,也不需要 “ 链。随后在真正准备好输入时再按 a 或 i。
注意事项
如果 gi 已经满足你的工作流——跳回并立即开始输入——则没有必要改用 '^。当你想先检查位置,或想在该位置使用某个操作符而不是直接进入 Insert 模式时,'^ 是更合适的选择。该标记是缓冲区全局的:如果你切换了文件,'^ 会切回到另一个缓冲区的相应位置。
5) gP —— 在光标前粘贴,随后光标位于粘贴内容之后
为什么重要
标准的 P 会在光标前粘贴文本,并让光标停留在刚插入内容的第一个字符上。gP 也在同一位置粘贴,但会把光标移动到插入文本之后。这看似细微,却能在每次粘贴后省去额外的 “ 或 l,让你可以直接继续输入。
gP " 在光标前粘贴,然后光标落在粘贴文本之后真实场景
你用 yiw 复制了一个单词,移动到别处后想在当前字符前插入它而不打断打字流。gP 完成插入后,光标已经准备好接受下一个按键。
注意事项gP 在行式/字符式寄存器的行为上与 P 相同,因此关于空白和换行的规则仍然适用。唯一不同的是最终的光标位置。
gP – 在光标后粘贴
当你从多个粘贴中组装内容或在粘贴后立即键入时,gP 消除了原本需要的手动 $ 或 e 移动。
gP进入全屏模式
退出全屏模式
小写的 gp 是 p 的光标后等价操作——行为相同,但光标最终位于粘贴文本之后。
实际场景
你正在通过顺序粘贴三个命名寄存器来构建一行:
"agP"bgP"cgP每次粘贴后光标都会定位在下一个粘贴的位置,因此你可以在不使用任何移动键的情况下,直接位于所有三段文本的末尾。
注意事项
带计数的 gP(如 3gP)会连续粘贴三份,并将光标置于全部三份之后,而不是仅在第一份之后。这是设计如此,通常也是你想要的,但在宏中使用前了解这一点很重要。
总结
这五个命令分布在 Vim 的不同区域——宏、Ex 范围、命令行编辑、标记和粘贴操作——但它们都有一个共同点:每个都省去了一步本来需要手动完成的操作。
- 递归宏消除了计数。
- 模式偏移消除了行号查找。
- “ 消除了尴尬的命令行导航。
'^消除了重新定位光标位置。gP消除了粘贴后光标重新定位。
如果你想了解更多此层次的实用 Vim 技巧,我会在 发表。
还有哪些 Vim 工作流中有你希望跳过的步骤?