Вы можете сделать сопоставление следующим образом:
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>"
Это выполняет команду в нормальном режиме:
5 Control-A
Который использует количество префиксов перед обычным Control-A (без отображения, из-за этого !
в :normal!
).
Эта версия всегда использует значение в регистре r
; он явно игнорирует любой префиксный счетчик (в отличие от обычного Control-A). Возможны альтернативные реализации (например, когда префиксный счетчик переопределяет или умножает значение в регистре r
), но они будут немного более сложными.
Вы также можете поместить команду непосредственно в ваш макрос вместо использования отображения:
qq…: выполнить 'нормально!'str2nr(getreg(' r ')). « Control-A » Возврат ...
Вы должны ввести фактические Control-A и Return вместо их <>
эквивалентов, потому что это больше не является частью отображения, где Vim автоматически выполнит перевод. Кроме того, Control-U отбрасывается, поскольку он был там только для защиты от возможного количества префиксов перед начальным : (вы можете защитить от этого в самом макросовом контенте).