1

Предположим, что у меня есть номер в регистре r .

Как я могу использовать это значение с CTRL A и CTRL X

Вот пример, чтобы прояснить это:

Предположим, что у меня есть этот текстовый файл:

10
13
15

Я хочу увеличить эти числа со значением в регистре r чтобы получить (если он содержит 5)

15
18
20

Почему я это спрашиваю? Потому что я хочу использовать CTRL A в макросе, но количество времени, которое мне нужно для применения CTRL A, известно только во время выполнения.

В более общем смысле, как я мог выполнить команду несколько раз, сохраненную в регистре?

Все эти вопросы и ответы, где интересно, но они не отвечают на мой вопрос:
https://stackoverflow.com/questions/1497958/how-to-use-vim-registers
https://stackoverflow.com/questions/2405952/vim-register-use-in-ex-mode

1 ответ1

4

Вы можете сделать сопоставление следующим образом:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .