我如何在 Vim 中处理批量文本更改
请提供您希望翻译的完整文本(除了已经给出的 Source 链接外),这样我才能为您准确地进行简体中文翻译。谢谢!
Source:
通过外部命令 (!) 管道文本
Vim 的 ! 操作符会把文本发送到 shell 命令并用该命令的输出替换原文本。
:%!{cmd}– 对整个缓冲区执行该命令。:5,20!{cmd}– 只对第 5‑20 行执行。- 在可视模式下选中后按
!,会自动使用范围:'。
如果命令以非零状态退出或没有产生输出,Vim 会恢复原始缓冲区,从而保证实验的安全性。若命令在执行过程中崩溃,仍需使用撤销 (u)。
示例
:%!jq .
对从终端粘贴的单行 JSON 响应进行格式化。
:%!sort -u
对列表去重。
:%!column -t
对值表格进行对齐。
:5,20!indent
仅格式化第 5‑20 行。
替换中的大小写转换原子
Vim 的替换字符串支持大小写转换原子:
| 原子 | 效果 |
|---|---|
\U | 将后面的所有字符转换为大写 |
\L | 将后面的所有字符转换为小写 |
\u | 仅将下一个字符转换为大写 |
\l | 仅将下一个字符转换为小写 |
\E | 结束之前的 \U/\L 转换 |
结合捕获组,这些原子可以在不使用外部脚本的情况下对标识符进行规范化。
示例
:%s/\v/\u\L\1/g
将每个单词的第一个字符大写,其余字符小写。
:%s/\v(\w+)/\U\1/g
将所有环境变量名转换为大写(例如 SCREAMING_SNAKE、screaming_snake)。
:%s/_\(\w\)/\u\1/g
通过将每个下划线后的字符大写,将 snake_case 转换为 SnakeCase。
:%s/\U\1\E-\2/\U\1-\2/g
仅将第一个捕获组转换为大写,第二个保持不变。
Interactive Search Navigation (incsearch)
使用 incsearch(在 Vim 8+ 和 Neovim 中默认启用),和 让你在 仍处于搜索提示框时 前后跳转匹配项,从而在确认之前预览确切位置。
Usage
- 在普通模式下输入
/pattern。 - 按
跳到下一个匹配项,继续按跳到下下一个,依此类推。 - 按 “ 向后跳转。
- 当想要的匹配项被高亮时,按 “ 接受它。
Example: 在文件中定位到第三个 user 出现的位置:
/user
这样可以避免在大文件中盲目使用 n/N 导航。仅当 incsearch 已设置(:set incsearch)时才有效。
删除结构化块使用全局命令 (:g)
:g(global)命令可以作用于范围,非常适合删除标记的块,例如生成的 HTML 框架或日志段落。
语法
:g/{start_pattern}/,/{end_pattern}/{cmd}
示例
:g//,//d
删除 HTML 注释 和 之间的所有块。
:g/DEBUG START/,/DEBUG END/d
从崩溃日志中剔除所有调试转储。
删除前预览
:g//,//p
打印将被删除的行,以便验证范围。
注意::g 从上到下处理匹配,并在执行过程中更新行号,因此连续的块会被正确处理。如果结束标记出现在起始标记之前,范围可能会意外扩展——请始终先使用 p 进行预览。
在项目中使用 Quickfix (:cdo) 进行重构
:cdo 命令会在 快速修复列表的每个条目 上执行给定的 Ex 命令,从而实现对每一次出现的精确操作。这在使用 :vimgrep(或类似方式)将所有匹配的实例填入快速修复列表后,定位代码库中的所有模式时非常有用。
工作流程
-
填充快速修复列表:
:vimgrep /deprecatedCall/ **/*.go -
对每个匹配执行替换并保存文件:
:cdo s/deprecatedCall/replacementCall/ | update| update在替换后写入文件。- 当正则表达式不足以完成任务时,可使用
:cdo norm @q在每个位置回放已录制的宏。
替代方案
:cfdo会对每个文件执行一次命令(适用于全文件范围的修改)。- 如果同一行在多个搜索结果中出现,
:cdo会包含重复条目。
请记住,:cdo 不会 自动保存文件;除非你想先检查更改,否则务必在命令后追加 | update(或 | w)。
结束语
这五个 Vim 命令——外部管道、大小写转换替换、交互式搜索导航、全局块删除以及基于 quickfix 的重构——覆盖了广泛的批量编辑场景,且无需任何插件。它们在 Vim 和 Neovim 中的行为完全相同。
想了解更多实用的 Vim 小技巧,请访问 。
在 Vim 中,哪项批量编辑任务仍然感觉比预期慢?