Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Автозагрузка функций

Привет, коллеги. Бывает так, что нужная функция не загружена и ее надо оперативно подгрузить. Вим это может. Конечно, если код этой функции есть там, где Вим будет его искать. Может возникнуть вопрос: зачем обеспечивать Виму возможность найти и загрузить функцию, но при этом не загрузить ее самому? Дело в том, что некоторые скрипты довольно объемные и держать в памяти всё это богатство нет смысла. Достаточно, если Вим знает, где это взять, когда понадобится... Есть два механизма автозагрузки: автокоманды и собственно автозагрузка кода. Существует событие FuncUndefined, которое наступает, если функция вызвана, а ее нет в памяти. Логично такое событие обработать и функцию загрузить: :autocommand FuncUndefined MyFuncName source ~/.vim/myfuncs.vim Необходимо, чтобы функция была определена в файле. Можно использовать символ * в шаблоне имени или просто использовать только ее. При обработке доступны символы <amatch> и <afile>: оба содержат имя искомой функции. Например, это может пригодиться

Привет, коллеги. Бывает так, что нужная функция не загружена и ее надо оперативно подгрузить. Вим это может. Конечно, если код этой функции есть там, где Вим будет его искать.

Может возникнуть вопрос: зачем обеспечивать Виму возможность найти и загрузить функцию, но при этом не загрузить ее самому?

Дело в том, что некоторые скрипты довольно объемные и держать в памяти всё это богатство нет смысла. Достаточно, если Вим знает, где это взять, когда понадобится...

У Вима есть план Б! Точнее, может быть, если вы позаботитесь.
У Вима есть план Б! Точнее, может быть, если вы позаботитесь.

Есть два механизма автозагрузки: автокоманды и собственно автозагрузка кода. Существует событие FuncUndefined, которое наступает, если функция вызвана, а ее нет в памяти. Логично такое событие обработать и функцию загрузить:

:autocommand FuncUndefined MyFuncName source ~/.vim/myfuncs.vim

Необходимо, чтобы функция была определена в файле. Можно использовать символ * в шаблоне имени или просто использовать только ее. При обработке доступны символы <amatch> и <afile>: оба содержат имя искомой функции. Например, это может пригодиться, если имя файла зависит от имени функции.

Механизм автозагрузки предполагает использование специальных имен функций, содержащих и имя файла, в котором они определены:

call filename# funcname()

Пробел после решетки не нужен! Решеток может быть много, если вам нужны подкаталоги. Вим будет искать каталог autoload по путям, заданным в опции runtimepath. А в каталоге будет искать указаный файл. Например, создайте каталог autoload в каталоге ~/.vim и в него поместите файл filename.vim. В нем должна быть определена функция

function filename# funcname()

Файл будет загружен и при попытке прочитать переменную, имя которой следует тем же правилам. Однако файл не будет загружен повторно из-за незнакомой переменной! А задать такую переменную можно, и это подходит для передачи параметров автозагружаемым скриптам.

Подведем итоги. Можно избежать загрузки тяжеловесного кода, если он редко нужен. Для этого мы или определяем автокоманду и при необходимости быстренько подгружаем нужный код, либо сразу используем в коде "автозагружаемые имена", позволяя Виму загрузить функцию только тогда, когда она понадобится. Второй способ это не совсем "План Б", как на рисунке. Скорее, это способ не загромождать память. Автокоманда тоже, но ее можно трактовать как исправление ошибки "не найдена функция", то есть как запасной план! В принципе, вполне можно подсовывать "заглушки" при отладке сложного кода таким способом...

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

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

Ссылки на все уже вышедшие материалы по скриптовому языку Вим вы найдете в предыдущей заметке: