Hãy thử cái này Nó ánh xạ lại @
để g@
(cộng với một chuyển động giả l
) được sử dụng sau đó, do đó trở thành toán tử cuối cùng và có thể lặp lại với .
.
" 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()
Tôi đã cố gắng xử lý nhiều trường hợp góc như tôi có thể nghĩ ra. Bạn có thể lặp lại @:
với .
. Đếm đến @
hoặc .
được giữ lại cho các lần nhấn tiếp theo của .
.
Điều này thật khó khăn và tôi không tin rằng một cái gì đó sẽ không bị phá vỡ ở đâu đó trên đường đi. Vì vậy, không có bảo đảm, bảo hành, hoặc lời hứa với điều này.
Cá nhân, tôi không có sự khác biệt giữa các lần lặp lại chi tiết .
cho lần thay đổi cuối cùng và các lần lặp lại vĩ mô của @@
.
BIÊN TẬP
Tôi hình dung, đã đi xa đến mức này, rằng tôi cũng có thể thêm một số mã bổ sung sẽ cho phép nhấn .
ngay lập tức sau khi ghi macro để phát lại.
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