J'essaie d'obtenir shell-commandet async-shell-commandd'intégrer de manière transparente avec quelques programmes dans mon .bashrcfichier, en particulier direnv dans cet exemple.
J'ai trouvé que si je personnalisais shell-command-switch, je pouvais obtenir des processus shell pour charger mon profil comme s'il s'agissait d'un shell de connexion interactif normal:
(setq shell-command-switch (purecopy "-ic"))
(setq explicit-bash-args '("-ic" "export EMACS =; stty echo; bash"))
J'utilise également exec-path-from-shell .
Disons que j'ai un ~/.bashrcfichier avec:
... eval "$ (crochet direnv $ 0)" écho "foo"
A l'intérieur ~/code/fooj'ai un .envrcdossier avec:
export PATH = $ PWD / bin: $ PATH écho "bar"
Si je lance M-x shellavec default-directoryset to ~/code/foo, un shell bash chargera correctement mon profil et exécutera le hook direnv pour l'ajouter à mon chemin:
direnv: chargement .envrc bar direnv: export ~ PATH ~ / code / foo $ echo $ PATH / Utilisateurs / nom d'utilisateur / code / foo / bin: / usr / local / bin: ... # reste de $ PATH
Cependant si default-directoryest toujours ~/code/fooet que je cours M-! echo $PATH, il charge correctement mon .bashrc mais n'exécute pas le hook direnv du répertoire courant:
foo / usr / local / bin: ... # reste de $ PATH sans ./bin
J'obtiens le même résultat si je cours M-! cd ~/code/foo && echo $PATH.
Existe-t-il un moyen de conseiller ou de connecter shell-commandou start-processde le faire se comporter comme s'il était envoyé à partir d'un tampon shell interactif?
eval "$(direnv hook $0)". Cela s'exécute, mais le mécanisme qui devrait être déclenché lorsque vous êtes dans un répertoire spécifique avec un .envrcfichier ne l'est pas.
.envrcfichier n'est-il évalué? Ou s'agit-il uniquement de variables d'environnement qui ne sont pas exportées? Pourriez-vous s'il vous plaît fournir un exemple complet afin que je puisse essayer de le reproduire?
(setq shell-command-switch "-ic")il doit être évalué avec toutes les autres commandes dans ~ / .bashrc.