假设我们有一段文本,我进入了视觉模式并选择了一些文本。如何快速搜索高亮显示的文本并将其替换为其他内容?
假设我们有一段文本,我进入了视觉模式并选择了一些文本。如何快速搜索高亮显示的文本并将其替换为其他内容?
.vimrc
文件中。vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>
在可视模式下,按下ctrl+r,即可提示输入要替换的文本。按下enter,然后确认是否接受更改,按下 y接受或按下n拒绝。
此命令将覆盖您的寄存器h
,因此您可以选择其他未使用的寄存器(通过将上述命令中的h
更改为另一个小写字母)。
gc
中省略了 c
,则会立即在整个缓冲区中进行替换。如果您犯了一个错误并想撤销它,请在命令模式下键入 u
。我喜欢这种方法比逐个确认替换更好(使用 c
修饰符会发生这种情况)。 - Niloctvmap * y:let @/ = @"<CR>
的意思是选中文本后,执行该命令可以将选中的内容复制到寄存器中,并将其作为搜索模式。 - kevgc
中删除c
的建议,则还必须从该行末尾删除一个<left>
。 - Nathan Friend这个快速简便的映射搜索适用于在视觉上突出显示文本(不覆盖 h 寄存器)且不使用终端相关的 + 寄存器:
" search for visually hightlighted text
vnoremap <c-f> y<ESC>/<c-r>"<CR>
如果你不喜欢Ctrl-F,请将其更改为你喜欢的方式。
一旦文本被突出显示,你可以通过键入以下内容来进行替换:s
ubstitution。
%s//<your-replacement-string>
...因为在s
命令的空白搜索中使用上一次搜索的字符串。
control+f
总是选择下一个字符以及我可视选择的内容。有什么想法吗? - Robert Mark Bram%s//<your-replacement-string>
doesn't seem to work for highlighting something like /tmp/file
. it just becomes <your-replacement-string>/tmp/file
- naisanza这种方法也适用(至少对于单行选择/不包含任何特殊字符的选择)
y
复制文本:s/<C-r>0/
0
是复制寄存器。
正如其他人所提到的,有更快的方法可以完成此操作,但如果您刚开始学习Vim(就像我一样),则这是“通用”方法之一。
//编辑:我刚刚意识到“寄存器”方法将无法处理选择中存在制表符或换行符或/
字符的情况(我必须手动处理这些字符以便:s
命令能够工作):
:%s*<C-r>0*/Users/very/long/path/here/*gc
的命令。 - bosch如果您的可视选择中含有特殊字符,则接受的答案效果很好。我已经组合了两个脚本(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 - https://dev59.com/v3RB5IYBdhLWcg3wQVSV#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/<c-r>=GetVisual()<cr>/
如果对任何人更有用,我已经将这个东西包含在我的vimrc中。
vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left>
(用于替换整个文件中符合条件的文本)。 - Peter Butkovicvmap
吗?无论如何,谢谢,这是一个宝石,看起来可以解决我的问题 https://vi.stackexchange.com/questions/41421/how-to-grab-visual-selection-for-search-but-apply-the-appropriate-escapes 另外,使用 ctrl+R 是聪明的。我没有考虑到视觉模式与正常模式在不同的按键绑定空间中。 - Steven Lugn
命令选择与当前搜索模式匹配的文本区域。cgn
命令更改文本(或使用 dgn
命令删除),在正常模式下,您可以使用 .
命令重复操作并作用于下一个匹配项。gn
扩展可视化选择,然后按下 cgn
,它将立即跳转到插入模式,而不需要等待 gn
。按下 n
然后 .
将此操作应用于以下匹配项。 - dogeen摘自http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection:
当文本被可视化选择时,按下 : 键进入命令模式。命令行将自动输入所选范围:
:'<,'>
您可以输入类似 s/red/green/g 的命令,以将最后一个可视选择中所有行中的每个 red 替换为 green。该命令将显示为:
:'<,'>s/red/green/g
要在之前选择的块上重复执行Ex命令,请使用 : 历史记录。也就是说,按下 : 键,然后按键,接着编辑一个以前的命令。
Mykola Golubyev,感谢您的提示!以下使用“+”寄存器,该寄存器(根据您的终端)已包含高亮文本,因此无需使用“h”寄存器。
vnoremap <C-r> <Esc>:%s/<C-r>+//gc<left><left><left>
我在我的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/<c-r>=GetVisual()<cr>/
这将获取视觉选择并使用它开始替换命令。
编辑:需要指出的是,这不能处理多行视觉选择。虽然GetVisual()没有问题返回它,但我不确定如何正确地将其放入命令行中。如果有人有关于我如何做到这一点的提示,请留言评论。
/\:
。vnoremap // y/\V<C-R>=escape(@",'/\:')<CR><CR>
//
来搜索整个缓冲区中当前选定的文本。