我使用复杂的重复记录我的操作(qq记录,一些操作,q停止),但我犯了一个错误。
可以查看我所记录的内容并更正错误,而不必再次执行此操作?
通过@q工作调用记录的字符,但是在映射(:map q- No mapping found
)中看不到它。
通过键入以下命令,帮助中没有太多信息:help recording
。
我使用复杂的重复记录我的操作(qq记录,一些操作,q停止),但我犯了一个错误。
可以查看我所记录的内容并更正错误,而不必再次执行此操作?
通过@q工作调用记录的字符,但是在映射(:map q- No mapping found
)中看不到它。
通过键入以下命令,帮助中没有太多信息:help recording
。
Answers:
注意:我假设您在a
整个答案中都使用寄存器,但是您可以使用任何寄存器
注2:<1b>
是Esc;您可以使用Ctrl+v然后插入Esc。它也可能显示为^[
(取决于display
设置)。
这不是映射;因此这是:map
行不通的。它记录在一个寄存器中,您可以像查看任何寄存器一样查看和编辑它。
所有q要做的就是“清除该寄存器,并向其添加任何击键”,而所有@要做的就是“将寄存器评估为命令”。
宏没有什么“不同”,您可以将任何寄存器作为宏调用。
要查看,只需使用:
:echo @a
就像任何寄存器一样。
您也可以:registers
用来查看所有寄存器。
要进行编辑,您可以执行以下几项操作:
分配给的最简单方法是@a
:
:let @a='iasd<1b>'
这将启动插入模式(i
),insert asd
和Escape返回普通模式。
这对于大量编辑不是很有用;您可以使用函数(例如substitute()
),也可以附加一些东西(:let @a=@a . 'more'
),但是在中间进行更改并不是那么容易。
我发现最好的方法是用:split
或启动一个新缓冲区,:tabnew
并通过将寄存器插入那里,对其进行编辑然后再将其复制回来来编辑该寄存器。
您可以使用"ap它将文本插入缓冲区(a
寄存器在哪里):
iThis is A<1b>
现在,我可以将行更改为:
iThis is an edited macro<1b>
然后,我^v$"ay将这一行拉出(复制)到a
寄存器中:
a
如果需要,可以在不使用可视模式的情况下执行此操作^"ay$。
现在@a,您可以使用,就像这是您最初录制的内容一样。
您也可以先使用yy,然后再使用,@"这要快一些。但是,这也会复制尾随的换行符,并且可能会产生副作用。另一种使速度更快的方法是使用宏:-)
v
并选择整行(不包含换行符)。
v^$"ay
将该行a
拖移(复制)到寄存器中。” 难道不是^
在之前v
,$
您是否仍要复制换行符?我认为应该是:(0v$h"ay
是痛苦的长时间!)
$
移动到行尾,但不包括换行符。0y$
和之间的区别yy
。紧跟h
在$
那只会意味着您会错过最后一个字符。
为了与他人合作...
qajjjq
将开始记录一个宏到a
寄存器中。
您可以使用该:reg
命令查看当前的许多寄存器(用于宏,删除,删除等),或者可以通过提供其名称来指定要显示的寄存器。例如,显示register 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}
当然,您可以将寄存器的内容粘贴到缓冲区中,然后在其中进行更改。但是您可以做所有需要做的事情而不会污染您的工作缓冲区。
Enter
在录制末尾按下时一样。在许多情况下,这可能是无害的,但是在您精心制作了记录结尾处的光标位置的情况下,它会影响可重复性。