Тестирование vimscript

Я взламываю тестовый фреймворк для vimscript (я знаю, это бесполезное упражнение; приколите меня). Некоторые плагины vim делают вызовы в оболочку (с system() функция или ! команда). Я хочу, чтобы тестовый драйвер мог получать эти вызовы и возвращать предварительно запеченные данные.

Насколько я могу сказать, Vim's system() делает форк и запускает команду в подоболочке. Теоретически, должно быть возможно сделать что-то вроде

alias ls="echo one\ntwo\nthree"

так что мы можем провести тест в соответствии с:

:.!ls

и проверьте, что вывод

one
two
three

На практике vim, кажется, разветвляет подоболочку, которая не учитывает никаких временных псевдонимов. Другими словами, он создает новую чистую среду оболочки, используя оболочку пользователя (zsh, bash и т. Д.), Но не настройки оболочки пользователя (глобальные или локальные).

Знаете ли вы о каком-либо способе запуска vim в среде, в которой определенные системные вызовы контролируются пользователем?

1 ответ

Решение

Неинтерактивные оболочки не проходят всю инициализацию, которую делает интерактивная оболочка. Смотрите раздел ПРИЗНАНИЕ bash страница руководства (или любая оболочка, на которую вы ориентируетесь) для деталей.

С другой стороны, bash будет искать скрипт с именем $BASH_ENV и выполнить его перед запуском неинтерактивной оболочки. Используйте это, чтобы настроить вашу среду для экранирования оболочки vim. Демонстрация командной строки:

% bash -c 'alias'
<no output>
% export BASH_ENV=./special.aliases 
% bash -c 'alias'
this=that

Но вы можете сделать гораздо лучше, чем это: установить SHELL переменная для программы по вашему выбору, возможно, просто /bin/echoи vim будет вызывать его вместо запуска трудноуправляемой оболочки. Это работает, даже если ваша команда содержит конвейер или другие метасимволы оболочки, поэтому я настоятельно рекомендую это сделать. (Вы получите -c этот vim вставляется при разветвлении "оболочки", но я уверен, что вы можете справиться с этим).

Другие вопросы по тегам