如何解决在 Vim 中,如何对多个文件重复多次替换? 基础知识替代参数列表快速修复列表升级:grep其他列表?!?废除 :SubvertVimcastsTL;DR更多帮助
我有 10 个文件,每个文件包含“apple”和“red”。我想在所有 10 个文件中将“apple”更改为“pear”并将“red”更改为“green”。
我目前的方法是在每个文件中输入此查找和替换命令 :%s/apple/pear/g
(红色到绿色相同)。如何保存这两个替换并将它们应用于 10 个文件。更一般地说,我如何更有效地做到这一点?
我是 vim 新手,不确定是查看命令历史记录还是 vim 寄存器或其他内容。
解决方法
基础知识
Vim 没有提供项目范围的查找和替换。归结为执行以下步骤:
- 创建您要处理的文件列表
- 对列表中的每个文件运行您的命令
替代
您可以使用 |
一个接一个地运行多个命令。
示例
:s/apple/pear/ | s/red/green/
既然您更新了这些文件,最好也:write
或:update
文件
:s/apple/pear/ | s/red/green/ | update
替换标志:
- 使用
g
表示“全局”或每行进行多次替换 - 使用
e
抑制错误。我们需要这个,因为例如一个文件可能有apple
但没有red
:s
使用类似 1,3
的范围来处理第 1 行到第 3 行。$
表示最后一行编号。整个文件是1,$
。使用 %
作为 1,$
:%s/apple/pear/ge | %s/red/green/ge | update
想法:
- 可能想在您的模式周围使用
\<
和\>
。例如。red
模式作为red
可以使用不同的词,例如predicate
- 可能需要考虑案例
参数列表
如果您使用要处理的文件列表启动 Vim,那么这些文件已经在参数列表中
$ vim file*.txt
您可以在 vim 启动后通过 :args
或 :argadd
提供参数。例如:args file*.txt
使用:args
查看参数列表
使用 :argdo {cmd}
运行您的命令,{cmd}
遍历参数列表中的所有文件
快速修复列表
通常您想在一组文件中搜索一个模式,然后对这些匹配进行替换。 Vim 的 :vimgrep
& :grep
搜索文件并将这些位置放入 Quickfix List
:vimgrep /apple\|red/ **/*.txt
您可以使用 :copen
或 :clist
查看快速修复列表。
使用 :cdo {cmd}
/:cfdo {cmd}
对 quickfix 列表中的每个位置/文件运行命令 {cmd}
:cfdo %s/apple/pear/ge | %s/red/green/ge | update
:cdo s/apple/pear/e | s/apple/pear/e | update
升级:grep
:grep
将使用 'grepprg'
& 'grepformat'
来执行和读取程序的输出,如 grep
(Linux 上默认使用)。这通常比 :vimgrep
快,但代价是使用不同的正则表达式语法。
您可以使用 ripgrep 或 ag the silver searcher 之类的东西,而不是使用 grep
作为您的 'grepprg'
,它们通常比普通的 grep
更快。
ripgrep 的配置选项示例:
set grepprg=rg\ --vimgrep
set grepformat=%f:%l:%c:%m
现在您可以执行 :grep 'apple\|red'
来填充快速修复列表
如果您愿意,您甚至可以更进一步running :grep
in a subshell
其他列表?!?
Vim 有其他列表,如:缓冲区、窗口、标签、位置列表。它们有一个关联的“do”命令::bufdo
、:windo
、:tabdo
、:ldo
废除 :Subvert
虽然不需要插件来跨文件进行此类替换,但了解 Tim Pope 的 vim-abolish 插件可能会很方便。特别是如果您有许多这些替换和/或有大小写问题。废除的 :Subvert
/:S
命令可以将您的替换命令减少到 1 个命令
:%S/{apple,red}/{pear,green}/gw
这将转换 apple
-> pear
和 red
-> green
,因为它们位于花括号内。
使用 :Subvert
的 w
标志仅替换单词。 Subvert 也会处理案例
Vimcasts
以下是一些相关的 Vimcasts 集:
- Meet the arglist
- Populating the arglist
- Using :argdo to change multiple files
- Search multiple files with :vimgrep
-
Project-wide find and replace(注意
:cdo
/:cfdo
现在在 Vim 中) - Supercharged substitution with :Subvert
TL;DR
使用 :vimgrep
搜索并使用 :cfdo
进行替换
:vimgrep /apple\/red/ *.txt
:cfdo %s/apple/pear/ge | %s/red/green/ge | update
更多帮助
使用 Vim 的帮助系统阅读更多内容
:h argument-list
:h :argdo
:h :args
:h quickfix.txt
:h :cdo
:h :cfdo
:h :vimgrep
:h :grep
:h 'grepprg'
:h 'grepformat'
,
您可以使用 :argdo
或 :bufdo
等命令对多个文件重复相同的 Ex 命令。 (见:help :argdo
。)
例如,您可以通过将 10 个文件作为参数传递给 Vim 来打开它们。如果它们都是 *.txt
文件,您可以使用:
$ vim *.txt
然后你可以使用 :argdo
对 Vim 作为参数的所有文件重复操作:
:argdo %s/apple/pear/eg | update
请注意,我在操作结束时添加了一个 | update
,以便在执行替换后为每个文件保存文件。这很重要,否则 :argdo
会在移动到下一个文件之前出错。 (参见 :help :update
,它类似于 :w
,但仅在有修改时保存。|
是 Vim 中 Ex 命令的命令分隔符。)
使用 | update
的替代方法是使用 :set hidden
,它允许您在继续编辑下一个文件之前开始编辑另一个文件。 (请参阅 :help 'hidden'
。)您可以稍后使用 :wall
在完成所有地方的修改后写入所有文件。
最后,我将额外的 /e
标志传递给替换,以防止在没有匹配替换时产生错误。 (见:help :s_e
。)
您还可以使用 |
作为分隔符来链接多个命令(例如替换命令)。例如:
:set hidden
:argdo %s/apple/pear/eg | %s/red/green/eg
:wall
,
quickfix-reflector 允许您在 quickfix 中编辑结果并将这些编辑应用回原始文件。
- 像往常一样使用
:grep
在您的项目中搜索匹配项 (:grep apple -R .
) -- 或您想要填充快速修复程序的任何方法。 - 编辑快速修复。 (
:%s/apple/pear/ge | %s/red/green/ge
) - 保存快速修复缓冲区。 (
:w
) - 现在您的所有文件都已修改(或者快速修复在无法更新的行旁边显示 ERROR)。
通常,quickfix 不是“可修改的”,但是 quickfix-reflector 会修改该设置并添加一个钩子以在保存时传播更改。有几个替代插件提供了类似的功能,这对您的工作流程来说是一个巨大的变化!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。