Ben almaya çalışıyorum shell-commandve async-shell-commandbenim de programların bir çift ile sorunsuzca entegre etmek .bashrcözellikle dosyaya direnv bu örnekte.
Özelleştirirsem shell-command-switchprofilimi normal bir etkileşimli giriş kabuğu gibi yüklemek için kabuk süreçleri alabileceğimi fark ettim:
(setq shell-command-switch (salt kopya "-ic"))
(setq açık-bash-args '("-ic" "dışa aktarma EMACS =; stty echo; bash"))
Ben de exec-path-from-shell kullanıyorum .
Diyelim ki bir ~/.bashrcdosya var:
... eval "$ (direnv hook $ 0)" echo "foo"
İçinde ~/code/foobir .envrcdosya var:
dışa aktarma PATH = $ PWD / bin: $ PATH echo "bar"
Eğer set M-x shellile çalıştırırsam , bir bash kabuğu profilimi doğru şekilde yükler ve bunu yoluma eklemek için direnv kancasını çalıştırır:default-directory~/code/foo
direnv: yükleme .envrc bar direnv: ihracat ~ PATH ~ / kod / foo $ echo $ PATH / Kullanıcılar / kullanıcı adı / kod / foo / bin: / usr / local / bin: ... # $ PATH geri kalanı
Ancak default-directoryhala ~/code/foove ben çalışırsam , M-! echo $PATHdoğru benim .bashrc yükler ama geçerli dizinin direnv kanca yürütmez:
foo / usr / local / bin: ... #. /bin olmadan $ PATH'ın geri kalanı
Eğer koşarsam aynı sonucu alırım M-! cd ~/code/foo && echo $PATH.
Bir interaktif kabuk tamponundan gönderiliyormuş gibi davranmasını sağlamak shell-commandveya tavsiye etmek veya takmak için bir yol var mı start-process?
eval "$(direnv hook $0)". Bu yürütülüyor, ancak bir .envrcdosya ile belirli bir dizinde olduğunuzda ateşlenmesi gereken mekanizma değil.
.envrcDosyadaki hiçbir şey değerlendirilmiyor mu? Yoksa sadece dışa aktarılmayan ortam değişkenleri mi? Bunu yeniden oluşturmayı deneyebilmem için lütfen tam bir örnek verebilir misiniz?
(setq shell-command-switch "-ic")değerlendirmişseniz, ~ / .bashrc içindeki diğer tüm komutlarla birlikte değerlendirilmelidir.