Saya mencoba untuk mendapatkan shell-command
dan async-shell-command
mengintegrasikan secara mulus dengan beberapa program dalam .bashrc
file 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 ~/.bashrc
file dengan:
... eval "$ (direnv hook $ 0)" gema "foo"
Di dalam ~/code/foo
saya punya .envrc
file dengan:
export PATH = $ PWD / bin: $ PATH gema "bar"
Jika saya menjalankan M-x shell
dengan default-directory
set 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-directory
masih ~/code/foo
dan 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-command
atau start-process
untuk 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 .envrc
file tidak.
.envrc
file 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.