VIM增量搜索,如何复制光标下匹配的字符串?

Jus*_*ner 5 vim

在VIM中,您可以搜索指定的字符串.然后,您可以按nN导航下一个或上一个匹配.按n或时N,光标将移动到匹配的文本.我的问题是,如何快速复制光标下匹配的文本?


编辑:

我需要的是光标下的当前匹配,而不是文档中的所有匹配.

谢谢,

Pet*_*ker 7

您想执行以下操作

y//e
Run Code Online (Sandbox Code Playgroud)

概述:

基本思路是在您搜索或按下nN光标位于匹配文本的开头.然后你猛拉到最后一次搜索结束.

说明

  • y 将通过以下动议从当前位置猛拉
  • // 使用最后一个搜索模式进行搜索
  • //e e标志将光标定位在匹配文本的末尾

作为警告,这将改变当前的搜索模式,因为它添加了/e标志.因此,跟随n和/或N将光标移动到匹配结束.

这与以下帖子非常相似.

  • 这是坏蛋. (3认同)

ib.*_*ib. 3

人们可以编写一个函数来提取光标周围最后一个搜索模式的匹配项,并创建一个映射来调用它。

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/