【问题标题】:Vim find and replace multiple lines in whole projectVim 在整个项目中查找和替换多行
【发布时间】:2020-09-29 23:13:13
【问题描述】:

我有这样的代码:

        item = QStandardItem(self.list.icon, name)
        self.list.model.appendRow(item)
        self.list.model.sort(0)

我想用这个替换它:

        add_database(self.list, name)

我想在我的整个项目(即它的目录)中这样做。 我使用fzfferret vim 插件,它们能以某种方式帮助我吗?

【问题讨论】:

  • 我看到self,猜是python代码。 “自动”执行此操作不是一个好主意。因为一旦缩进被破坏,你的代码将不再工作。
  • 嗯,是的,但我处理得很聪明,关键是我如何替换很多行?在vim中甚至可能吗?这个例子是 python 代码,但是如果我需要这样的东西,而不是在 python 中呢?

标签: search vim replace


【解决方案1】:
  1. 使用 args 命令在 vim 中打开所需文件:

    args project_dir/**/*.py

  2. 对所有打开的文件执行替换:

argdo %s;\(\s*\)item = QStandardItem(self.list.icon, name)\n\1self.list.model.appendRow(item)\n\1self.list.model.sort(0);\1add_database(self.list, name);g

Kent 注意到,它保留了缩进,这在 Python 中很重要。

\n 是这里的换行符。

\1 是群组召回。

查看帮助主题了解更多信息:

:h :args
:h :argdo

【讨论】:

  • 非常感谢!我知道所有这些命令,只是我无法构造正确的正则表达式。
  • 它不起作用,它说:非法反向引用,建议?
  • 我知道你需要使用这个^\(\s*\)item = QStandardItem(self.list.icon, name)\n\1self.list.model.appendRow(item)\n\1self.list. model.sort(0) 正则表达式,无论如何感谢你的想法!并且不要忘记修正您的答案,以便我将其标记为正确的答案。
  • 哦,抱歉,从历史记录中复制了错误的命令,忘记了前导反斜杠。
  • 哈,更有趣!我复制了正确的命令,但 StackOverflow 消息编辑器由于某种原因无法对其应用“代码块”。前导空格没有用,但是用单引号手动包围就可以了。恕我直言,在正则表达式中前导 ^ 也不重要。
【解决方案2】:

如果您使用 ripgrep,您可以从命令行执行此操作:rg -l 'my_search' | xargs sed -i '' -e 's/my_search/my_new_value/'

或者,如果您想要 in-vim 解决方案,这也可以::cfdo %s/my_search/replacement/gc:cdo update 进行更新。

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 2019-09-19
    • 2013-11-28
    • 2016-11-15
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多