Найти тему
Vim

VimScript 30 [ normal (Командный режим) ]

| ч29. Execute (выполнить) | Содержание | ч31. execute normal! (выполнить в Командном режиме) |

Normal

Мы рассмотрели некоторые полезные команды Vimscript, но как же насчет всего того, что мы делаем ежедневно в командном режиме? Можем ли мы каким-то образом использовать все знания, полученные при редактировании текста, в наших сценариях?

Ответ: "конечно, да". Мы уже видели эту команду раньше [ normal ], и теперь пришло время рассмотреть ее более подробно. Выполните следующую команду:

:normal G

Vim переместит ваш курсор на последнюю строку в текущем файле, точно так же, как нажатие [ G ] в командном режиме. Теперь выполните следующую команду:

:normal ggdd

Vim перейдет к первой строке в файле < gg >, а затем удалит ее < dd >.

Команда [ normal ] просто берет последовательность клавиш и делает вид, что они были введены в командном режиме. Кажется все просто.

Избегая сопоставлений

Выполните следующую команду, чтобы сопоставить ключ < G > с чем-то другим:

:nnoremap G dd

Теперь нажатие < G > в обычном командном режиме приведет к удалению строки. Попробуйте эту команду:

:normal G

Vim удалит текущую строку. Команда [ normal ] будет учитывать любые существующие сопоставления.

Это означает, что нам нужно что-то вроде [ nnoremap ] версии [ nmap ] но только для [ normal ], иначе мы никогда не сможем ее использовать, поскольку мы не можем знать, какие ключи сопоставили наши пользователи.

К счастью, в Vim есть [ normal! ] команда, которая делает именно это. Запустите эту команду:

:normal! G

На этот раз курсор переместиться в нижнюю часть файла, даже если < G > был сопоставлен.

При написании Vim-скриптов вы всегда должны использовать normal! и никогда не использовать обычный normal. Так как вы не можете знать и доверять тому, какие ключи будут сопоставлены у ваших пользователей в их ~/.vimrc файле.

Специальные символы

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

:normal! /foo<cr>

На первый взгляд может показаться, что это должно выполнить поиск foo, но увы это не работает. Проблема в том, что [ normal! ] не анализирует специальные последовательности символов, такие как <cr>.

В этом случае Vim думает, что вы хотели выполнить поиск последовательности символов "f, o, o, левая угловая скобка, c, r, правая угловая скобка", и не понимает, что вы даже нажали return для выполнения поиска! Мы поговорим о том, как обойти это в следующей статье.

Упражнения

Прочти :help normal. В конце будет намек на следующую тему.

Для тех кто хочет себя испытать. (будет трудно)

Вспомните, что в :help normal говорилось об отмене. Попробуйте создать сопоставление, которое удалит две строки, но позволит вам отменить каждое удаление отдельно. nnoremap <leader>d dddd это хорошая команда что бы начать выполнять это упражнение.

На самом деле вам это не понадобится normal! [ nnoremap ] будет достаточно, а это иллюстрирует хороший момент: иногда чтение об одной команде Vim может вызвать интерес к чему-то несвязанному.

Если вы никогда не использовали команду [ helpgrep ], она, вероятно, понадобится вам сейчас. Прочти: [ help helpgrep ]. Обратите внимание на то, как перемещаться между совпадениями.

Пока не беспокойтесь о шаблонах, мы скоро их рассмотрим. На данный момент достаточно просто знать, что вы можете использовать что-то вроде foo.*bar для поиска строк, содержащих это регулярное выражение, в документации.

К сожалению [ helpgrep ], может вас расстроить, так как вам надо знать, какие слова искать, прежде чем вы сможете их найти! Я дам вам некоторую подсказку, в нашем случае вы должны искать способ вручную нарушить последовательность отмены Vim, чтобы два удаления в вашем сопоставлении можно было отменить отдельно.

Хотя иногда бывает проще что то найти в Google чем в доках.

| ч29. Execute (выполнить) | Содержание | ч31. execute normal! (выполнить в Командном режиме) |