Тестирование 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 вставляется при разветвлении "оболочки", но я уверен, что вы можете справиться с этим).