closes: #16944 Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
40 lines
1.2 KiB
VimL
40 lines
1.2 KiB
VimL
vim9script
|
|
|
|
# Highlight Yank plugin
|
|
# Last Change: 2025 Mar 22
|
|
|
|
def HighlightedYank()
|
|
|
|
var hlgroup = get(g:, "hlyank_hlgroup", "IncSearch")
|
|
var duration = min([get(g:, "hlyank_duration", 300), 3000])
|
|
var in_visual = get(g:, "hlyank_invisual", true)
|
|
|
|
if v:event.operator ==? 'y'
|
|
if !in_visual && visualmode() != null_string
|
|
visualmode(1)
|
|
return
|
|
endif
|
|
# if clipboard has autoselect (default on linux) exiting from Visual with
|
|
# ESC generates bogus event and this highlights previous yank
|
|
if &clipboard =~ 'autoselect' && v:event.regname == "*" && v:event.visual
|
|
return
|
|
endif
|
|
var [beg, end] = [getpos("'["), getpos("']")]
|
|
var type = v:event.regtype ?? 'v'
|
|
var pos = getregionpos(beg, end, {type: type, exclusive: false})
|
|
var m = matchaddpos(hlgroup, pos->mapnew((_, v) => {
|
|
var col_beg = v[0][2] + v[0][3]
|
|
var col_end = v[1][2] + v[1][3] + 1
|
|
return [v[0][1], col_beg, col_end - col_beg]
|
|
}))
|
|
var winid = win_getid()
|
|
timer_start(duration, (_) => m->matchdelete(winid))
|
|
endif
|
|
enddef
|
|
|
|
augroup hlyank
|
|
autocmd!
|
|
autocmd TextYankPost * HighlightedYank()
|
|
augroup END
|
|
# vim:sts=2:sw=2:et:
|