2014-01-09 3 views
0

Я использую vim для редактирования ядра Linux. В моей среде используется множество переменных и функций, определенных для этого и для других целей, включая функцию bash для компиляции ядра. Так что я обычно делаю это:Имейте vim makeprg наследуйте среду оболочки хоста

  1. vim file.c
  2. редактировать
  3. Ctrl + Z
  4. функция запуска компиляции
  5. прочитал ошибки
  6. fg
  7. исправить ошибки.

Я хотел бы заменить этот утомительный процесс с :make и просматривать ошибки с :copen. Проблема заключается в том, что для компиляции мне нужна вся моя среда ... I может написать сценарий, который настраивает среду каждый раз, а затем вызывает функцию компиляции и вызывает этот скрипт из: make, но это добавит несколько секунд для каждого: выполните вызов для настройки среды.

Так что мой вопрос: может ли :make наследовать переменные/функции окружающей среды из оболочки, из которой она порождена?

ответ

3

Взаимоотношение процесса выглядит следующим образом:

bash → vim → bash → make 

Если вы хотите иметь make наследуют среды от исходной оболочки (что запущен Vim), вы должны export всех этих переменных (и функций с export -f funcname) в исходной оболочке. Либо добавьте export в определения окружения, либо (если вы не можете их изменить) напишите сценарий оболочки, который вы используете источник (source scriptname) от Bash до вызова Vim.

Вы можете проверить, является ли переменная была правильно экспортировали изнутри Vim через

:echo $VARNAME 
+0

К сожалению, я не могу добавить экспорт во все мои объекты окружения. Могу ли я повторно инициализировать свою среду сборки в vim? Должен ли я это делать каждый раз, когда я вызываю makeprg?То есть, каждый раз, когда я вызываю makeprg, vim порождает оболочку bash? – danns87

+0

Я написал сценарий, который устанавливает среду сборки и запускает скрипт компиляции, и я установил этот скрипт как makeprg в vim. Он работает, но было бы здорово избежать накладных расходов на настройку среды сборки каждый раз, когда я звоню: make. Есть идеи? – danns87

+0

Вам не нужно экспортировать _add_ при определении; вы можете экспортировать их позже (внутри той же оболочки, поэтому я сказал _source_ любой скрипт, который делает это). –

1

Другой способ запуска make должен иметь другой оболочки смотреть набор файлов или каталог и пнуть команду, когда любой файл изменяется. Каждый раз, когда вы :w, вы начинаете команду make в этой другой оболочке.

Есть целый ряд подходов к этому методу, как указано в https://superuser.com/questions/181517/how-to-execute-a-command-whenever-a-file-changes

Для простоты на Линукс машин, вы можете использовать inotifywait:

while true; do 
    change=$(inotifywait -e close_write,moved_to,create /tmp/path/to/directory/) 
    echo "something happened!" 
    make 
done 

Вам нужна другая команда на OS X, так как он не поддерживает inotifywait. В вопросе суперпользователя излагаются некоторые возможные подходы к OS X.

Хотя это не позволяет открыть ошибки, используя :copen.

+0

Спасибо. Это полезно знать в целом, но мне бы очень хотелось использовать функцию: copen. – danns87

+1

Если вы перенаправляете/'tee' вывод отдельной команды make в файл, вы можете': cfile filename', что внутри Vim. Это было бы очень похоже на использование ': copen'. –

Смежные вопросы