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

409
So8res

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

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

alias ls="echo one\ntwo\nthree" 

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

:.!ls 

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

one two three 

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

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

1

1 ответ на вопрос

3
alexis

Неинтерактивные оболочки не проходят всю инициализацию, которую делает интерактивная оболочка. Подробности смотрите в разделе 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 будет вызывать ее вместо запуска трудноуправляемой оболочки. Это работает, даже если ваша команда содержит конвейер или другие метасимволы оболочки, поэтому я настоятельно рекомендую это сделать. (Вы получите те -cvim-вставки, когда разветвляете «оболочку», но я уверен, что вы справитесь с этим).

Потрясающие. Один вопрос: есть ли zsh-эквивалент? Трудно понять, в какой оболочке будет работать vim, и я знаю, что не могу поддержать их всех, но было бы неплохо поразить всех крупных игроков. So8res 11 лет назад 0
Вы должны сами посмотреть это в руководстве по zsh. Или используйте второй метод (переопределите $ SHELL), как я рекомендовал. Оболочка, под которой работает vim, не имеет значения: Vim запустит все, что ей скажет $ SHELL. alexis 11 лет назад 0