.
命令重复宏吗?例如,我希望能够键入:@q...
,并使它有效地调用
@q
4次。使用默认行为,仅当'q'持有单个命令(例如dw
,x
或iHello<esc>
)时,此方法才有效。 (但是,这很有意义,因为'。'会重复最后一次更改,而不是最后一次击键/命令)。我也很希望这项工作能有所作为。例如,键入:
3@q.
将与运行
@q
6次有效相同。如何配置此行为?#1 楼
试试看。它重新映射@
,以便随后使用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()
评论
这太棒了!自发布此问题以来,我的工作流程已更改,因此我真的不希望再使用点重复宏。但是,这确实很好用,所以无论如何我都会接受(尽管我可能不会将其添加到我的.vimrc中)
–詹姆斯
17年6月9日在16:45
不用担心,有趣的问题!
– Antony
17年6月9日在18:23
编辑:允许使用播放宏。录制后立即。
– Antony
17年6月11日在22:24
我认为\
–史蒂夫·韦尔穆伦(Steve Vermeulen)
19/12/13在8:31
#2 楼
要重复最后一个宏,可以使用@@
,因此3@@
实际上会运行@q 3次。但是@击键可能很笨拙,因此在我的.vimrc中,我的代码行如下:最后一个宏。然后,您可以在其前面加上一个数字以重复该宏。 现在
3,m
相当于3@@
。总键数相同,无需按住shift键。编辑:重新考虑后,我想出了一个新的宏。
nmap <leader>. @@
在以数字开头时也可以使用,因此现在是
3,.
很想看看这项工作,以便我可以传递一个宏字母并让该宏重复而不是最后一个宏。评论
OP希望3 @ q。运行@q 6次。这不会那样做。
–user41805
17年2月1日在17:20
重读您的问题,我不确定是否能回答。您能否举例说明何时使用3 @ q。?看来您不妨先加上一个数字。我倾向于在开始宏之前设置搜索,然后在宏中使用n跳转到可以重播的开始。
–阴影
17年2月1日在17:20
#3 楼
您可以在另一个宏中记录对宏的使用,然后重复该操作。qqdwq
qr2@qq
现在,
3@r
就像运行@q
一样。#4 楼
默认情况下,vim中的space
是“已向右移动1个字符”,已经被l
覆盖了,因此我重新映射了空间以从q缓冲区重新运行宏:br />要使用,只需先用
qq
录制宏,再用q
停止录制,然后按space
重播。评论
仅供参考,出于您要声明的原因(这不是必需的密钥),很多人都将空间用作他们的领导者密钥,因此可能没有多少人像您想象的那样拥有空闲空间。 :)
– B层
19年5月11日在6:05
如果您已重新映射dvorak,则为noremap
–埃里克·伍德拉夫(Eric Woodruff)
20-05-16在23:07
#5 楼
因为我不使用,
,并且像一个简单易用的解决方案,所以对我有用::map , @@
评论
并非完全符合您的要求,但也许对github.com/wincent/replay会有所帮助。这将记录最后记录的宏,然后按Enter重播
仅供参考,@@重复最后一个宏,因此,如果您出于映射之类的目的询问此宏,那么它应该对您有用。