24,5K подписчиков

Рубрика "Секреты Вим". Как запускается Вим

Привет, коллеги. Давайте проследим, как запускается Вим. Это любопытно, и может быть полезно. Сказанное касается в основном консольной версии. И мы не обсуждаем реакцию на ключи командной строки - только некоторые.

Привет, коллеги. Давайте проследим, как запускается Вим. Это любопытно, и может быть полезно. Сказанное касается в основном консольной версии.

Сначала задаются опции shell и term. Первая задает имя программы-оболочки, вроде bash, вторая определяет тип терминала. Берутся из переменных окружения $SHELL и $TERM.

Напоминаю, что переменные окружения всегда обозначены символом $ перед именем.

Обрабатываются аргументы командной строки. Для каждого файла создаются буферы, но файлы пока не читаются с диска.

Выполняются команды инициализации. Вот на этот этап мы можем и должны влиять. Если указан ключ -y, то Вим будет запущен в режиме обычного редактора через специальный скрипт evim.vim. Затем выполняются строки системного файла vimrc. Посмотреть, где он лежит, позволяет команда :version и обычно это $VIM/vimrc Заметьте, что этот файл может быть недоступен пользователю без админских прав.

Далее проверяются по очереди четыре или пять источников команд для настройки. Первой проверяется переменная окружения $VIMINIT: если она имеется, она выполняется как команда Вим (несколько команд можно склеить через |). Через нее можно настроить Вим, если у вас, например, нет прав записи на диск или вообще нет диска.

Затем ищется файл .vimrc: сначала в домашнем каталоге и потом в подкаталоге .vim домашнего каталога. Именно этот файл (один из двух) и позволяет настраивать Вим как Вам надо. Смотрите только, что первым выполняется файл в домашнем каталоге, и если он есть, то до второго Вим просто не доходит. А если .vimrc не найден, то ищется ещё _vimrc.

Если ничего найти не удалось, проверяется переменная окружения $EXRC (SEX тут не при чём) и файл .exrc. Это тянется со времен vi и особо не мешает. Но надо иметь в виду, что при отсутствии .vimrc может выполниться что-то внезапно другое. Да и для безопасности это может быть дыркой.

В новых версиях gjckt 'njuj ещё ищется файл по настроек умолчанию: в папке $VIMRUNTIME, тоже .vimrc

Далее, если выставлен флаг exrc, то Вим поищет файл .vimrc (_vimrc, .exrc - именно в таком порядке) в текущем каталоге. Это позволяет сделать настройку под проект, например. Выставьте флаг в .vimrc и, если в текущем каталоге есть свой .vimrc, он тоже выполнится, а если нет, то ничего и не изменится. Но не забывайте о безопасности.

Да, есть некоторая нелогичность в названии флага.

После этого загружаются плагины. Все плагины в каталогах, перечисленных в runtimepath, будут запущены. Это можно предотвратить несколькими способами, помимо сброса опции. Например, сбросить флаг loadplugins или задав ключ --noplugins или -u NONE при запуске Вим. Но в целом, это удобно.

Выставляются опции shellpipe и shellredir. Первая из них указывает, куда передавать выдачу команды make, а вторая показывает, куда (временно) сохранять выдачу внешних команд. Если вы зададите эти опции сами, они не меняются. А если не зададите, то Вим сам разберется. Это важно, если у вас какая-то нестандартная оболочка.

Всё сказанное касалось и консольной, и оконной версий. На этом этапе инициализируется оконная система, если запущена оконная версия.

Потом читается файл viminfo.

Открываются окна и вкладки, но пока не отрисовываются. Загружаются буферы.

Выполняются команды запуска (их можно указать при открытии файлов).

Вот теперь запуск считается завершенным и has("vim_starting") возвращает нуль. До этого вы могли так проверить, идет запуск или нет: это может быть полезно, чтобы выполнить что-то только при запуске Вим, а при выполнении .vimrc как скрипта - нет. Переменная v:vim_did_enter выставляется в 1.

Выполняется автокоманда VimEnter: она позволит Вам среагировать на факт запуска Вим.

Переменные окружения $MYVIMRC и $MYGVIMRC выставляются в соответствующие файлы: так вы можете определить, какой файл отработал.

Итак, какие выводы мы можем сделать?

  1. Свои личные настройки надо держать в .vimrc в домашнем каталоге.
  2. Настройки проекта можно держать в отдельном .vimrc в домашнем каталоге при включенном флаге exrc.
  3. Можно использовать сессии и виды для сохранения и загрузки состояния.
  4. Можно явно указать vimrc при запуске Вим через ключ -u
  5. Можно задать настройки для всех пользователей (которые они смогут переопределять, если захотят) в системном vimrc, путь к которому показывает :version.

Начиная с версии 8, Вим выполняет ещё один файл: $VIMRUNTIME/defaults.vim, если не найдет .vimrc. Это включает ряд настроек, которые и так все включают. Вы можете использовать их тоже, начав свой .vimrc так:

unlet! skip_defaults_vim
source $VIMRUNTIME/defaults.vim

Начать творить свой файл настроек можно с файла $VIMRUNTIME/vimrc_example

Если у вас есть .vimrc, то этот файл (defaults.vim) не отрабатывает. Если же вы используете системный vimrc и не хотите, чтобы срабатывал этот (странная ситуация!), то задайте переменную skip_defaults_vim. Сам факт ее наличия указывает Виму пропустить этот файл.

Да, всё немного сложно, но всё прекрасно работает в большинстве случаев. Домашний .vimrc - и всё хорошо. Но для желающих покопаться есть много интересного - от одного файла для целой группы до разных файлов в одном аккаунте.

Еще пара замечаний напоследок. Если вы не владелец файла .vimrc, Вим выполняет его под флагом secure, который запрещает некоторые опасные команды. То же он может делать при выполнении файла в каталоге: если будут проблемы, заранее скиньте этот флаг (но помните о безопасности!) Не запускайте не глядя vimrc, полученные из недоверенных источников.

Переменые окружения $VIM и $VIMRUNTIME Вим выставляет сам, но если они уже заданы - не меняет. Это позволяет указать Виму, где ему себя искать, если вы что-то намудрили нестандартное (а это бывает). Алгоритм выбора каталога Вимом см. в Справке.

Ключ -V при запуске Вим позволяет увидеть всё, что Вим делает. А ключ --startuptime дает хронометрический отчет, что позволит определить причину медленного запуска.

Приветственное сообщение
Приветственное сообщение

Приветственное сообщение, которое отображается, если Вим запущен без файла и которое стирается при первой перерисовке экрана, можно посмотреть через :intro (попробуйте ещё :smile), а можно его вообще отключить, добавив флаг I в shortmess. Например. так:

:set shortmess+=I

в вашем .vimrc

Удачи, коллеги!

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022