1

我有两个关于vim 映射的问题,例如imap 和递归。在 Vim 中,映射既可以是右递归的,也可以既不是左递归的也不是右递归的,但它们不允许是左递归的,对吧?为什么不?我测试了以下示例来说明我的意思:

  1. (左递归)当我执行

    :imap x xyz
    

    然后在插入模式下输入“x”,输入缓冲区的内容是

    xyz
    

    据我所知,这种行为与我使用 inoremap 而不是 imap 会发生的情况无法区分。

  2. (既不是左递归也不是右递归)当我执行时

    :imap x yxz
    

    然后在插入模式下键入“x”,(试图)放入缓冲区的内容是

    y...yz
    
  3. (右递归)当我执行

    :imap x yzx
    

    然后在插入模式下键入“x”,(试图)放入缓冲区的内容是

    yzyzyzyzyzyz...
    
  4. (相互递归)当我执行时

    :imap x abc
    :imap a x
    

    然后在插入模式下输入“x”,我收到“E223:递归映射”。

似乎我已经证明 Vim 不允许左递归映射和相互递归映射,但我想验证一下:在 Vim 中定义(可能相互)递归映射的规则是什么?

4

1 回答 1

1

来自http://vim.wikia.com/wiki/Recursive_mappings和 vim 命令

:help recursive_mapping

If you include the {lhs} in the {rhs} you have a recursive mapping.  When
{lhs} is typed, it will be replaced with {rhs}.  When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times ...
There is one exception: If the {rhs} starts with {lhs}, the first character
is not mapped again (this is Vi compatible) ... For example, if you use:

:map x y
:map y x

Vim will replace x with y, and then y with x, etc.
When this has happened 'maxmapdepth' times (default 1000),
Vim will give the error message "recursive mapping".

似乎文档只关注 {lhs} 是单个字符的映射,但是当 {lhs} 超过一个字符并且是 {rhs} 的前缀时,仍然可以观察到这种行为。

于 2013-03-11T00:56:15.753 回答