| ч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! (выполнить в Командном режиме) |