在 Vim 中,如何对多个文件重复多次替换? 基础知识替代参数列表快速修复列表升级:grep其他列表?!?废除 :SubvertVimcastsTL;DR更多帮助

如何解决在 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 快,但代价是使用不同的正则表达式语法。

您可以使用 ripgrepag 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 -> pearred -> green,因为它们位于花括号内。

使用 :Subvertw 标志仅替换单词。 Subvert 也会处理案例

Vimcasts

以下是一些相关的 Vimcasts 集:

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 中编辑结果并将这些编辑应用回原始文件。

  1. 像往常一样使用 :grep 在您的项目中搜索匹配项 (:grep apple -R .) -- 或您想要填充快速修复程序的任何方法。
  2. 编辑快速修复。 (:%s/apple/pear/ge | %s/red/green/ge)
  3. 保存快速修复缓冲区。 (:w)
  4. 现在您的所有文件都已修改(或者快速修复在无法更新的行旁边显示 ERROR)。

通常,quickfix 不是“可修改的”,但是 quickfix-reflector 会修改该设置并添加一个钩子以在保存时传播更改。有几个替代插件提供了类似的功能,这对您的工作流程来说是一个巨大的变化!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-