这是什么 Vim 魔法?

Яро*_*лин 5 vim

在有关jVi及其解析 .vimrc 的能力的问题中,作者给出了一个复杂的 vim 绑定示例,他断言 jVi 无法处理该绑定:

inoremap hh <c-o>?\%<c-r>=line('.')<Return>l\({}\\|\[]\\|<>\\|><\\|()\\|""\\|''\\|><lt>\)?s+1<Return>
Run Code Online (Sandbox Code Playgroud)

我想知道它做了什么(主要是如何)。到目前为止,我得到:

  • <co> : 在普通模式下执行一个命令并返回到插入模式
  • ?/%n : 向后查找具有指定十进制/十六进制代码的字符
    • 在这里插入行号有什么意义?
  • 最后一部分查找特定的括号组合并将光标放在那里
    • 我不明白怎么l可以这样使用

想澄清一下?

qqx*_*qqx 4

+如您所指示CtrlO第一个?确实开始向后搜索。

像这样的模式序列\%15l将搜索限制在第 15 行,l第一个之后的<Return>就是该序列的结尾。该映射使用 Ctrl+ R、特殊=寄存器 ( :help i_CTRL-R) 和表达式line('.')将当前行号插入到该序列中,从而防止搜索转到不同的行。

到最终字符的其余映射?是一个相当直接的正则表达式,用于匹配多个字符序列中的任何一个。

Final?表示模式的结束,该s+1部分使光标位于匹配开始后 1 个字符 ( :help search-offset)。