VIM: Как проверить, работает ли текущий скрипт в макросе?
В некоторых случаях у меня есть какой-то скрипт vim, который я хочу выполнять только тогда, когда он не запускается в макросе. Например, в некоторых случаях я моргаю курсором, чтобы напомнить себе, где он находится сейчас (что бессмысленно при запуске в макросе, и просто заставляет макрос занимать 10x больше времени).
Поэтому для этих случаев я хотел бы проверить, работает ли он как макрос, и избежать ненужных операций в этом случае. Я немного почесал справку, но не смог найти флаг, чтобы обнаружить это. Это возможно?
1 ответ
Там нет функции, как 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
текст внутри макроса.