Вы можете сделать сопоставление следующим образом:
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 отбрасывается, поскольку он был там только для защиты от возможного количества префиксов перед начальным : (вы можете защитить от этого в самом макросовом контенте).