映射中的<c-r> = vs <expr>

时间:2016-01-15 18:20:07

标签: vim

我看到这两种样式用于在地图中插入表达式的内容。例如:

imap ,9 <c-r>=1+1<cr>
imap <expr> ,9 1+1

就我所知,这两件事都做同样的事情:如果你在插入模式下键入2,他们会插入,9

我看到一些脚本使用第一种样式而其他脚本使用第二种样式。有什么不同吗?在我看来,<expr>样式更清晰,但是<c-r>=样式可以实现<expr>不能实现的用例吗?

2 个答案:

答案 0 :(得分:4)

你的两个例子是等价的。您应该更喜欢第二种样式,因为<c-r>=在某些情况下表现不同。最近的一个示例是<Plug> function failing, inserting as literal "<t_ý>S",其中使用<c-r>=<Plug>Func()<CR>与表达式映射中的<Plug>Func()相比,做了一些不同且意外的事情。

<c-r>=的大部分用途应该是在映射中间插入表达式的结果时(或者只是手动使用表达式寄存器)。一个简单的例子是,当您点击g:some_var

时,您希望在括号中包含,8变量的内容
imap ,8 (<c-r>=g:some_var<cr>)

答案 1 :(得分:3)

:map-<expr>的最大问题是文档中解释的问题:

  • 我们无法修改缓冲区,也无法使用其他缓冲区
  • 我们无法使用:normal
  • 我们无法移动光标(作为映射的可观察属性) - 我有时会使用:normal ......

此外,i_CTRL-R已经存在了很长时间。因此,我甚至没有尝试将旧的,经过深度测试和使用的映射迁移到i(nore)map <expr>