Vim makeprg делает расширение переменной среды - PullRequest
0 голосов
/ 20 января 2019

Это беспокоит меня больше, чем следовало, и это меня совершенно озадачило.Я чувствую, что у поиска ответа будет несколько хороших возможностей для обучения, поэтому, надеюсь, он уместен.

Я занимаюсь разработкой встроенного C с Vim и у меня есть настройки для любителей для Arduino (используя Arduino Makefile ).Я использую :make с некоторыми ярлыками для проектов сборки.

Внешнее определение разрешает корневой каталог Makefile Arduino на уровне проекта Makefile: 'ARDMK_DIR = / usr / local / opt / arduino-mk'.Это определить как экспорт в моей оболочке (zsh).Вот где это странно:

  • Использование make в приглашении оболочки, проект строит нормально:
make -d
This program built for i386-apple-darwin11.3.0
Reading makefiles...
Reading makefile `Makefile'...
Reading makefile `/usr/local/opt/arduino-mk/Arduino.mk' (search path) (no ~ expansion)...
  • Однако, используя :make вVim определение становится чем-то из старой установки:
:make
This program built for i386-apple-darwin11.3.0
Reading makefiles...
Reading makefile `Makefile'...
Reading makefile `/usr/local/Cellar/arduino-mk/1.5.2/Arduino.mk' (search path) (no ~ expansion)...
Makefile:24: /usr/local/Cellar/arduino-mk/1.5.2/Arduino.mk: No such file or directory

Я не могу всю жизнь найти, где ARDMK_DIR переопределяется в '/ usr / local / Cellar / arduino-mk /1.5.2.Вещи, которые я пробовал:

  • setlocal makeprg=echo\ $ARDMK_DIR\ &&\ make\ -d\: эхо возвращается с моим определением оболочки (/ usr / local / opt / arduino-mk), но make завершается с ошибкой выше !!
  • :echo $ARDMK_DIR: снова возвращает определение моей оболочки.
  • ag мой домашний каталог для ARDMK_DIR, единственное место, где он определен, - это экспорт моей оболочки.Сделал так как для моего корневого каталога и тоже самое.То же самое для $ VIMRUNTIME
  • Даже vim-disptach прекрасно работает, вызывая те же makeprg?!
  • Переопределите ARDMK_DIR в Makefile проекта.Все сборки найти как положено.Однако я не хочу этого делать, так как я компилирую с другими системами.
  • Тот же конфиг vim работает на других системах macOS и Linux с ожидаемым поведением.

Некоторые где-то между echo и фактическое выполнение make, ARDMK_DIR переопределяется.Почему и кто-нибудь может придумать способ выяснить, где и решить эту проблему?

1 Ответ

0 голосов
/ 20 января 2019

Zsh имеет несколько исходных файлов, которые получены.Файл .zshenv всегда создается, когда запускается оболочка, а файл .zshrc создается только при запуске оболочки в интерактивном режиме.

Если вы определяете переменную ARDMK_DIR с другими значениями в .zshenv и .zshrc, значение из .zshrc будет использоваться при интерактивной работе с оболочкой (ввод команд, запуск Vim, ...).

Но когда Vim запускает команду, она будетзапустить неинтерактивную оболочку.В этом случае будет получен только файл .zshenv, поэтому вы получите значение из этого файла.

Остался один вопрос:

Почему следующая команда сначала вывела правильное значение, ноmake использует неправильно?

:setlocal makeprg=echo\ $ARDMK_DIR\ &&\ make\ -d\ 

Для тестирования я запустил Vim под strace.Затем:

:set makeprg=echo\ $EDITOR
:make

В файле strace я нашел следующую строку:

execve("/usr/bin/zsh", ["/usr/bin/zsh", "-c", "echo vi  2>&1| tee /tmp/vdxR5DH/"...], [/* 86 vars */]) = 0

Как вы можете видеть, Vim выполняет echo vi, поэтому он уже развернул переменную среды $EDITOR к его значению перед вызовом оболочки.


Таким образом, ответ на поставленный выше вопрос состоит в том, что команда echo повторяет текст, который Vim вставил в командную строку, в то время как команда make получает значение переменной из среды.Поскольку это неинтерактивная оболочка, это значение из .zshenv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...