Eu vi exemplos on-line em que as pessoas adicionam caminhos ao caminho padrão no Emacs com:
(add-to-list 'exec-path "/usr/local/bin/")
Sou novo no Elisp e acho que entendo o que a declaração acima faz, mas tenho algumas perguntas:
Em que ordem o Emacs pesquisa pelos caminhos de execução? Por exemplo, considera o valor de
$PATH
(variável de ambiente) (e se sim, antes ou depoisexec-path
?)Como posso acrescentar vários desses caminhos? Posso apenas continuar concatenando-os? por exemplo
(add-to-list 'exec-path "PATH1", "PATH2")
ou devo fazer:
(add-to-list 'exec-path "PATH1:PATH2:PATH3")
Eu também encontrei este pacote interessante no GitHub: exec-path-from-shell . Por que é necessário um pacote para isso?
Motivação
Já descobriu que um comando funciona no seu shell, mas não no Emacs?
Isso acontece muito no OS X, onde uma instância do Emacs iniciada na GUI herda um conjunto padrão de variáveis de ambiente.
Essa biblioteca funciona resolve esse problema, copiando importantes variáveis de ambiente do shell do usuário: solicita ao shell que imprima as variáveis de interesse e depois as copia para o ambiente Emacs.
(describe-function 'add-to-list)
(C-h f
) fornecerá o documento para aadd-to-list
função, além de links para a fonte. Há também(describe-variable 'exec-path)
(C-h v
). Isso não é um comentário RTFM - esses documentos não respondem a todas as perguntas que você listou, apenas algo útil.C-h v exec-path
, use o manual (s) (Emacs e Elisp). Em um manual,i exec-path
você será direcionado a uma explicação útil. Pergunte ao Emacs primeiro - você não vai se arrepender.Respostas:
1)
PATH
eexec-path
O Emacs define a
exec-path
partir do valor dePATH
na inicialização, mas não o verá novamente mais tarde. Mas se você executar um comando, ele herdaráPATH
, nãoexec-path
, para que os subprocessos possam encontrar comandos diferentes dos do Emacs.Como diz Francesco, isso pode ser especialmente confuso para
shell-command
, como isso não executar um processo diretamente, mas chama um shell para executá-lo, o que vai usarPATH
, nãoexec-path
.2) Adicionando vários caminhos para
exec-path
Basta ligar
add-to-list
repetidamente:Observe que isso
add-to-list
contribui para o início da lista, portanto, isso acabará"PATH2"
sendo oexec-path
anterior"PATH1"
.Você também pode usar mais acesso "de baixo nível" às listas:
Isso adicionará
"PATH1"
e"PATH2"
ao seuexec-path
, nessa ordem.3) CAMINHO DO Mac OS
O problema no Mac OS X é que o Mac OS não define o ambiente da mesma forma quando você chama um programa da interface do usuário global ou quando é chamado de um shell. Isso significa que a execução do Emacs a partir de um shell resultará na definição de diferentes variáveis de ambiente do que quando você o executa no localizador. Isso é especialmente irritante se você definir variáveis de ambiente
.bashrc
iguais ou semelhantes, pois isso não afetará o Emacs "global".Aparentemente, o pacote inicia um shell e importa variáveis de ambiente a partir daí, imitando o ambiente que você obtém de um shell em um Emacs iniciado globalmente.
fonte
PATH
é definido para os programas iniciados a partir da interface do usuário global (ambiente de área de trabalho)? Estou tendo o mesmo problema comPYTHONPATH
emelpy
:). Quando inicio o Emacs a partir da área de trabalho, o Emacs não está ciente das minhasPYTHONPATH
definições no meu.zshenv
arquivo (um arquivo init parazsh
), o que é muito frustrante, poiselpy
não sabe onde encontrar meus pacotes Python. Estou feliz para mover essasPYTHONPATH
definições para um shell diferenteinit
arquivo (embora idealmente gostaria Emacs para usar as definições do meu.zshenv
)exec-path
ePATH
na sua.emacs
. Você pode definirPATH
usando(setenv "PATH" (format "%s:%s" "/new/path/element" (getenv "PATH")))
.PYTHONPATH
queelpy
deve ser usado?process-environment
, por exemplo, usandosetenv
. Você pode fazer issoelpy-mode-hook
, mas é uma variável globsl e torná-lo local de buffer pode facilmente levar a um comportamento confuso.Quando o emacs inicia um novo processo externo usando funções primitivas como
call-process
orstart-process
, o executável é pesquisadoexec-path
(e não$PATH
)No entanto, uma função como
shell-command
inicia o shell como um subprocesso e transmite o comando que você deseja executar. Para executar este comando, o shell tentará encontrar o executável em$PATH
(e não emexec-path
).Portanto, o
exec-path
que conta mais para processos externos é iniciado pelo próprio emacs, enquanto o$PATH
que conta para comandos que você executa com a função de nível superior (usando, M-!por exemplo)Se você deseja adicionar vários diretórios
exec-path
, deve usaradd-to-list
várias vezes.Você pode fazer isso manualmente
ou usando um loop
Com relação à sua terceira pergunta, se o emacs foi iniciado a partir do ambiente de área de trabalho, ele herdará o ambiente, o que pode ser menos completo que o de um shell completo.
Isso significa que às vezes pode ser necessário concluir o valor do Emacs para
$PATH
usar o que um shell comum vê. Esse é o objetivo daexec-path-from-shell
biblioteca que você mencionou.fonte