Estou tentando obter shell-commande async-shell-commandintegrar perfeitamente com alguns programas no meu .bashrcarquivo, especificamente o direnv neste exemplo.
Descobri que, se eu personalizasse shell-command-switch, poderia obter processos de shell para carregar meu perfil como se fosse um shell de logon interativo regular:
(setq shell-command-switch (purecopy "-ic"))
(setq explícito-bash-args '("-ic" "exporta EMACS =; eco stty; bash"))
Eu também estou usando exec-path-from-shell .
Digamos que eu tenho um ~/.bashrcarquivo com:
... avaliação "$ (gancho direnv $ 0)" eco "foo"
Dentro ~/code/foo, tenho um .envrcarquivo com:
exportar PATH = $ PWD / bin: $ PATH eco "bar"
Se eu executar M-x shellcom default-directoryset ~/code/foo, um shell bash carregará meu perfil corretamente e executará o gancho direnv para adicioná-lo ao meu caminho:
direnv: carregando .envrc Barra direnv: exportação ~ PATH ~ / code / foo $ echo $ PATH / Usuários / nome de usuário / código / foo / bin: / usr / local / bin: ... # rest of $ PATH
No entanto, se default-directoryainda está ~/code/fooe eu corro M-! echo $PATH, ele carrega corretamente meu .bashrc, mas não executa o gancho direnv do diretório atual:
foo / usr / local / bin: ... # resto de $ PATH sem ./bin
Eu obtenho o mesmo resultado se eu executar M-! cd ~/code/foo && echo $PATH.
Existe uma maneira de aconselhar, conectar shell-commandou start-processfazer com que ele se comporte como se estivesse sendo enviado de um buffer de shell interativo?
eval "$(direnv hook $0)". Isso está sendo executado, mas o mecanismo que deve ser acionado quando você está em um diretório específico com um .envrcarquivo não está.
.envrcarquivo é avaliado? Ou são apenas variáveis de ambiente que não são exportadas? Poderia, por favor, fornecer um exemplo completo para que eu possa tentar reproduzir isso?
(setq shell-command-switch "-ic"), deverá ser avaliado juntamente com todos os outros comandos em ~ / .bashrc.