1

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

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

alias ls="echo one\ntwo\nthree"

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

:.!ls

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

one
two
three

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

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

1 ответ1

3

Неинтерактивные оболочки не проходят всю инициализацию, которую делает интерактивная оболочка. Подробности смотрите в разделе INVOCATION на странице руководства по 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 вставляет при разветвлении "оболочки", но я уверен, что вы справитесь с этим).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .