表达式寄存器的目的是什么?

23
2个回答

40
它有许多有趣的用途,非常多。在Derek的视频中,它被用来调用外部脚本。重点是您可以在不离开插入模式的情况下完成此操作。您说您不认为其比<c-o>更有优势,但您如何做到呢?
表达式寄存器插入表达式的结果。例如,您无需调用函数(如视频中所示)便可将结果插入其中。我会尝试向您展示其他两个我认为有趣且经常使用的用途。
1.计算数学表达式
表达式2的值为2,对吧(就像在VimScript中一样)?因此,您可以使用表达式寄存器将一些数字作为计算结果插入文本。例如,假设您正在编辑此文件的插入模式中:
... the total sum is $

现在按下<c-r>=并键入

5*6+3.2*8+5.52<enter>

结果是:

... the total sum is $61.12

实用,是吧?

2.使用变量值

假设你需要在文本中给标题编号。标题以 # 开头,如下所示:

# Heading

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo.

# Another Heading

Consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

考虑到这是一个长列表,你需要找到一种快速处理的方法。以下是一种方法:

  1. 创建一个变量来保存当前值
  2. 查找下一个标题
  3. 插入该变量的内容(使用表达式寄存器)
  4. 增加变量的值

首先可以通过创建变量来实现:

:let i=1

然后使用宏:

qa            ; start recording
/^#<CR>       ; find next heading
0w            ; move to the first word
i             ; switch to insert mode
<c-r>=i<CR>   ; insert the number
.<esc>        ; insert a dot and back to normal mode
:let i+=1<CR> ; increment the variable
q             ; stop recording

现在您可以按下@a,然后使用@@来随后插入标题中的数字。


我在考虑像 <c-o>:normal system('script') 这样的东西,但再想一想,这只会调用脚本而不会插入结果。<c-o>r!script 可以工作,但正如你所说,这更多是关于任意的 VimL 而不是执行外部命令。非常好的答案,谢谢 :) - Matt Briggs
FWIW ^A = increment,它提供了一种更简单的方式来对事物进行编号(虽然没有演示“=)”。 - lxs

12
我这样使用寄存器:<C-r>=618+27<CR>,在处理CSS时非常有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接