Привет, коллеги. Скриптовый язык Вим описан в серии заметок, можно открыть последнюю и в ней есть ссылки на все предыдущие. Это обычный скриптовый язык в стиле "do-enddo", довольно продвинутый и понятный. Есть и интерфейсы с другими языками: Perl, Python (2 или 3), Lua и др. Обычно в поставке идет Питон, причем третий, а остальные можно установить при желании.
Недостатков встроенного языка два: он тяжеловесный, так как многое надо держать наготове и невозможна предваритальная компиляция, и не похож на популярные языки (которые теперь все на одно лицо). Для меня это не недостатки, так как быстродействие для скриптов уже давно не так важно (вы же не пишете на Вим прогноз погоды или переводчик с китайского на бетельгезийский), а обезьяний подход к программированию "мы пишем на модном ***, так что сконвертируйте все свои файлы из немодного +++ автоматическим конвертером". Причем разницу между языками зачастую труднее уловить, чем между норвежским и датским.
Но тем не менее, разработчики Вим уже давно предлагают новый скриптовый язык, точнее, новую версию. У нее лучше быстродействие и синтаксис ближе к модным языкам. В общем-то, процесс закономерен: годами тащить обратную совместимость не всегда правильно, и лучше параллельно предлагать альтернативу, свободную от проблем типа "так исторически сложилось". Главное, делать это разумно, а не отсекая историю, как хвост у ящерицы. Причем улучшение производительности частенько требует отказа от обратной совместимости. Например, в Вим аргументы функции доступны в ней в словаре a:, а это накладно. Можно неплохо выиграть, отказавшись от такого словаря, тем более что это "синтаксический сахар" и вполне можно обойтись и без него.
Вим 9 надо установить, если его нет. В версии 8.2 уже есть возможность пробовать скрипты vim9. У меня в старой Ubuntu он есть в snap и можно поставить. На новом компьютере с новой Убунту Вим версии 8.2 и vim9 присутствует.
Новый синтаксис не навязывается грубо (это вам не Питон), а предлагается ненавязчиво. Он включается тогда, когда уместен:
- в новых функциях, определенных через :def
- в скриптах, первой командой который является vim9script
- в автокомандах, определенных в первых двух случаях
- в командах с модификатором vim9cmd
Команду можно выполнить через :vim9 или :legacy, прямо указав желаемый синтаксис.
Основные отличия нового синтаксиса от старого такие.
- Комментарии начинаются с решетки, как в большинстве скриптовых языков. А не с двойной кавычки, как в Вим.
- Строки продолжения обычно можно не помечать слешем, символ конца строки обрабатывается корректно и синтаксис многострочные команды допускает.
- Обязательны пробелы там, где "и так понятно". Например,
var x = 42 # comment - ни один пробел нельзя опустить! - Присваивания без :let, вызов функций без :call
- Есть объявление переменных через :var и констант через :final и :const. Второе определение создает константу, то есть переменную с фиксированным значением, а второе не позволяет присваивать переменной другой список или словарь, но разрешает менять их элементы.
- Переменные и функции по умолчанию локальны для скрипта и для блока, в котором определены.
- У функций есть типизация аргументов и возвращаемого значения:
def NewFunc(i: number, text: string): bool
Зато нет списка a: и словаря a:000
И, соответственно, другой синтаксис определения неопределенного числа параметров и необязательных аргументов. - Нельзя использовать подставляемые имена в фигурных скобках.
- Диапазон строк перед командой обязательно должен быть после двоеточия, его нельзя опустить.
- Нельзя выполнять регистры через @ без двоеточия или :exe
- Привязки с вычисляемым выражением выполняются в контексте того скрипта, где определены.
- Лямбды определяются через => вместо -> и число аргуметов должно соответствовать заявленному (есть специальный синтаксис для свободного числа аргументов).
- Изменился синтаксис определения словарей-констант.
- Некоторые команды вроде :x и :t недоступны (но есть аналоги с менее опасными именами)
- Оператор ... ? ... : ... теперь выглядит ... ?? ... !! ...
- Понятие логической истины изменилось: истиной считается только 1, а ложью только 0. Для оператора ?? и для отрицания ! истиной или ложью является всё, по таким правилам: bool истинно, если true, v:true или 1; целове или вещественное число истинно, если не нуль; остальное истинно, если не пусто (или не NULL). Операторы логики требуют логического типа, константы могут быть 0, 1, true, false.
- Конкатенация не точка, а две: ..
Определенные через def функции компилируются.
Собираются даже ООП сделать как везде.
Резюмируя, я понимаю тенденцию к форку синтаксиса и одобряю ненавязчивую альтернативу. При этом не вижу особой необходимости кидаться на новый язык: старый синтаксис меня вполне устраивает, а поскольку скрипты мои, как правило, не слишком вычислительноёмкие, то и быстродействие меня не волнует. Сходство языков до полной неразличимости вообще раздражает и выглядит тупиком. Однако считаю своим долгом уведомить вас, коллеги, о данной возможности. Изучить новый синтаксис несравненно легче современному компьютерщику, знакомому с парой модных языков.