1

В некоторых случаях у меня есть какой-то скрипт vim, который я хочу выполнять только тогда, когда он не запускается в макросе. Например, в некоторых случаях я моргаю курсором, чтобы напомнить себе, где он находится сейчас (что бессмысленно при запуске в макросе, и просто заставляет макрос занимать 10x больше времени).

Поэтому для этих случаев я хотел бы проверить, работает ли он как макрос, и избежать ненужных операций в этом случае. Я немного почесал справку, но не смог найти флаг, чтобы обнаружить это. Это возможно?

1 ответ1

2

Не существует такой функции, как mode() или специальная переменная v:macro_running , и многие утверждают, что они будут поощрять плохие практики.

Что вы можете сделать, это использовать поведение feedkeys() , чьи переданные ключи обычно выполняются сразу после команды / отображения, но только в самом конце выполнения макроса. Если вы поместите туда свои долгосрочные команды, они будут напрямую замедлять обычные команды, как обычно, но только (кумулятивно) замедляться после выполнения макроса (и вы обычно можете прервать его с помощью <C-C>).

пример

let @q = ',a,b'

Вместо:

nnoremap ,a aHello<Esc>2gs
nnoremap ,b aWorld<Esc>2gs

использование

nnoremap ,a aHello<Esc>:call feedkeys('2gs', 'n')<CR>
nnoremap ,b aWorld<Esc>:call feedkeys('2gs', 'n')<CR>

Это немедленно вставит весь текст HelloWorld внутри макроса.

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