当我用q录制宏并完成后,如果我处于正常或可视模式,则可以键入:
如果我处于插入模式,则q将停止记录。



评论

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

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

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

@PhilippFrank,是的。很高兴您喜欢它。 :)

#1 楼

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

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


因此,在.vimrc中添加类似以下内容的内容后:您可以在命令模式下使用<c-q>停止录制宏。


评论


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

– VanLaser
2015年9月6日16:08

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

–iago-lito'考虑离开
2015年9月6日下午16:12

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

–iago-lito'考虑离开
2015年9月6日下午16:17

嗯,对:)顺便说一句,顺便说一句,我可以选择一个可视范围,然后执行@q并将范围添加到命令开始'<,'>-只要宏以:...开始。

– VanLaser
2015年9月6日在16:30

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

–花
2015年9月6日19:11

#2 楼

一种方法:


照常启动宏(例如qq ...其他字符)
当您进入cmdline模式时,写出所有想要的字符
您要在此处结束宏。按下ESC退出cmdline模式,按下q结束宏。
ESC寄存器(*)中删除q:您可以将其粘贴到缓冲区中,删除^[字符,然后再次选择整个内容(按字符排序),然后将其重新拉回以注册q。就是这样:运行您的宏:@q。在寄存器中:)

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

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


评论


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

–iago-lito'考虑离开
2015年9月4日在8:56



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

– VanLaser
2015年9月4日在9:23

@VanLaser:能否请您提供以下详细信息:let @q = @q [:-2]?特别是[:-2]如何工作? :-)

–statox♦
2015年9月4日下午13:57

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

– VanLaser
2015年9月4日14:02



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

–iago-lito'考虑离开
2015年9月4日在16:52



#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'考虑离开
2015年9月4日在16:42



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

– VanLaser
2015年9月4日在19:13

@VanLaser对,这将允许常规映射,并且也将使其更加简单:va {:s / 0 // gg 使用此方法,您可以在需要之前提取所需的任何模式-手,然后只需按映射键,即可用当前程序段中的内容替换该模式。

–dhakimian
2015年9月4日在20:13