我如何在 Vim 中处理批量文本更改

发布: (2026年2月24日 GMT+8 16:35)
6 分钟阅读
原文: Dev.to

请提供您希望翻译的完整文本(除了已经给出的 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_SNAKEscreaming_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

  1. 在普通模式下输入 /pattern
  2. 跳到下一个匹配项,继续按 跳到下下一个,依此类推。
  3. 按 “ 向后跳转。
  4. 当想要的匹配项被高亮时,按 “ 接受它。

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(或类似方式)将所有匹配的实例填入快速修复列表后,定位代码库中的所有模式时非常有用。

工作流程

  1. 填充快速修复列表:

    :vimgrep /deprecatedCall/ **/*.go
  2. 对每个匹配执行替换并保存文件:

    :cdo s/deprecatedCall/replacementCall/ | update
    • | update 在替换后写入文件。
    • 当正则表达式不足以完成任务时,可使用 :cdo norm @q 在每个位置回放已录制的宏。

替代方案

  • :cfdo 会对每个文件执行一次命令(适用于全文件范围的修改)。
  • 如果同一行在多个搜索结果中出现,:cdo 会包含重复条目。

请记住,:cdo 不会 自动保存文件;除非你想先检查更改,否则务必在命令后追加 | update(或 | w)。

结束语

这五个 Vim 命令——外部管道、大小写转换替换、交互式搜索导航、全局块删除以及基于 quickfix 的重构——覆盖了广泛的批量编辑场景,且无需任何插件。它们在 Vim 和 Neovim 中的行为完全相同。

想了解更多实用的 Vim 小技巧,请访问 。

在 Vim 中,哪项批量编辑任务仍然感觉比预期慢?

0 浏览
Back to Blog

相关文章

阅读更多 »

小事,大影响

!尾随逗号示例https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s...