Можно написать функцию, извлекающую совпадение последнего шаблона поиска вокруг курсора, и создать отображение для его вызова.
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/
.