Найти тему
Vim

VimScript 31 [execute normal! (выполнить в Командном режиме)]

Оглавление

| ч30. normal (Командный режим) | Содержание | ч32. Базовые регулярные выражения |

После того как мы разобрали [ execute ], и [ normal! ] теперь мы можем поговорить об общей идиоме Vimscript более подробно. Выполните следующую команду:

:execute "normal! gg/foo\<cr>dd"

Эта команда переместит курсор в начало файла, выполнит поиск первого вхождения foo и удалит строку, которая её содержит.

Ранее мы пытались использовать [ normal! ] с командой поиска, но не смогли ввести [ ввод ], необходимый для выполнения поиска. Объединение [ normal! ] с [ execute ] устраняет эту проблему.

[ execute ] позволяет создавать команды программно, поэтому вы можете использовать обычные строковые escape-последовательности Vim для генерации необходимых вам непечатаемых символов. Попробуйте выполнить следующую команду:

:execute "normal! mqA;\<esc>`q"

Что это делает? Давайте разберем его на части:

  • [ :execute "normal! ..." ]: выполнить последовательность команд так, как если бы они были введены в командном режиме, игнорируя все сопоставления и заменяя escape-последовательность строк их результатами.
  • [ mq ]: сохранить текущее местоположение с меткой "q".
  • [ A ]: переместить курсор в конец текущей строки и войти в "режим вставки" после последнего символа.
  • [ ; ]: теперь мы находясь в "режиме вставки", ставим точку с запятой.
  • [ \<esc> ]: выходим из режима вставки.
  • [ `q ]: возвращает нас к точному местоположению курсора где мы ранее установили метку "q".

Это выглядит немного пугающе, но на самом деле довольно полезно: Vim ставит точку с запятой в конце текущей строки, оставляя курсор на месте. Разве не здорово? Это сопоставление может пригодиться, если вы забыли ставить точку с запятой в конце строки, например при написании Javascript, C++ или любого другого языка которые используют точку с запятой.

Упражнения

Прочтите :help expr-quote еще раз (вы уже видели это раньше), чтобы напомнить себе, как использовать экранирование строк для передачи специальных символов в [ normal! ] с [ execute ].

| ч30. normal (Командный режим) | Содержание | ч32. Базовые регулярные выражения |