vim在另一个地方发生更改时替换字符串

时间:2015-06-23 10:54:55

标签: vim

说,我有一个文件:

printf

如果我将第一行中的单词int main(int argc, char* argv[printf("Hello there!")]){/*...*/} 更改为Program foo <program text> End Program foo (可能不是文件的第一行),最后一行{{1>还会自动更改为foo吗?

4 个答案:

答案 0 :(得分:1)

您可以使用全局命令以及查找和替换来标记应该替换的区域的开始停止

:g/^Program foo$/.,/foo$/s//bar

<强>击穿

:g                    Starts the global command
/^Program foo$        Search for Program foo where the line starts with Program and ends with foo
/.,/foo$/             for each mach, expand the rang until the next foo at the end of the line
s//bar                substitute your last search results with bar

答案 1 :(得分:0)

我通常做以下事情:

  • 将光标移到要更改的名称上
  • *#(分别向前或向后搜索此单词,整个单词,因此仅在您的示例中{{找到1}}次发生,而不是foofoobar
  • 更改名称:myfoo
  • 重复完成:按caw<new name><ESC>跳转到下一个可能的位置,按n重复更改名称操作

你也可以使用.之类的单一搜索和替换命令,然后在每:%s/\<foo\>/new_name/gc次出现时按yn,但我个人更喜欢以上方法,因为它使我免于键入foo并且不记得将foo\<放在它周围(\> / #为我这样做。)

如果您确定要将*的所有次出现替换为foo,则可以省略搜索中的bar onfirm标记 - 和-replace命令,这将是我能想到你做的事情的最短路。

答案 2 :(得分:0)

你可以尝试这个插件,我认为这正是你想要的:

https://github.com/terryma/vim-multiple-cursors

答案 3 :(得分:0)

假设您的光标在程序名称上,这可以很容易地完成。

  1. 更改计划名称:

    ciW
    foobar<Esc>
    
  2. 转到程序结束:

    /End<CR>
    $
    
  3. 重复更改:

    .