新增:事件-复制时高亮
This commit is contained in:
102
layers/base/events/hlyanked.vim
Normal file
102
layers/base/events/hlyanked.vim
Normal file
@ -0,0 +1,102 @@
|
||||
vim9script noclear
|
||||
|
||||
# Highlight yanked text.
|
||||
# Maintainer: Ubaldo Tiberi
|
||||
# License: BSD3-Clause
|
||||
# GetLatestVimScripts: 6075 1 :AutoInstall: hlyanked.vim
|
||||
|
||||
if !has('vim9script') || v:version < 900
|
||||
finish
|
||||
endif
|
||||
|
||||
if exists('g:hlyanked_loaded')
|
||||
finish
|
||||
endif
|
||||
g:hlyanked_loaded = 1
|
||||
|
||||
if !exists('g:hlyanked_hlgroup')
|
||||
g:hlyanked_hlgroup = 'Visual'
|
||||
endif
|
||||
|
||||
if !exists('g:hlyanked_timeout')
|
||||
g:hlyanked_timeout = 400
|
||||
endif
|
||||
|
||||
if !exists('g:hlyanked_save_yanks')
|
||||
g:hlyanked_save_yanks = true
|
||||
endif
|
||||
# ----------------------------------------------------
|
||||
# The real deal follows
|
||||
|
||||
var timer_id = -1
|
||||
var match_id = -1
|
||||
|
||||
def HighlightYanked()
|
||||
# Remove leftover timers and highlights
|
||||
KillHighlight()
|
||||
|
||||
# Get extremes of yanking: start = (l0, c0), end = (l1, c1)
|
||||
var l0 = line("'[")
|
||||
var c0 = col("'[")
|
||||
var l1 = line("']")
|
||||
|
||||
var delta = 0
|
||||
if l0 == l1
|
||||
delta = len(v:event.regcontents[-1]) - (col("']") - c0)
|
||||
endif
|
||||
|
||||
var c1 = col("']") + delta
|
||||
|
||||
# For understanding the following regex read :h \% and mind that \_.* are
|
||||
# all characters including new lines.
|
||||
# The regex reads:
|
||||
# 'Take all characters, including newlines, from (l0,c0) to (l1,c1)'
|
||||
var match_pattern = $'\%{l0}l\%{c0}c\_.*\%{l1}l\%{c1}c'
|
||||
match_id = matchadd(g:hlyanked_hlgroup, match_pattern)
|
||||
timer_id = timer_start(g:hlyanked_timeout, 'RemoveHighlight')
|
||||
enddef
|
||||
|
||||
def RemoveHighlight(timer: number)
|
||||
if match_id != -1
|
||||
matchdelete(match_id)
|
||||
match_id = -1
|
||||
endif
|
||||
enddef
|
||||
|
||||
def StopTimer(timer: number)
|
||||
if timer_id != -1
|
||||
timer_stop(timer_id)
|
||||
timer_id = -1
|
||||
endif
|
||||
enddef
|
||||
|
||||
def KillHighlight()
|
||||
StopTimer(timer_id)
|
||||
RemoveHighlight(match_id)
|
||||
enddef
|
||||
|
||||
augroup HighlightYanked
|
||||
autocmd!
|
||||
autocmd TextYankPost * if !v:event.visual && v:event.operator == 'y' && !empty(v:event.regtype)
|
||||
| HighlightYanked()
|
||||
| endif
|
||||
augroup END
|
||||
|
||||
augroup KillHighlight
|
||||
autocmd!
|
||||
autocmd WinLeave * KillHighlight()
|
||||
augroup END
|
||||
|
||||
|
||||
def ShiftRegisters()
|
||||
for ii in [8, 7, 6, 5, 4, 3, 2, 1, 0]
|
||||
setreg(string(ii + 1), getreg(string(ii)))
|
||||
endfor
|
||||
enddef
|
||||
|
||||
if g:hlyanked_save_yanks
|
||||
augroup YankShiftRegisters
|
||||
autocmd!
|
||||
autocmd TextYankPost * if v:event.operator == 'y' | ShiftRegisters() | endif
|
||||
augroup END
|
||||
endif
|
@ -1,3 +1,8 @@
|
||||
vim9script
|
||||
|
||||
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
TuiLayer base.options
|
||||
|
||||
# <20><>չ<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD>¼<EFBFBD>
|
||||
TuiLayer base.events
|
||||
|
||||
|
Reference in New Issue
Block a user