Функции VIM: когда использовать «обычный», когда использовать «exec», а когда ничего не использовать? - PullRequest
16 голосов
/ 15 марта 2012

При изучении функций VIM, чтобы научиться писать свои собственные, я вижу, что команды иногда пишутся , перед которыми стоит ключевое слово normal:

normal mz

Иногда с normal , завернутый в exec:

exec "normal mk"

Или иногда в одиночку на линии ;

0d

Где в прекрасном руководстве этоимя

Ответы [ 2 ]

24 голосов
/ 15 марта 2012

Вы путаетесь с различными режимами.В частности, командный режим и обычный режим.

Командный режим - это место, где применяются команды ex, команды, начинающиеся с двоеточия.Файлы VimScript - это просто последовательность ex-команд.

Когда вам нужно выполнить команду нормального режима, когда в ex-режиме (командном режиме) вы используете команду :normal ex, которая выполняет аргументы так, как они быв обычном режиме.

Когда вы выполняете команду напрямую, вы выполняете ее напрямую.В вашем примере команда :d использовалась с диапазоном.Это не то же самое, что клавиша d в обычном режиме, это еще одна совершенно другая команда.Проверьте справку для :d и d (обычная команда).

:execute полезен для создания команды в виде строки и выполнения в качестве команды ex.В вашем примере это бесполезно.Но это становится полезным в других случаях, например, когда у вас есть переменная, содержащая номер строки, и вы хотите использовать ее значение в команде:

:let i=4
:exec "2," . i . "d"

, что аналогично

:2,4d
7 голосов
/ 15 марта 2012

Хорошо, давайте спросим обширную встроенную справочную систему Vim, к которой вы можете обратиться, набрав :h, а затем интересующую вас команду или ключевое слово:

:h norm

:norm[al][!] {commands}

Выполнение команд обычного режима {commands}.Это позволяет выполнять команды в обычном режиме, набранные в командной строке....

Другими словами, normal mz в скрипте эквивалентно вводу mz в обычном режиме.

:h exec

:exe[cute] {expr1} ..

Выполняет строку, полученную в результате вычисления {expr1}, как команду Ex....

Мне не понятно, почему автор связанного скрипта использует exec "normal mk" вместо normal mk (mk в обычном режиме просто устанавливает отметку с именем "k").Документы предлагают это, хотя:

:execute также является хорошим способом избежать необходимости вводить управляющие символы в сценарии Vim для команды :normal:

:execute "normal ixxx\<Esc>"

Имеет символ <Esc>, см. |expr-string|.

Что касается 0d, некоторым командам Ex (командной строки) может быть присвоен диапазон номеров строк для выполнения.0 обычно интерпретируется как 1, поскольку нумерация строк Vim начинается с 1, а не с 0, поэтому :0d:1d) просто удаляют первую строку.:2,4d удалит вторую, третью и четвертую строки.Подробнее см. :h cmdline-ranges.

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