在VIM中,您可以搜索指定的字符串.然后,您可以按n或N导航下一个或上一个匹配.按n或时N,光标将移动到匹配的文本.我的问题是,如何快速复制光标下匹配的文本?
编辑:
我需要的是光标下的当前匹配,而不是文档中的所有匹配.
谢谢,
您想执行以下操作
y//e
Run Code Online (Sandbox Code Playgroud)
概述:
基本思路是在您搜索或按下n或N光标位于匹配文本的开头.然后你猛拉到最后一次搜索结束.
说明
y 将通过以下动议从当前位置猛拉// 使用最后一个搜索模式进行搜索//e e标志将光标定位在匹配文本的末尾作为警告,这将改变当前的搜索模式,因为它添加了/e标志.因此,跟随n和/或N将光标移动到匹配结束.
这与以下帖子非常相似.
人们可以编写一个函数来提取光标周围最后一个搜索模式的匹配项,并创建一个映射来调用它。
nnoremap <silent> <leader>y :call setreg('"', MatchAround(@/), 'c')<cr>
function! MatchAround(pat)
let [sl, sc] = searchpos(a:pat, 'bcnW')
let [el, ec] = searchpos(a:pat, 'cenW')
let t = map(getline(sl ? sl : -1, el), 'v:val."\n"')
if len(t) > 0
let t[0] = t[0][sc-1:]
let ec -= len(t) == 1 ? sc-1 : 0
let t[-1] = t[-1][:matchend(t[-1], '.', ec-1)-1]
end
return join(t, '')
endfunction
Run Code Online (Sandbox Code Playgroud)
上面的函数确定匹配的开始和结束位置,并仔细取出匹配的文本,正确处理多行模式和多字节字符。
另一种选择是创建文本对象映射(请参阅 参考资料:help text-object),以便对光标下的最后一个搜索模式匹配进行操作。
vnoremap <silent> i/ :<c-u>call SelectMatch()<cr>
onoremap <silent> i/ :call SelectMatch()<cr>
function! SelectMatch()
if search(@/, 'bcW')
norm! v
call search(@/, 'ceW')
else
norm! gv
endif
endfunction
Run Code Online (Sandbox Code Playgroud)
要使用这些映射复制当前匹配,请使用yi/. 对于其他文本对象,也可以使用 来直观地选择它vi/,或者使用 来删除它di/。