如何将 gvim 正则表达式应用于多个文件

kar*_*ran 0 regex vim

如何在 gvim 中将正则表达式应用于多个文件?

Pet*_*ker 5

我将假设“应用正则表达式”,意味着通过:s多个文件使用替换。

Vim 没有附带“一体化”本机项目范围的查找和替换命令。相反,它通常是一个两步过程:

  • 收集位置/文件/缓冲区/窗口/选项卡
  • 使用 *do 命令对集合应用命令

参数列表

arg 列表只是一个文件列表。您可以在启动 Vim 时填充它,例如vim *.txt,或者:args在 Vim 启动后通过填充它。

:args *.txt
:argdo %s/foo/bar/g | w
Run Code Online (Sandbox Code Playgroud)

快速修复/位置列表

快速修复(和位置列表)只是位置列表,例如文件、行、列。您可以使用许多命令填充这些列表,例如:vimgrep:grep:make:cexpr等。用于:cdo在每个位置运行命令。:cfdo将对列表中的每个文件运行命令。

:vimgrep /foo/ **/*.txt
:cfdo %s/foo/bar/g | w
Run Code Online (Sandbox Code Playgroud)

许多人喜欢使用,:grep因为您可以自定义'grepprg'使用快速 grep 替代方案,例如The Silver Searcherripgrepack。我还推荐映射 :cnext& :cprev

缓冲器

您可以使用 .在所有打开的缓冲区上运行命令:bufdo。用于:ls查看您打开了哪些缓冲区。

:bufdo %s/foo/bar/g | w
Run Code Online (Sandbox Code Playgroud)

视窗

可以在当前选项卡页中的所有窗口上运行命令:windo。这有助于通过 进行比较:windo diffthis

:windo %s/foo/bar/g | w
Run Code Online (Sandbox Code Playgroud)

选项卡

通过在所有选项卡上运行命令:tabdo

:tabdo %s/foo/bar/g | w
Run Code Online (Sandbox Code Playgroud)

什锦提示

关于更好地查找和替换工作流程的一些想法。

  • 使用该e标志可以防止:s在找不到匹配项时停止。
  • 可能需要提前构建您的搜索模式,然后使用:s//{replacment}以避免再次输入该模式。
  • 考虑使用traces.vim来提供替换的视觉反馈。
  • 与所有项目范围的替换一样,最好使用某种版本控制(例如 git、mercurial、svn),以防出现严重错误。

就我个人而言,我通常使用快速修复列表来进行大多数多个文件替换。我:grep与 ripgrep 一起使用来快速搜索项目。

如需更多帮助,请参阅:

相关Vimcast剧集:

另请参阅:

:h :s
:h :bar
:h arglist
:h :argdo
:h quickfix
:h :cdo
:h :grep
:h :vimgrep
:h 'grepprg'
:h buffer
:h :bufdo
:h window
:h :windo
:h tabpage
:h :tabdo
Run Code Online (Sandbox Code Playgroud)