Tôi đang cố gắng để có được shell-command
và async-shell-command
tích hợp hoàn hảo với một vài chương trình trong .bashrc
tệ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 ~/.bashrc
tập tin với:
... eval "$ (direnv móc $ 0)" tiếng vang "foo"
Bên trong ~/code/foo
tôi có một .envrc
tập tin với:
xuất PATH = $ PWD / thùng: $ PATH tiếng vang "thanh"
Nếu tôi chạy M-x shell
với default-directory
thiế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-directory
vẫn còn ~/code/foo
và 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-command
hoặc start-process
là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 .envrc
tệp thì không.
.envrc
tậ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.