Можно ли записывать и запускать рекурсивные макросы с помощью обычной команды Vim? - PullRequest
2 голосов
/ 06 января 2011

Дано:

https://stackoverflow.com/questions/ask

В обычном режиме для первого символа ввод qaqqaf/xb@aq@a удаляет все косые черты.

  1. qaq очищает регистр
  2. qa начинает запись на
  3. f / x удаляет следующий слеш
  4. @ a повторно запускает макрос
  5. q заканчивает запись

Но выполнение normal qaqqaf/xb@aq@a прекращается после b - кажется, что оно выдает залог при рекурсивном вызове. То же самое происходит, если вы пытаетесь использовать команду map.

Что-то не так с моим синтаксисом? Или невозможно записать рекурсивный макрос с normal?


Примечание: Я знаю, что можно написать рекурсивный макрос с let. Мне интересно, если это единственный способ написать рекурсивный макрос без записи его вручную:

let @a = "f/xb@a"
normal @a

(Я спрашиваю из-за этого ответа: Удалите все, кроме соответствия регулярному выражению в Vim )

1 Ответ

2 голосов
/ 06 января 2011

Если вы хотите создать карту для рекурсивного макроса, я предлагаю вам сделать что-то вроде этого:

nmap <f2> :let @a = "f/xb@a"|normal @a

Конечно, это забивает регистр @a, и если вы обнаружите, что выполняете многие из этих отображений, возможно, функция лучше подойдет вашим потребностям.

Вот более безопасная альтернатива для создания рекурсивных макросов:

function! RecMacroExe(cmds)
  let a = @a
  let @a = a:cmds . "@a"
  try
    normal @a
  finally
    let @a = a
  endtry
endfunction

nmap <f2> :call RecMacroExe("f/xb")<cr>

Редактировать : изменена функция в соответствии с комментарием @Luc Hermitte

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...