如何在 vim 中使用 CTRL-A 或 CTRL-X 进行注册

如何在 vim 中使用 CTRL-A 或 CTRL-X 进行注册

假设我有一个数字存入寄存器r

我怎样才能将此值与CTRLA和一起使用CTRLX

这里有一个例子可以说明这一点:

假设我有这个文本文件:

10
13
15

我想用寄存器中的值来增加这些数字r以获得(如果它包含 5)

15
18
20

我为什么要问这个问题?因为我想用到CTRLA宏中,但我需要应用的时间数CTRLA只有在“运行时”才知道。

更一般地说,我如何才能多次执行存储在寄存器中的命令?

所有这些问题和答案都很有趣,但它们并没有回答我的问题:
https://stackoverflow.com/questions/1497958/how-to-use-vim-registers
https://stackoverflow.com/questions/2405952/vim-register-use-in-ex-mode

答案1

您可以进行如下映射:

noremap <Leader><C-A> :<C-U>execute 'normal!' str2nr(getreg('r')) . '<C-A>'<CR>

它映射\Control-A<Leader>默认为\,请参阅:help leader)以按寄存器中指定的次数运行通常的Control-A次数r。您甚至可以使用它来重新绑定默认值Control-A(省略<Leader>),但如果您忘记了映射,这似乎可能会导致以后出现混乱。

r寄存器包含时5,它的工作方式如下(切换到双引号表示法,因为无法Control-A用单引号字符串文字表示):

getreg()函数str2nr()被求值,得到以下 Ex 命令:

:execute 'normal!' 5 . "\<C-A>"

这会产生另一个 Ex 命令:

:normal! "5\<C-A>"

这将执行正常模式命令:

5Control-A

Control-A它使用通常的(非映射,由于!在)之前的前缀计数:normal!

此版本始终使用寄存器中的值r;它明确忽略任何前缀计数(与通常的 不同Control-A)。 替代实现是可能的(例如,前缀计数覆盖或乘以寄存器中的值r),但它们会更复杂一些。


您也可以将命令直接放入宏中,而不是使用映射:

qq…:执行'正常!' str2nr(getreg('r')) . ' Control-A' Return

您必须键入实际的Control-A和,Return而不是它们的<>等价物,因为这不再是映射的一部分,Vim 将自动进行翻译。此外,删除了Control-U,因为它只是为了防止在首字母之前出现可能的前缀计数:(您可以在宏内容本身中防止这种情况)。

相关内容