Essayez ceci. Il remappe @pour que g@(plus un mouvement factice l) soit utilisé par la suite, devenant ainsi le dernier opérateur et sujet à la répétition avec ..
" When . repeats g@, repeat the last macro.
fun! AtRepeat(_)
" If no count is supplied use the one saved in s:atcount.
" Otherwise save the new count in s:atcount, so it will be
" applied to repeats.
let s:atcount = v:count ? v:count : s:atcount
" feedkeys() rather than :normal allows finishing in Insert
" mode, should the macro do that. @@ is remapped, so 'opfunc'
" will be correct, even if the macro changes it.
call feedkeys(s:atcount.'@@')
endfun
fun! AtSetRepeat(_)
set opfunc=AtRepeat
endfun
" Called by g@ being invoked directly for the first time. Sets
" 'opfunc' ready for repeats with . by calling AtSetRepeat().
fun! AtInit()
" Make sure setting 'opfunc' happens here, after initial playback
" of the macro recording, in case 'opfunc' is set there.
set opfunc=AtSetRepeat
return 'g@l'
endfun
" Enable calling a function within the mapping for @
nno <expr> <plug>@init AtInit()
" A macro could, albeit unusually, end in Insert mode.
ino <expr> <plug>@init "\<c-o>".AtInit()
fun! AtReg()
let s:atcount = v:count1
let c = nr2char(getchar())
return '@'.c."\<plug>@init"
endfun
nmap <expr> @ AtReg()
J'ai essayé de gérer autant de cas d'angle que je peux penser. Vous pouvez répéter @:avec .. Compte @ou .est conservé pour les presses suivantes de ..
C'est délicat et je ne suis pas convaincu que quelque chose ne se cassera pas quelque part en cours de route. Donc, aucune garantie, garantie ou promesse avec celui-ci.
Personnellement, je vais bien avoir une différence entre les répétitions à grain fin de .pour le dernier changement et les répétitions macro de @@.
ÉDITER
J'ai pensé, étant allé aussi loin, que je pourrais aussi bien ajouter du code supplémentaire qui permettra d'appuyer .immédiatement après l'enregistrement d'une macro pour la lire.
fun! QRepeat(_)
call feedkeys('@'.s:qreg)
endfun
fun! QSetRepeat(_)
set opfunc=QRepeat
endfun
fun! QStop()
set opfunc=QSetRepeat
return 'g@l'
endfun
nno <expr> <plug>qstop QStop()
ino <expr> <plug>qstop "\<c-o>".QStop()
let s:qrec = 0
fun! QStart()
if s:qrec == 1
let s:qrec = 0
return "q\<plug>qstop"
endif
let s:qreg = nr2char(getchar())
if s:qreg =~# '[0-9a-zA-Z"]'
let s:qrec = 1
endif
return 'q'.s:qreg
endfun
nmap <expr> q QStart()
Enter