Cobalah ini. Memetakan kembali @
sehingga g@
(ditambah gerakan boneka l
) digunakan setelahnya, sehingga menjadi operator terakhir dan dapat diulangi .
.
" 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()
Saya sudah mencoba untuk menangani banyak kasus sudut yang saya bisa pikirkan. Anda bisa mengulanginya @:
dengan .
. Hitungan ke @
atau .
dipertahankan untuk pers berikutnya .
.
Ini rumit, dan saya tidak yakin bahwa sesuatu tidak akan pecah di suatu tempat di sepanjang jalan. Jadi tidak ada jaminan, garansi, atau janji dengan yang satu ini.
Secara pribadi, saya baik-baik saja memiliki perbedaan antara pengulangan berbutir halus .
untuk perubahan terakhir, dan pengulangan makro @@
.
EDIT
Saya pikir, setelah sejauh ini, saya mungkin juga menambahkan beberapa kode tambahan yang akan memungkinkan menekan .
segera setelah merekam makro untuk memutarnya kembali.
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