Answers:
试试看。它将重新映射,@
以便随后使用g@
(加上伪动作l
),从而成为最后一个运算符,并用重复.
。
" 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()
我已经设法处理了尽可能多的极端情况。您可以重复@:
使用.
。计数@
或.
保留以供以后按.
。
这很棘手,而且我不相信某些东西不会在途中破裂。因此,对此没有任何保证,担保或承诺。
就我个人而言,我可以.
在最后一次更改的细粒度重复与的宏重复之间有所区别@@
。
编辑
我认为,到目前为止,我还可以添加一些其他代码,以便.
在录制宏后立即按下以播放它。
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()
.vimrc
.
在录制后立即播放宏。
\<plug>qstop
应该q
在QStart函数之前
重复上一宏,您可以用@@
这样3@@
会本质上运行@q 3倍。但是@击键可能很笨拙,因此在我的.vimrc文件中,我的代码行如下:
"- Lazy macro repeat
nmap <leader>m @@
这使我可以使用前导键(,)加m来运行最后一个宏。然后,您可以在其前面加上一个数字以重复该宏。
现在3,m
等于3@@
。总键数相同,无需按住shift键。
编辑:经过重新考虑,我想到了一个新的宏。
nmap <leader>. @@
当在数字前加上数字也可以使用,因此3,.
现在3@@
很想看看这项工作,以便我可以传递宏字母并让该宏重复而不是最后一个宏。
3@q.
运行@q
6次。这不会那样做。
3@q.
吗?似乎您不妨先加上一个数字。我倾向于在开始宏之前进行搜索,然后n
在宏中使用以跳到可以重播的开始。
Enter