【问题标题】:vim: Search & replacevim:搜索和替换
【发布时间】:2014-11-07 21:55:23
【问题描述】:

我正在寻找一种简单的方法来搜索和替换 vim 中的内容,作为重构的“解决方法”。

在其他一些 stackoverflow-question 中,我发现了这个 sn-p 代码:

nnoremap gR gD:%s/<C-R>///gc<left><left><left>

我认为 gD 会在整个文档中选择光标下的当前单词,然后 %s 在我输入替换模式后搜索并替换匹配项。 gc 代表全局确认?!

但是:这并没有按预期工作。例如,在我的一些 python 类中,我可以轻松地重命名整个文件中 self 的出现,但它不适用于长度为 1 的方法标识符或字段标识符。

def __init__(self):
    self.test = []
    self.A = []
    ...

所以 self 可以使用这个 sn-p 进行更改,但是在字段 A 上执行 gR 根本不起作用。

我怎样才能让这项工作在一个文件上进行简单的搜索和替换?

任何有关智能重构的技巧也将不胜感激。经过数小时的搜索,我刚刚找到了主要适用于 C 文件的插件和解决方法,但我至少还需要 Java、Python 和 PHP 兼容性。

感谢您的每一个回答:)

更新:我最近发现如果初始选择的模式位于行首,它就可以工作。如果该模式位于该行的中间某处,则它不起作用...有什么想法吗?

【问题讨论】:

    标签: search vim replace refactoring


    【解决方案1】:

    gD 是“转到全局声明”,请参阅:help gD

    映射:

    • gD跳转到缓冲区中光标下第一次出现的单词,

    • %s/填充命令行,意思是“替换整个缓冲区”,

    • 后跟gD使用的搜索模式,插入&lt;C-r&gt;/

    • 一对空斜线,//,用于替换,

    • 标志 gc 表示“在每场比赛中发挥你的魔力并要求确认”,

    • 然后转到&lt;left&gt;&lt;left&gt;&lt;left&gt; 将光标放在// 之间,准备好输入替换内容。

    无论光标下的单词有多长,该映射都完全按照它声称的那样做。


    Vim 不是 IDE,不要指望任何“智能”。

    【讨论】:

    • 感谢您的解释和快速回答:) 但实际上,如果我在光标位于 self 上时按 gR,它会按预期工作,在 A 上做同样的事情 from self.A 它只是突出显示文件中的每个 A 字段,但不提供填充搜索和替换内容的命令行。命令行简直是空的……?
    • 编辑:一个长度的变量也可以工作,但仅当最初出现在行首时。除此之外:像 append 之类的长词或东西 not 如果它们位于一行中间的某个位置,它们也不起作用......有什么想法吗?
    • gD 光标下的单词在缓冲区中第一次出现时出错。
    • 哦,是的,确实...如何解决这个问题?
    • 我已将其更改为 nnoremap gR *:%s/&lt;C-R&gt;///gc&lt;left&gt;&lt;left&gt;&lt;left&gt; 并且它似乎有效...我可以忍受这个还是使用 * 产生任何副作用?
    猜你喜欢
    • 2011-05-04
    • 2019-06-21
    • 1970-01-01
    • 2015-02-15
    • 2015-11-13
    • 1970-01-01
    • 2011-11-09
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多