如何在没有剪贴板支持的情况下将 Vim 宏复制到另一个 Vim 实例即,没有 `+` 寄存器? VIM macro editingReliable solution to copy/paste Vim macrosSaving vim macros

问题描述

一个宏,其中视觉上选择的文本将成为一个降价链接,一旦宏执行,它就会使 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

注册 l 包含以下内容

:registers l
Type Name Content
  c  "l   S]%a()^Ohq<80>kb

通过以下方式创建它:

  1. 视觉选择一些文本
  2. q 然后 l
  3. S 然后 ] (S is a visual selection command in vim-surround)
    ^ - normal mode cursor position
    
    |text|  =S]=>  [text]
                   ^
    
  4. %(跳到右括号)
  5. a 然后输入 ()
  6. CTRL-O
  7. h
  8. 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 内容已逐字输入:

enter image description here


找到了几个具有类似前提的其他 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 是一个肮脏的小秘密:宏只是文本,这使得它们不像人们想象的那样便携。至少不是没有一点工作。

让宏可移植的唯一方法是手动清理它们......

  1. 将寄存器 l 的内容插入缓冲区:

    :new
    "lp
    
  2. 用你常用的编辑魔法编辑掉所有多余的东西。

  3. 将其拉回所需的寄存器:

    0"+y$
    
  4. 摆脱那个缓冲区:

    :bw!