我可以使用.命令重复宏吗?例如,我希望能够键入:

@q...

,并使它有效地调用@q 4次。使用默认行为,仅当'q'持有单个命令(例如dwxiHello<esc>)时,此方法才有效。 (但是,这很有意义,因为'。'会重复最后一次更改,而不是最后一次击键/命令)。

我也很希望这项工作能有所作为。例如,键入:

3@q.


将与运行@q 6次有效相同。如何配置此行为?

评论

并非完全符合您的要求,但也许对github.com/wincent/replay会有所帮助。这将记录最后记录的宏,然后按Enter
重播
仅供参考,@@重复最后一个宏,因此,如果您出于映射之类的目的询问此宏,那么它应该对您有用。

#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

我认为\ qstop应该在QStart函数中的q之前

–史蒂夫·韦尔穆伦(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 , @@