Ben almaya çalışıyorum shell-command
ve async-shell-command
benim de programların bir çift ile sorunsuzca entegre etmek .bashrc
özellikle dosyaya direnv bu örnekte.
Özelleştirirsem shell-command-switch
profilimi 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 ~/.bashrc
dosya var:
... eval "$ (direnv hook $ 0)" echo "foo"
İçinde ~/code/foo
bir .envrc
dosya var:
dışa aktarma PATH = $ PWD / bin: $ PATH echo "bar"
Eğer set M-x shell
ile ç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-directory
hala ~/code/foo
ve ben çalışırsam , M-! echo $PATH
doğ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-command
veya tavsiye etmek veya takmak için bir yol var mı start-process
?
eval "$(direnv hook $0)"
. Bu yürütülüyor, ancak bir .envrc
dosya ile belirli bir dizinde olduğunuzda ateşlenmesi gereken mekanizma değil.
.envrc
Dosyadaki 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.