我使用复杂的重复记录操作(qq记录,某些操作,q停止),但我犯了一个错误。 ,而不是再做一次?

通过@q调用记录的字符有效,但是我在映射(:map q-No mapping found)中看不到它。通过键入以下命令,帮助中没有太多信息::help recording

#1 楼

注意:我假设您在整个答案中都使用a寄存器,但是可以使用任何寄存器。

注2:<1b>是Esc;您可以先按Ctrl + v,再按Esc。它也可能显示为^[(取决于display设置)。


它不是映射;它不是映射。所以说:map不起作用是有道理的。它记录在一个寄存器中,您可以像查看任何寄存器一样查看和编辑它。

q所做的只是“清除该寄存器,并在其上附加任何击键”,而@所做的只是“将寄存器评估为命令”。

宏没有什么“不同”,您可以将任何寄存器作为宏调用。


仅使用查看:

:echo @a


就像任何寄存器。

还可以使用:registers查看所有寄存器。


要编辑,您可以做一些事情:

分配给@a的最简单方法是,像这样:

:let @a='iasd<1b>'


这将启动插入模式(i),插入asd,然后转回普通模式。

对于大量编辑不是很有用;您可以使用函数(例如substitute()),也可以附加一些东西(:let @a=@a . 'more'),但是在中间进行更改并不是那么容易。使用:split:tabnew启动新缓冲区,并通过在其中插入寄存器,对其进行编辑然后将其复制回来来编辑寄存器。 a是您的寄存器):

iThis is A<1b>


现在我可以将行更改为:

iThis is an edited macro<1b>


然后我执行^ v $“ ay,以将该行复制(复制)到a寄存器:



^用于行的开始用于可视模式

$用于行尾

“ ay取消选择以注册a


如果愿意,可以不使用带有^“ ay $的可视模式来执行此操作。您也可以只使用yy,然后使用@“,这会更快一些。但是,这也会复制尾随的换行符,并且可能会产生副作用。另一种使速度更快的方法是使用宏:-)

评论


我要注意的是,沿行向运动到寄存器中会产生副作用,包括换行符,就像在录制结束时按Enter一样。在许多情况下,这可能是无害的,但是在您精心制作了记录结尾处的光标位置的情况下,它会影响可重复性。

–tommcdo
15年2月13日在13:53

@tommcdo正确;您可以使用v并选择整行(不包含换行符)。

–马丁·图尔诺伊(Martin Tournoij)
15年2月13日在14:16

@Carpetsmoker“ v ^ $”可以将该行拖移(复制)到寄存器中。” ^难道不是在v之前出现的吗,并且不与$一起复制换行符?我认为应该是:0v $ h“ ay(是痛苦的长时间!)

– joeytwiddle
2015年2月24日在22:39



@joeytwiddle不,$移动到行尾,但不包括换行符。这是0y $和yy之间的差。在$后面加上h只是意味着您会错过最后一个字符。

– evilsoup
15年2月28日在11:10

要使编辑:let @ a =类型命令更容易编辑,您可以做的一件事是键入:,选择并编辑相关行(如果要编辑像往常一样使用vim输入最后一行)。完成执行该行后,按回车键,或者按退出。

–user859
15-10-22在11:57

#2 楼

要使用某些功能...

qajjjq


将开始在a寄存器中记录一个宏。

您会看到很多使用:reg命令使用当前寄存器(用于宏,删除,删除等),或者可以通过提供其名称来指定要显示的寄存器。例如,要显示寄存器a

:reg a


产量

--- Registers ---
"a   jjj


您可以附加到现有的命名使用相应的大写字母进行注册。这不仅适用于记录宏,而且适用于拉动。例如:

qAkkkq
:reg a


产量

--- Registers ---
"a   jjjkkk


如果要使用let语法来编辑现有的宏,您可以执行以下操作:

let @a='<C-r>a'


它将扩展为

let @a='jjjkkk'


,然后您可以更改

请注意,您可以使用<C-r>(即control + r)从任何寄存器粘贴到命令行模式(或在插入模式下)。 >
此外,当您处于命令行模式时,如果键入<C-f>,则会弹出命令行窗口,您可以在其中查看/编辑过去发出的命令,并且可以在调用之前编辑当前命令它。在要提交的命令上按Enter。

这样做的好处是,您可以在此缓冲区内使用常规的移动/替换命令来编辑宏。例如:

let @a='<C-r>a'<C-f>


会弹出:

:118 reg
:119 reg a
:120 let @a='jjjkkk'


如果您正在执行命令120,则可以可以这样做:

s/kkk/}
<return>
:reg a


产量

--- Registers ---
"a   jjj}


当然,您可以粘贴寄存器的内容放入缓冲区,然后在此处进行更改。但是您可以做所有需要做的事情而不会污染您的工作缓冲区。

评论


:reg +1,因为:echo @a会在人的宏中使用特殊字符(例如^ M)时显示不完整的输出(因为它打印宏而不是显示宏),但是:reg a会显示整个注册正确。

– Niayesh Isky
20 Mar 8 '20在22:54