Vimsearch并replace选定的文本

假设我们有一个文本,然后进入可视模式并select一些文本。 如何快速search突出显示的文本并将其replace为其他内容?

尝试执行以下内容或将其放入.vimrc

 vnoremap <Cr> "hy:%s/<Cr>h//gc<left><left><left> 

通过在可视模式下按ctrl + r ,会提示您input要replace的文本。 按回车 ,然后确认您同意y的每个更改,或者用n来拒绝。

这个命令将覆盖你的寄存器h所以你可以select另一个(通过改变上面的命令中的h到另一个小写字母),你不使用。

这种快速和简单的映射search视觉突出显示的文本(不覆盖h寄存器),而不使用terminal相关的+寄存器:

 " search for visually hightlighted text vnoremap <cf> y<ESC>/<cr>"<CR> 

如果你不喜欢按Ctrl-F改变你的喜好

一旦突出显示文本,您只需input以下内容即可进行翻译:

 %s//<your-replacement-string> 

…因为s命令上的空白search使用上次search的string。

被接受的答案很有效,除非你的视觉select中有特殊的字符。 我把两个脚本( Jeremy Cantrell贴在这里和Peter Odding的脚本)做了一个命令,让你可以直观地select一个你想查找的string,即使它里面有特殊的正则expression式字符。

 " Escape special characters in a string for exact matching. " This is useful to copying strings from the file to the search tool " Based on this - http://peterodding.com/code/vim/profile/autoload/xolox/escape.vim function! EscapeString (string) let string=a:string " Escape regex characters let string = escape(string, '^$.*\/~[]') " Escape the line endings let string = substitute(string, '\n', '\\n', 'g') return string endfunction " Get the current visual block for search and replaces " This function passed the visual block through a string escape function " Based on this - https://stackoverflow.com/questions/676600/vim-replace-selected-text/677918#677918 function! GetVisual() range " Save the current register and clipboard let reg_save = getreg('"') let regtype_save = getregtype('"') let cb_save = &clipboard set clipboard& " Put the current visual selection in the " register normal! ""gvy let selection = getreg('"') " Put the saved registers and clipboards back call setreg('"', reg_save, regtype_save) let &clipboard = cb_save "Escape any special characters in the selection let escaped_selection = EscapeString(selection) return escaped_selection endfunction " Start the find and replace command across the entire file vmap <leader>z <Esc>:%s/<cr>=GetVisual()<cr>/ 

如果这对于任何人来说都更有用,我已经将它包含在了我的vimrc中 。

这个工作也(至less对于单行/select不包含任何特殊字符的select)

  • 在可视模式下select文本
  • y抽出文本
  • :s/<Cr>0/

0是registry。

正如其他人所说,有更快的方法来做到这一点,但如果你刚开始学习Vim(像我一样),这是“通用”的方法之一。

//编辑:我刚刚意识到,如果在select中有像制表符或换行符或/字符这样的字符,“注册”方法将失败(为了使用:s命令,我必须以某种方式手动处理这些字符工作):

在这里输入图像说明

Mykola Golubyev,谢谢你的提示! 以下使用“+”寄存器(取决于您的terminal)已包含突出显示的文本,保存使用“h”寄存器。

 vnoremap <Cr> <Esc>:%s/<Cr>+//gc<left><left><left> 

http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection

当视觉select文字时,按:input一个命令。 命令行会自动进入范围:

 :'<,'> 

您可以input一个命令,例如s / red / green / g,将最后一个视觉select的所有行中的每个红色replace为绿色。 该命令将显示为:

 :'<,'>s/red/green/g 

要对先前选定的块重复执行Ex命令,请使用:history。 也就是说,按:然后编辑以前的命令。

我有这个在我的vimrc:

 function! GetVisual() range let reg_save = getreg('"') let regtype_save = getregtype('"') let cb_save = &clipboard set clipboard& normal! ""gvy let selection = getreg('"') call setreg('"', reg_save, regtype_save) let &clipboard = cb_save return selection endfunction vmap <leader>z :%s/<cr>=GetVisual()<cr>/ 

这将抓住视觉select,并开始一个替代命令。

编辑:我应该指出,这不适用于多行视觉select。 虽然GetVisual()返回它没有问题,我不知道如何正确地把它放到命令行。 如果任何人有任何提示,我可能会这样做,请评论。

我不认为你可以做到这一点。 但很多人喜欢这个function,所以有很多的macros(如我自己添加)。 例如,您可以添加以下内容: 只需按*即可search可视化select的文本上的下一个匹配项。

我最喜欢的短版本是

vnoremap s / y:s /“/

然后你可以突出显示一个select,然后点击s /开始replace命令。

我没有代表评论,所以我又添加了另一个答案…

vnoremap <Cr> "0y<Esc>:%s/<Cr>0//g<left><left>

@dmd和@dotancohen:这个工作对我没有用"h (明确地使用0,这是最后一个yank位置),并与腻子ssh – >薄荷(lmde);不知道分% Niloct和@Nathan Friend的评论删除确认。

从Vim 7.4开始,可以使用gn动作来select与当前search模式相匹配的文本区域。

使用cgn改变当前选中匹配的文本(或dgn删除)后,在正常模式下,可以使用. 重复命令并在下一场比赛中进行操作。

有一集Vimcast展示了这个function。

用星号引用select,将光标保持在select的开始位置。

 :%s,\%#\%V\_.*\%V/,**&**,c 

用base64replace选定的文本:

 :%s!\%#\%V\_.*\%V!\=system("base64 -w 0",@")!c 

说明LHS:

 \%# matches cursor \%V matches inside the selection only \_. matches any character. \_.* matches beginning to end of selection. 

说明RHS:

 \=expr() Replace match with result of expr() for each substitution. 

不知道,\%V是这样做的最好方法。