Emacs e discordâncias da linha de comando $ PATH no OSX


17

Tendo alguns problemas com as PATHconfigurações no Emacs que estão afetando meu ambiente Haskell:

Estou usando o ZSH e, quando vou para a linha de comando e ligo echo $PATH, ele retorna:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Isso vem da .zprofileconfiguração em que tenho:

# Set the list of directories that Zsh searches for programs.
path=(
  ~/Library/Haskell/bin
  /usr/local/{bin,sbin}
  $path
)

Então, na linha de comando, quando ligo which cabal, recebo corretamente:/Users/g/Library/Haskell/bin/cabal

Quando inicio o Emacs e vou para o shelle chamo which cabal, recebo: o /usr/bin/cabalque está me causando um problema, pois é uma versão diferente.

Quando inspeciono echo $PATHno Emacs shell, vejo:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

Eu não tenho idéia de como na Terra isso PATHpode ser diferente ...

Alguém sabe como fazer com que meu ZSHshell e o Emacs concordem com o mesmo PATH? Eu suspeito que é isso que está controlando de onde cabalestá sendo carregado.

ATUALIZAÇÃO : Correndo echo $SHELLdo Emacs imprime:/bin/zsh

ATUALIZAÇÃO 2 : Isso está no OSX .

ATUALIZAÇÃO 3 : Tentei usar o módulo exec-path-from-shell e ele não funciona. Ainda tenho os mesmos problemas e, como efeito colateral, atrapalha minhas cores de tema do terminal :(

ATUALIZAÇÃO 4 : Instalei o Emacs via brew install --cocoa --srgb emacse executei o emacs vinculado desta maneira:

~ ❯❯❯ which emacs
/usr/local/bin/emacs
~ ❯❯❯ l /usr/local/bin/emacs
lrwxr-xr-x  1 g  admin    30B 29 Jan 18:34 /usr/local/bin/emacs -> ../Cellar/emacs/24.4/bin/emacs
~ ❯❯❯ l /usr/local/Cellar/emacs/24.4/bin/emacs
-r-xr-xr-x  1 g  admin    87B 29 Jan 18:34 /usr/local/Cellar/emacs/24.4/bin/emacs

Você está usando o ZSH como seu shell de login?
Wasamasa

Não sei o que você quer dizer com shell de login exatamente, mas eu acho que eu chamei chsh...de volta no dia de mudar o meu shell default
Galder Zamarreño

Estou usando o iTerm2 ...
Galder Zamarreño

2
Aparentemente não, modifique PATH ~/.profileou /etc/profileentão.
wasamasa

1
Defina suas variáveis ​​de ambiente ~/.zshenv, que serão originadas de forma consistente, no entanto, o shell é iniciado (interativo versus não interativo). Se exec-path-from-shellé bagunçar suas cores do tema do terminal, você pode definir exec-path-from-shell-argumentspara nilantes de chamar exec-path-from-shell-initializepara ter certeza que não está funcionando as partes interativas de sua configuração zsh.
Sanityinc

Respostas:



8

Este é um problema de ambiente irritante para o OSX, o $PATHaparecimento no Emacs é proveniente de /etc/pathsarquivo, que é anexado ao que eu tiver definido no shell. Eu adicionei /Users/g/Library/Haskell/binao topo do /etc/pathsarquivo e funcionou bem.

Entrar no shell e chamar o echo $PATHEmacs mostra agora:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

E cabala versão é de fato cabal-install version 1.22.2.0: D

Obrigado a todos !!


Obrigado a beOn por suas dicas neste post$PATH no OSX .
Galder Zamarreño

2
Uma solução melhor é modificar o caminho ~/.zshenv. Mudanças não são refletidas no PATH Emacs'
Galder Zamarreño

Posso confirmar que isso echo export PATH=$PATH > ~/.zshenvfaz com que o Emacs atenda M-x shellna próxima invocação.
Linus Arver 16/08/16

5

Se você iniciar o emacs a partir do seu ambiente GUI (gnome, kde, ...), os scripts de inicialização do shell não serão originados no seu ambiente. Portanto, o $PATHque você definiu cuidadosamente .zshnão será carregado. Os ambientes da GUI geralmente não os originam, embora possam carregar seu ~/.profilearquivo.

Você pode tentar adicionar isso ao seu .pam_environment:

PATH DEFAULT=${PATH}:/MYHOMEDIR/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin

Você precisará reiniciar sua sessão da GUI para carregá-la.

Este documento pode ajudá-lo a $PATHdefinir sua variável corretamente:

https://help.ubuntu.com/community/EnvironmentVariables#Session-wide_environment_variables

Eu uso o ~/.pam_environmentarquivo para gerenciar variáveis ​​de ambiente que precisam estar acessíveis nos meus processos shell ou emacs.

PS: Um comentarista astuto indica que você provavelmente está no Mac. Não sei como configurá-lo $PATHna GUI do Mac, mas o ponto ainda permanece em relação à diferença entre o ambiente do seu shell e o ambiente da GUI. Como você configura $PATHa GUI parece depender da versão do sistema operacional. No entanto, você pode usar:

(setenv "PATH" (concat (getenv "PATH") ":/foo/bar"))

no seu ~/.emacs.d/initse você quiser apenas uma solução que funcione.

PPS: Se você quiser executar um shell no emacs, você é provavelmente melhor fora de usar ansi-term, em vez de shell.


Duvido que a pergunta seja sobre o Linux, dado que o questionador mencionou o uso do iTerm 2 .
wasamasa

3

Se alguma parte do PATH se perder, você poderá adicioná-lo no seu ~ / .emacs

;;; We add /path/to/something/extra by appending it to the path
(setenv "PATH" (concat (getenv "PATH") ":/path/to/something/extra"))
;;; /path/to/something/extra is now at the end of the PATH.
;;; or you can use:
;(setenv "PATH" (concat "/path/to/something/extra:" (getenv "PATH")))
;;; /path/to/something/extra is now at the beginning of the PATH.

Para evitar problemas de PATH, eu sempre inicio o emacs na linha de comando com o PATH exportado de ~ / .bashrc.


2

Outra maneira de fazer isso é simplesmente dizer ao shell que é um shell de logon para que ele obtenha todos os arquivos corretos. Eu faço isso para o bash definindo explicit-bash-argscomo ("--noediting" "--login"). Parece que o equivalente a zsh seria definido explicit-zsh-argscomo ("-l").

Então no meu .emacs:

(setq explicit-bash-args '("--noediting" "--login"))

No seu, algo como:

(setq explicit-zsh-args '("-l"))

Eu acho que isso "--noediting"é desnecessário e não parece haver uma maneira de dizer ao zsh sobre isso, mas isso pode ser algo para investigar se isso não funcionar tão bem quanto você esperaria.


1
Isso funciona para um shell executado no Emacs. Ele não funciona para comandos executados diretamente no Emacs, como via M-x shell-command.
30918 mernst

1

Você também pode definir um caminho padrão para todo o OS X salvando, por exemplo, uma lista de propriedades como esta ~/Library/LaunchAgents/my.startup.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

O novo caminho deve ser mostrado nos shells, no Emacs e em outros aplicativos após o logout e o logon novamente.

Esse método não altera o caminho nos aplicativos que são abertos como itens de logon ou quando os aplicativos são reabertos no logon após um encerramento forçado. Se você possui o Emacs, um aplicativo de terminal ou outros aplicativos em que deseja alterar o caminho nos itens de login, será necessário removê-los.

No 10.9 e versões anteriores, você também pode adicionar uma linha como esta para /etc/launchd.conf:

setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

No entanto, o suporte para /etc/launchd.conffoi removido em 10.10.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.