VIM: Как проверить, работает ли текущий скрипт в макросе?

302
Steve Vermeulen

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

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

1
Как вы запускаете мигание? Если это отображение, не используйте его. Если это autocmd, используйте событие, которое не вызывается во время макроса, такого как CursorHold. Или запустите каждый макрос с помощью команды, которая временно отключит вашу мигающую функцию. romainl 10 лет назад 0

1 ответ на вопрос

2
Ingo Karkat

There is no function like mode() or special v:macro_running variable, and many would argue that those would just encourage bad practices.

What you can do is use the behavior of feedkeys(), whose passed keys are usually executed right after the command / mapping, but only at the very end of the macro execution. If you put your long-running commands in there, they will directly slow down normal commands as usual, but only (cummulatively) slow down after the macro execution (and you can usually abort that with <C-C>).

Example

let @q = ',a,b' 

Instead of:

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

use

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

This will immediately insert the whole HelloWorld text inside a macro.