在命令行中如何停止录制?


19

当我用q完成录制宏时,可以键入:

  • q 在正常或视觉模式下停止录制。
  • <c-o>q 如果我处于插入模式,则停止录制。
  • ..

    如果宏在命令模式下结束,如何停止录制?


您的用例是什么?我真的很好奇:)
PhilippFrank

2
@PhilippFrank我会经常在不同的文本块中搜索相同的模式并将其替换为不同的模式。使用这样的宏,可以自动进行选择程序段,编写实际的搜索模式以及将光标放置在用于键入替换链的正确位置上。当我播放它时,它将选择该块,进入命令模式,键入:'<,'>s/toBeReplaced//g然后将光标置于这两者之间,//以便我要做的就是键入newString<cr>并完成。:)
iago-lito

因此,它就像带有参数的宏。很好的主意,谢谢!
PhilippFrank

@PhilippFrank,是的。我很高兴你喜欢它。:)
iago-lito

Answers:


12

另一种解决方案是在命令行模式下,使用Ctrl-f,然后按q停止记录。

Ctrl-f允许您打开命令行窗口,您可以在其中以普通模式编辑命令。要验证命令,只需使用enter。


因此,添加以下内容后:

cnoremap <c-q> <c-f>i<c-o>q

在中.vimrc,您可以<c-q>在命令模式下停止记录宏。


弗洛朗


您仍然必须^F从宏末尾删除<Cf>字符(),对吗?至少那是我所看到的。
VanLaser 2015年

差不多好了!真的很有用(我不知道命令行窗口,但是很棒),但是..aargh!从插入模式进入此窗口似乎会使您选择的区域松动。有没有办法使您从命令行窗口启动的命令在选定区域上起作用?
iago-lito

@VanLaser否,因为您可以继续在命令行窗口中键入命令。您的宏会像这样qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>q,因此在您键入命令部分时实际上已停止了录制。要使用宏:@qFINISHYOURCOMMAND<cr>,您已完成:无需对其进行编辑。不幸的是,这似乎在视觉模式下不起作用(或者失去了选择)..还是我错过了什么?
iago-lito 2015年

啊,对:)顺便说一句,顺便说一句,我可以选择一个可视范围,然后@q在命令启动时添加该范围'<,'>-只要宏以:....
开头

@ lago-lito实际上,即使您没有看到选择,看起来'<,'>在验证命令时,指定范围(即)仍然与选择匹配。
2015年

17

一种方法是:

  • 像往常一样启动宏(例如qq...其他字符)
  • 当您到达cmdline-mode时,写下您想要的所有字符
  • 您想在此处结束宏。点击ESC退出cmdline模式,q结束宏。
  • ESCq寄存器(*)中删除:您可以将其粘贴到缓冲区中,删除^[字符,再次(按字符顺序)选择整个内容,然后将其拖回寄存器中q
  • 就是这样:运行您的宏:@q

基本上,您对宏进行了一些“后处理”,因为它存储在寄存器中:)

(*)从寄存器中存储的宏中删除最后一个字符的快速方法q是:

:let @q = @q[:-2]

哈哈!到目前为止,这实际上是我的技巧= D。是否没有“规范”的方式?(也更快
iago-lito

我不知道一个,但是我并没有太多使用宏(我更喜欢写小函数)。之后,当我看着宏时,宏对我来说是个神秘的事物。
VanLaser

@VanLaser:能否请您提供更多关于该系列的细节:let @q = @q[:-2]?特别是如何[:-2]工作?:-)
statox

它是“切片”,适用于列表和字符串(这是我在@q上面访问/设置的方式)。这里的
VanLaser

@VanLaser他们真的看起来很神秘。但是,在非常特定的情况下,有必要重复进行一些复杂的小事情,这是有用的..您知道这种问题只会出现一次,并且只会持续几分钟。能够通过动态创建宏来处理它们而不必编写和调试专用功能,这真是太好了!^ ^
iago-lito 2015年

3

阅读了有关用例的评论后,您似乎可以使用键映射而不是宏。

我的.vimrc中有这一行(不记得我在哪里找到的):

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

它与您描述的用例具有类似的效果,将您置于命令行上,因此您唯一要做的就是键入替换并按Enter,但是在这种情况下,替换所有出现在光标下的单词。

要仅在当前块中进行替换,我认为应执行以下操作:

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

当然,您可以将其映射到所需的任何键。

上面的操作:使用未命名的标记标记当前位置,直观地选择当前块,退出可视模式并将光标返回到保存的位置(可视选择标记仍处于设置状态),进入命令模式并键入替换命令,使用插入光标下方的单词<C-r><C-w>,然后定位光标以键入替换项。


是的,我也有这个。但是,在我的特定用例中,toBeReplaced模式不如“光标下的单词”那么简单,这就是为什么我需要一个可以在旅途中创建的小型特定宏的原因。然后再说一次:一张地图太具体了:\无论如何都谢谢你:)
iago-lito

2
也许,将模式放在寄存器中,然后修改上述映射以自动获取寄存器内容作为toBeReplaced部分(而不是光标下的当前字,这是更大的限制)。
VanLaser

1
@VanLaser对,这将允许常规映射,并且也将使其更加简单:va{:s/<C-r>0//g<Left><Left>使用此方法,您可以预先提取所需的任何模式,然后只需按映射的键即可将该模式替换为当前的模式。块。
dhakimian 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.