在VIM中,您可以搜索指定的字符串。然后,您可以按 n 或 N 来导航下一个或上一个匹配项。按 n 或 N 时,光标将移动到匹配的文本。我的问题是,如何在光标下快速复制匹配的文本?
编辑:
我需要的是光标下的当前匹配,而不是文档中的所有匹配。
谢谢,
答案 0 :(得分:7)
您想执行以下
y//e
概述:
基本想法是在您搜索或按n
或N
之后,光标将位于匹配文本的开头。然后你猛拉到最后一次搜索结束。
解释
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的答案中。