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是这样做的最好方法。