如何在通过Vim录制录制宏后对其进行微调?

时间:2017-01-08 20:46:01

标签: vim macvim

具体问题

描述

将所需操作记录到注册商o后,我将整个宏粘贴到我的~/.vimrc并按如下方式分配(直接粘贴映射未正确显示) enter image description here

预期行为

我想使用这个宏来为自己创建一个新的“注释行”,它引导一个新的脚本部分,格式化为该部分的名称居中。填充“部分标题”后,我想在新行中输入插入模式。

在以下屏幕记录中,我已根据需要对@o@p$ on the word "time". The second attempt with @ p`进行了测试。

enter image description here

问题(特别是在Windows机器上)

正如您所见,@o映射获取了垃圾短语,这是我对宏的定义的一部分。这是否与^M运算符有关?而且,如何修复使用@o填充该行的*映射?

这两个映射在Linux系统上运行良好。 (不知道为什么,因为我已经在Windows机器上记录并粘贴了宏定义。)在使用MacVim的Mac上,这似乎也没有问题。

广义问题

  1. 有没有办法正确替换^M运算符(<CR>或“输入”-key)?
  2. 有没有办法正确替换^[运算符(<ESC>或“Escape”键)?
  3. 是否存在来自这些奇怪的击键表示的系统映射列表,由“录音”功能通过q记录。
  4. 解决方案

    ^M替换宏定义中的\r标记。并且,将^[替换为\x1b,用于 ESC 键。映射固定如下:

    let @o = ":center\ri\r\x1bkV:s/ /\*/g\rJx50A\*\x1b80d|o"
    let @p = ":center\ri\r\x1bkV:s/ /\"/g\rJx50A\"\x1b80d|o"
    

    密钥代码/映射的完整列表?方法1:通过十六进制代码。

    感谢Zbynek Vyskovsky,图片很清晰。对于任何人可能想到的关键,Vim将其ASCII值取为“面值”。 (诀窍是使用以\x开头的转义子句,其中x作为连接到十六进制值的引导键/字符串/字符。)因此,对应列表(不完整),去如下:

    • 输入 --- \x0d --- \r
    • ESC --- \x1b --- \e

    Vim原生的解决方案

    偶然地,:help expr-quote给出了以下特殊字符列表。这应作为一般形式的原始问题的明确答案。

    string                  *string* *String* *expr-string* *E114*
    ------
    "string"        string constant     *expr-quote*
    
    Note that double quotes are used.
    
    A string constant accepts these special characters:
    \...    three-digit octal number (e.g., "\316")
    \.. two-digit octal number (must be followed by non-digit)
    \.  one-digit octal number (must be followed by non-digit)
    \x..    byte specified with two hex numbers (e.g., "\x1f")
    \x. byte specified with one hex number (must be followed by non-hex char)
    \X..    same as \x..
    \X. same as \x.
    \u....  character specified with up to 4 hex numbers, stored according to the
        current value of 'encoding' (e.g., "\u02a4")
    \U....  same as \u but allows up to 8 hex numbers.
    \b  backspace <BS>
    \e  escape <Esc>
    \f  formfeed <FF>
    \n  newline <NL>
    \r  return <CR>
    \t  tab <Tab>
    \\  backslash
    \"  double quote
    \<xxx>  Special key named "xxx".  e.g. "\<C-W>" for CTRL-W.  This is for use
        in mappings, the 0x80 byte is escaped.
        To use the double quote character it must be escaped: "<M-\">".
        Don't use <Char-xxxx> to get a utf-8 character, use \uxxxx as
        mentioned above.
    
    Note that "\xff" is stored as the byte 255, which may be invalid in some
    encodings.  Use "\u00ff" to store character 255 according to the current value
    of 'encoding'.
    
    Note that "\000" and "\x00" force the end of the string.
    

1 个答案:

答案 0 :(得分:1)

当您使用vim表达式语言进行注册时,它绝对可以以平台无关的方式进行。 vim表达式中的字符串理解标准转义序列,因此最好将^M替换为\r,将Esc替换为\x1b

let @o = ":center\riSomeInsertedString\x1b"

据我所知,没有要翻译的特殊字符列表,但您可以简单地获取所有控制字符(ASCII低于32)并将它们转换为相应的转义序列“\xHexValue”,其中HexValue是角色的价值。即使\r(或^M)也可以转换为\x0d,因为其ASCII值为130x0d十六进制)。