问题描述
有一个宏,其中视觉上选择的文本将成为一个降价链接,一旦宏执行,它就会使 Vim 处于插入模式:
| - VISUAL selection
i - cursor position in INSERT mode
@l - invoke macro in "l" register
Some |text| saying stuff. = @l => Some [text]() saying stuff.
i
:registers l
Type Name Content
c "l S]%a()^Ohq<80>kb
通过以下方式创建它:
- 视觉选择一些文本
-
q
然后l
-
S
然后]
(S
is a visual selection command invim-surround
)^ - normal mode cursor position |text| =S]=> [text] ^
-
%
(跳到右括号) -
a
然后输入()
- CTRL-O
h
-
CTRL-O 然后
q
(完成宏但保持插入模式)
所以我用鼠标选择了这个定义(即*
寄存器),并在另一个Vim实例中做了let @l = "S]%a()^Ohq<80>kb"
,结果是
Some |text| saying stuff. = @l => Some [text]()^Ohq<80>kb saying stuff.
i
如果 Vim 是用 clipboard support(一个 Vim 实例中的 :let @+ = @l
,另一个 Vim 实例中的 :let @l = @+
)构建的,但我想学习破译这些表示的基础知识。
更新:记录和剪贴板复制的宏的 Vim 表示与手动粘贴的宏之间略有不同:序列 ^O
和 <80>
在前者中突出显示为特殊情况,但字符串在后者中显示为统一颜色。
l
是原始录制的宏,+
由 :let @+ = @l
创建,c
内容已逐字输入:
找到了几个具有类似前提的其他 Stackoverflow 线程,但它们没有帮助:
VIM macro editing
尝试将 ^O
转换为 <C-O>
但它没有用,并且不知道 <80>kb
是什么。
根据上面的创建步骤,无论如何我都希望得到类似 S]%a()^Oh^Oq
而不是 S]%a()^Ohq<80>kb
的东西。
Reliable solution to copy/paste Vim macros
没有回复,根据我的理解,它不适用于我的情况。
Saving vim macros
仔细阅读答案和评论,但没有任何乐趣。
解决方法
那个神秘的 <80>kb
是录音制品:您在录音过程中的某个时刻按下了 <Backspace>
,这就是 Vim 在内部表示它的方式。
录音真的会记录您键入的所有内容,无论是否有意义,无论您是否希望在宏中使用。所以那些 <80>kb
是一个肮脏的小秘密:宏不只是文本,这使得它们不像人们想象的那样便携。至少不是没有一点工作。
让宏可移植的唯一方法是手动清理它们......
-
将寄存器
l
的内容插入缓冲区::new "lp
-
用你常用的编辑魔法编辑掉所有多余的东西。
-
将其拉回所需的寄存器:
0"+y$
-
摆脱那个缓冲区:
:bw!