假设我们有一个文本,然后进入可视模式并选择一些文本.如何快速搜索突出显示的文本并将其替换为其他内容?
尝试执行以下操作或将其放入您的 .vimrc
vnoremap"hy:%s/ h//gc
在可视模式下按ctrl+ r,系统将提示您输入要替换的文本.按enter,然后确认您同意y或拒绝的每个更改n.
此命令将覆盖您的寄存器,h
以便您可以选择其他一个(通过h
在上面的命令中更改为另一个小写字母)您不使用.
这种快速简单的映射搜索可以直观地突出显示文本(无需覆盖h寄存器),也无需使用依赖于终端的+寄存器:
" search for visually hightlighted text vnoremapy / "
如果您不喜欢ctrl-f,请将其更改为您的偏好
一旦文本突出显示,您s
只需输入以下内容即可完成ubstitution:
%s//
...因为s
命令的空白搜索使用最后搜索的字符串.
除非您的视觉选择中有特殊字符,否则接受的答案效果很好.我把两个脚本(Jeremy Cantrell在这里发布和Peter Odding的)一起编写了一个命令,它允许你直观地选择你想要找到的字符串,即使它中有特殊的正则表达式字符.
" 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 - /sf/ask/17360801/#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 vmapz :%s/ =GetVisual() /
我把它包含在我的vimrc中,如果这对任何人都更有用.
这个也适用(至少对于一行中的选择/不包含任何特殊字符的选择)
在可视模式下选择文本
把文字拿出来 y
:s/
0
是一个猛烈的注册.
正如其他人提到的,有更快的方法可以做到这一点,但如果你刚刚开始学习Vim(像我一样),这就是'通用'方式之一.
//编辑:我刚刚意识到如果在选择中有像标签或换行符或/
字符这样的字符,那么"注册"方法将会失败(我必须以某种方式手动处理这些字符才能使:s
命令工作):
从Vim 7.4开始,您可以使用gn
选择与当前搜索模式匹配的文本区域的运动.
在使用cgn
更改当前所选匹配(或dgn
删除)中的文本后,在正常模式下,您可以使用.
重复命令并对下一个匹配进行操作.
有一集Vimcast显示这个功能.
Mykola Golubyev,谢谢您的提示!以下使用"+"寄存器(取决于您的终端)已包含突出显示的文本,使用"h"寄存器进行保存.
vnoremap:%s/ +//gc
来自http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection:
视觉选择文本时,按:输入命令.命令行将自动进入范围:
:'<,'>
您可以输入一个命令,例如s/red/green/g,在最后一个视觉选择的所有行中用绿色替换每个红色.该命令将显示为:
:'<,'>s/red/green/g
要对先前选择的块重复Ex命令,请使用:history.也就是说,按:然后编辑上一个命令.