Estou tentando obter shell-command
e async-shell-command
integrar perfeitamente com alguns programas no meu .bashrc
arquivo, 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 ~/.bashrc
arquivo com:
... avaliação "$ (gancho direnv $ 0)" eco "foo"
Dentro ~/code/foo
, tenho um .envrc
arquivo com:
exportar PATH = $ PWD / bin: $ PATH eco "bar"
Se eu executar M-x shell
com default-directory
set ~/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-directory
ainda está ~/code/foo
e 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-command
ou start-process
fazer 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 .envrc
arquivo não está.
.envrc
arquivo é 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.