Saya mencoba untuk mendapatkan shell-commanddan async-shell-commandmengintegrasikan secara mulus dengan beberapa program dalam .bashrcfile saya , khususnya direnv dalam contoh ini.
Saya menemukan bahwa jika saya mengkustomisasi shell-command-switch, saya bisa mendapatkan proses shell untuk memuat profil saya seolah-olah itu adalah shell login interaktif reguler:
(setq shell-command-switch (purecopy "-ic"))
(setq eksplisit-bash-args '("-ic" "ekspor EMACS =; stty echo; bash"))
Saya juga menggunakan exec-path-from-shell .
Katakanlah saya punya ~/.bashrcfile dengan:
... eval "$ (direnv hook $ 0)" gema "foo"
Di dalam ~/code/foosaya punya .envrcfile dengan:
export PATH = $ PWD / bin: $ PATH gema "bar"
Jika saya menjalankan M-x shelldengan default-directoryset ke ~/code/foo, bash shell akan memuat profil saya dengan benar dan menjalankan kait direnv untuk menambahkannya ke jalur saya:
direnv: memuat .envrc batang direnv: ekspor ~ PATH ~ / code / foo $ echo $ PATH / Pengguna / nama pengguna / kode / foo / bin: / usr / local / bin: ... # sisa dari $ PATH
Namun jika default-directorymasih ~/code/foodan saya jalankan M-! echo $PATH, itu benar memuat .bashrc saya tetapi tidak menjalankan hook direnv dari direktori saat ini:
foo / usr / local / bin: ... # sisa $ PATH tanpa ./bin
Saya mendapatkan hasil yang sama jika saya berlari M-! cd ~/code/foo && echo $PATH.
Apakah ada cara saya dapat menyarankan atau menghubungkan ke shell-commandatau start-processuntuk membuatnya berperilaku seolah-olah sedang dikirim dari buffer shell interaktif?
eval "$(direnv hook $0)". Ini sedang dijalankan, tetapi mekanisme yang harus dipecat ketika Anda berada di direktori tertentu dengan .envrcfile tidak.
.envrcfile yang dievaluasi? Atau hanya variabel lingkungan yang tidak diekspor? Bisakah Anda memberikan contoh lengkap sehingga saya dapat mencoba mereproduksi ini?
(setq shell-command-switch "-ic")maka itu harus dievaluasi bersama dengan setiap perintah lain di ~ / .bashrc.