Probieren Sie es aus. Es wird neu zugeordnet, @
so dass g@
(plus eine Dummy-Bewegung l
) danach verwendet wird, wodurch der letzte Operator wird und mit wiederholt werden muss .
.
" 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()
Ich habe versucht, so viele Eckfälle zu behandeln, wie ich mir vorstellen kann. Sie können wiederholen @:
mit .
. Zählt zu @
oder .
wird für nachfolgende Pressen von beibehalten .
.
Das ist schwierig und ich bin nicht davon überzeugt, dass irgendwo auf dem Weg etwas nicht kaputt geht. Also keine Garantien, Gewährleistungen oder Versprechen mit diesem.
Persönlich bin ich in Ordnung, wenn ich einen Unterschied zwischen den feinkörnigen Wiederholungen .
der letzten Änderung und den Makro-Wiederholungen von habe @@
.
BEARBEITEN
Nachdem ich so weit gegangen war, dachte ich mir, dass ich auch zusätzlichen Code hinzufügen könnte, der es ermöglicht, .
unmittelbar nach der Aufnahme eines Makros zu drücken , um es wiederzugeben.
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