Próbuję dostać shell-command
i async-shell-command
do integracji z kilku programów w moim .bashrc
pliku, specjalnie direnv w tym przykładzie.
Przekonałem się, że jeśli dostosuję shell-command-switch
, mogę uzyskać procesy powłoki ładujące mój profil, tak jakby to była zwykła interaktywna powłoka logowania:
(setq shell-command-switch (purecopy „-ic”)) (setq express-bash-args '(„-ic” „export EMACS =; stty echo; bash”))
Używam również exec-path-from-shell .
Powiedz, że mam ~/.bashrc
plik z:
... eval „$ (hak direnv 0 $)” echo „foo”
W środku ~/code/foo
mam .envrc
plik z:
eksport PATH = $ PWD / bin: $ PATH „pasek” echa
Jeśli uruchomię M-x shell
z default-directory
ustawioną na ~/code/foo
, powłoka bash poprawnie załaduje mój profil i uruchomi direnv hook, aby dodać go do mojej ścieżki:
direnv: ładowanie .envrc bar direnv: eksport ~ ŚCIEŻKA ~ / code / foo $ echo $ PATH / Users / nazwa użytkownika / kod / foo / bin: / usr / local / bin: ... # reszta $ PATH
Jednak jeśli default-directory
nadal jest ~/code/foo
uruchomiony M-! echo $PATH
, to poprawnie ładuje mój plik .bashrc, ale nie wykonuje haka direnv bieżącego katalogu:
bla / usr / local / bin: ... # reszta $ PATH bez ./bin
Otrzymuję ten sam wynik, jeśli biegnę M-! cd ~/code/foo && echo $PATH
.
Czy istnieje sposób, w jaki mogę doradzić, podpiąć się shell-command
lub start-process
sprawić, by zachowywał się tak, jakby był wysyłany z interaktywnego bufora powłoki?
eval "$(direnv hook $0)"
. Jest to wykonywane, ale nie działa mechanizm, który powinien zostać uruchomiony, gdy jesteś w określonym katalogu z .envrc
plikiem.
.envrc
pliku nie jest oceniane? Czy to tylko zmienne środowiskowe, które nie są eksportowane? Czy możesz podać pełny przykład, abym mógł spróbować to odtworzyć?
(setq shell-command-switch "-ic")
, powinien zostać oceniony wraz z każdym innym poleceniem w ~ / .bashrc.