Tôi đang cố gắng để có được shell-commandvà async-shell-commandtích hợp hoàn hảo với một vài chương trình trong .bashrctệp của mình , cụ thể là direnv trong ví dụ này.
Tôi thấy rằng nếu tôi tùy chỉnh shell-command-switch, tôi có thể nhận các quy trình shell để tải hồ sơ của mình như thể đó là một vỏ đăng nhập tương tác thông thường:
(setq shell-lệnh-switch (purecopy "-ic"))
(setq Rõ ràng-bash-args '("-ic" "export EMACS =; stty echo; bash"))
Tôi cũng đang sử dụng exec-path-from-shell .
Nói rằng tôi có một ~/.bashrctập tin với:
... eval "$ (direnv móc $ 0)" tiếng vang "foo"
Bên trong ~/code/footôi có một .envrctập tin với:
xuất PATH = $ PWD / thùng: $ PATH tiếng vang "thanh"
Nếu tôi chạy M-x shellvới default-directorythiết lập thành ~/code/foo, bash shell sẽ tải chính xác hồ sơ của tôi và chạy hook direnv để thêm nó vào đường dẫn của tôi:
direnv: đang tải .envrc quán ba direnv: xuất khẩu ~ / code / foo $ echo $ PATH / Người dùng / tên người dùng / mã / foo / bin: / usr / local / bin: ... # phần còn lại của $ PATH
Tuy nhiên, nếu default-directoryvẫn còn ~/code/foovà tôi chạy M-! echo $PATH, nó tải chính xác .bashrc của tôi nhưng không thực hiện hook direnv của thư mục hiện tại:
foo / usr / local / bin: ... # phần còn lại của $ PATH không có ./bin
Tôi nhận được kết quả tương tự nếu tôi chạy M-! cd ~/code/foo && echo $PATH.
Có cách nào tôi có thể tư vấn hoặc móc vào shell-commandhoặc start-processlàm cho nó hoạt động như thể nó được gửi từ bộ đệm vỏ tương tác không?
eval "$(direnv hook $0)". Điều này đang được thực thi, nhưng cơ chế sẽ bị hủy khi bạn đang ở trong một thư mục cụ thể với một .envrctệp thì không.
.envrctập tin được đánh giá? Hay đó chỉ là các biến môi trường không được xuất? Bạn có thể vui lòng cung cấp một ví dụ đầy đủ để tôi có thể cố gắng tái tạo điều này?
(setq shell-command-switch "-ic")thì nó sẽ được ước tính cùng với mọi lệnh khác trong ~ / .bashrc.