Vim:全局搜索和替换,从光标位置开始

bas*_*eln 109 vim search replace

当我搜索时

/\vSEARCHTERM
Run Code Online (Sandbox Code Playgroud)

Vim从光标位置向下开始搜索,它将环绕到顶部.但是在搜索和替换时使用

:%s/\vBEFORE/AFTER/gc
Run Code Online (Sandbox Code Playgroud)

Vim从文件的顶部开始.

有没有办法让Vim从光标位置开始搜索和替换,一旦到达终点就会回到顶部?

Pet*_*ker 160

您已经在使用范围,%这是1,$表示整个文件的简写.要从当前行到最后使用.,$.期间表示当前行,$表示最后一行.所以命令是:

:.,$s/\vBEFORE/AFTER/gc
Run Code Online (Sandbox Code Playgroud)

但是.可以假定当前行或当前行可以删除:

:,$s/\vBEFORE/AFTER/gc
Run Code Online (Sandbox Code Playgroud)

有关更多帮助请参阅

:h range
Run Code Online (Sandbox Code Playgroud)

  • 即使它不是OP所寻求的,这对我非常有帮助,谢谢! (9认同)
  • 对于"接下来的十行":`10:s/pattern/replace/gc` (7认同)

ib.*_*ib. 48

使用两步替换来实现行为并不困难:

:,$s/BEFORE/AFTER/gc|1,''-&&
Run Code Online (Sandbox Code Playgroud)

首先,对从当前行到文件结尾的每一行运行替换命令.然后,使用该:substitute命令以相同的搜索模式,替换字符串和标志重复该:&命令.然而,后者在从文件的第一行到已设置先前上下文标记的行的行的范围上执行替换,减去1.由于第一个 :substitute命令在开始实际替换之前存储光标位置,因此寻址''的行是在运行该替换命令之前的当前行.

请注意,当第一个命令的|图案或标志被更改时,第二个命令(符号后面)不需要任何更改.

  • 天啊,所有这些任意角色甚至意味着什么.你是怎么知道的? (8认同)
  • 如果你把它放在一个键映射中,不要忘记(就像我做的那样)逃避管道。 (2认同)
  • @Tropilio:那么你可以尝试这样的事情: `:noremap <leader>R :,$s///gc\|1,''-&&<cb><right><right><right><right>` 。它将 `:,$s///gc|1,''-&&` 放入命令行中,并将光标放在前两个斜杠符号之间。输入所需的模式和替换后,您可以按 *Enter* 运行生成的命令。 (2认同)

mb1*_*b14 46

%1,$
(Vim help => :help :%等于1,$(整个文件)的快捷方式.)

. 是光标位置,所以你可以做

:.,$s/\vBEFORE/AFTER/gc
Run Code Online (Sandbox Code Playgroud)

从文档的开头替换到光标

:1,.s/\vBEFORE/AFTER/gc
Run Code Online (Sandbox Code Playgroud)

等等

我强烈建议您阅读有关范围的手册,:help range因为几乎所有命令都适用于范围.


q33*_*r49 5

我终于想出了一个解决方案,即退出搜索会回到文件的开头而不编写一个巨大的函数......

你不会相信我花了多长时间才想出这个。只需添加是否换行的提示:如果用户q再次按下,则不换行。所以基本上,通过点击qq而不是q! (如果您确实想换行,只需键入y。)

:,$s/BEFORE/AFTER/gce|echo 'Continue at beginning of file? (y/q)'|if getchar()!=113|1,''-&&|en
Run Code Online (Sandbox Code Playgroud)

我实际上已将其映射到热键。因此,例如,如果要从当前位置开始搜索和替换光标下的每个单词,请使用q*

exe 'nno q* :,$s/\<<c-r>=expand("<cword>")<cr>\>//gce\|echo "Continue at beginning of file? (y/q)"\|if getchar()==121\|1,''''-&&\|en'.repeat('<left>',77)
Run Code Online (Sandbox Code Playgroud)