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

时间:2012-01-01 16:50:43

标签: vim

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


编辑:

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

谢谢,

4 个答案:

答案 0 :(得分:7)

您想执行以下

y//e

概述:

基本想法是在您搜索或按nN之后,光标将位于匹配文本的开头。然后你猛拉到最后一次搜索结束。

解释

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

作为警告,这将改变当前的搜索模式,因为它会添加/e标志。因此,关注n和/或N会将光标移动到匹配结尾。

这与以下post非常相似。

答案 1 :(得分: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

上述功能决定了比赛的开始和结束位置 并仔细取出匹配的文本,正确处理多行 模式和多字节字符。

另一种选择是创建文本对象映射(请参阅: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

要使用这些映射复制当前匹配项,请使用yi/。至于其他文字 对象,例如,也可以使用vi/在视觉上选择它, 或使用di/删除它。

答案 2 :(得分:0)

y ,光标下的文本将被复制到已命名的默认寄存器,然后您可以按 p 进行粘贴。

答案 3 :(得分:0)

我想这应该这样做:

command! -register CopyExactMatchUnderCursor call s:CopyExactMatchUnderCursor('<reg>')

function! s:CopyExactMatchUnderCursor(reg)
    let cpos = getpos('.')
    let line = cpos[1]
    let idx = cpos[2] - 1
    let txt = getline(line)

    let mend = matchend(txt, @/, idx)

    if mend > idx
        let sel = strpart(txt, idx, mend - idx)

        let reg = empty(a:reg) ? '"' : a:reg
        execute 'let @' . reg . ' = sel . "\n"'
    end
endfunction

首先用getpos抓取光标位置,然后搜索匹配的结尾(从光标所在的列开始matchend),然后返回提供的寄存器中的子字符串 - 使用默认"

所有必要的方法基本上都在@eckes的答案中。