vim的表达式评估可以与缓冲区中的现有表达式一起使用吗?

时间:2014-03-24 22:02:26

标签: vim expression

vim中,我们可以通过键入<C-r>=后跟1.1+2.2等表达式在插入或命令模式下进行快速计算,以将结果输入缓冲区。

如果我在当前缓冲区中有一个现有的表达式,例如25.22 + 14.55,有没有办法让vim评估这个表达式,并用结果替换它?

我主要对不使用外部工具的解决方案感兴趣,例如bc

更新:为了更明确,这是我想要在评估之前和之后缓冲区中的行。

示例输入:

25.22 + 14.55 

示例输出:

39.77

2 个答案:

答案 0 :(得分:4)

根据文档,您使用eval()来评估表达式。

register                                                expr-register @r
--------        
...
When using the '=' register you get the expression itself, not what it
evaluates to.  Use eval() to evaluate it.

要将当前行传递给eval(),您可以使用以下内容。

:s/.*/\=eval(submatch(0))

将表达式替换为在其上运行eval的结果。

查看:h sub-replace-expression

答案 1 :(得分:1)

<C-r>":将默认寄存器的内容粘贴到命令行中。

您可以使用命名寄存器粘贴以下内容:

<C-r>=<C-r><register><CR>

您可以像下面的示例一样创建macro,并在所需的行上使用@r运行它,将该行替换为已计算的表达式:

:let @r='"ay$C^R=^Ra^M^['

,其中

  • "ay$:一直到行尾注册a

  • C:删除该行并进入插入模式。

  • ^R=^Ra^M:评估注册表a的内容并插入 当前光标位置。

  • ^[:更改为命令模式

确保使用Cnrl逐字插入Ctrl-v字符。 例如,要插入Ctrl-r,请按Ctrl-V,然后按Ctrl-r

演示:

enter image description here