Como fazer com que o terminal / shell gerado no Emacs em execução no Mac herde as variáveis ​​de ambiente do terminal nativo?

7

O terminal nativamente no Mac, ou seja, gerado pelo Spotlight ou Launchpad, adota as variáveis ​​de ambiente desejadas, incluindo a personalização no ~/.bash_profile. Mas quando eu corro Emacs ( Emacs.apptirado de Emacs Para Mac OS X ) e shell desova dentro dele (usando shell, eshellou term), as conchas não adotar as mesmas variáveis de ambiente, como mencionado anteriormente.

Percebo que o shell adota seu ambiente a partir do processo que o inicia e é por isso que os valores do ambiente do shell variam os mesmos que os do Emac (por exemplo (getenv "PATH"))

Se aventurar dentro do conteúdo Terminal.appe Emacs.appnão me deu sorte.

Como posso obter automaticamente a mesma variável de ambiente que recebo no Terminal.appshell gerado no Emacs? E eu não prefiro lançar o Emacs a partir do terminal.

(Eu percebo que isso é muito MacOSX-ish e as respostas podem propor soluções / ajustes totalmente fora do Emacs. Mas a pergunta diz respeito ao Emacs, portanto escolhi este site)

Dedos Sangrentos
fonte
Se você iniciar o Emacs.app em uma janela do Terminal, verá as variáveis ​​ambientais corretas?
Melioratus
Dessa forma, as variáveis ​​de ambiente são mais ricas, mas não são as mesmas do terminal a partir do qual foram lançadas. As personalizações (aliases etc) no ~ / .bash_profile não são lidas. @Melioratus
Bleeding Fingers
11
Esquisito. Meu ~/.bash_profileé lido corretamente quando executo Emacs.appassim /Applications/Emacs.app/Contents/MacOS/Emacs . &usando Terminal.app.
Melioratus 10/10
Apenas verifiquei se meus apelidos também funcionam.
Melioratus 10/10

Respostas:

5

Recentemente, comecei a usar o emacs fora do terminal, o que estava me causando alguns problemas no PATH. Eu tentei configurá-lo adicionando (getenv "PATH")ao meu caminho executivo, entre outras coisas que, em última análise, nunca funcionaram.

Acabei instalando o pacote exec-path-from-shell via melpa. Ele funciona usando a $SHELLvariável de ambiente para solicitar ao seu shell que você imprima $PATHe copie o resultado.

Edit: Aqui está o código que eu uso

;; I set this at the beginning of my init.el for other mac specific settings
(defconst *is-a-mac* (eq system-type 'darwin))

;; Later on, after loading exec-path-from-shell package
(if *is-a-mac*
    (add-hook 'after-init-hook 'exec-path-from-shell-initialize))
Steven
fonte
11
Descreva como esta resposta responde à pergunta. Por exemplo, de que maneira a instalação desse pacote ajuda?
Drew
3

Dado o título real aqui "Como fazer com que o terminal / shell gerado no Emacs em execução no Mac herde as variáveis ​​de ambiente do terminal nativo?" você não pode, pois o Emacs não terá o Terminal.app como um super processo em nenhum nível, portanto o Emacs não pode herdar nada do shell do Terminal.app. Você precisa tornar o ambiente o mesmo, fornecendo os mesmos arquivos.

Com base nesta resposta no AskDifferent

Você precisa observar quais são os arquivos de inicialização do bash. ~ / .bash_profile é lido em um shell de login ~ / .bashrc quando outro shell é iniciado.

O Cocoa Emacs é uma GUI e, quando executado, é executado em um subprocesso em que nada executou um shell de login, portanto, em seu ambiente, não há nada que tenha originado ~ / .bash_profile. O Emacs iniciará um shell sem login, para que qualquer coisa em ~ / .bashrc seja lida.

Esse tipo de coisa é por que é recomendado no manual do bash incluir isso em ~ /, bash_profile

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi 

e coloque suas configurações de ambiente em ~ / .bashrc

Por que razão /Applications/Emacs.app/Contents/MacOS/Emacs. trabalha no terminal. O Terminal.app padroniza a execução de um shell no modo de login e, portanto, o shell originou ~ / .bash_profile e o emacs é um subprocesso desse shell e, portanto, herda seu ambiente. Portanto, neste caso, você herda do shell no Terminal.app

Nota O X11 difere à medida que você o executa a partir de um shell, para que o shell tenha variáveis ​​de ambiente, pois esse shell é iniciado como um login.

user151019
fonte
3

Como Mark disse, Terminal e iTerm 2 invoke conchas como shells de login, por padrão, de modo que lê Bash ~/.bash_profile, mas não ~/.bashrc, mas M-x shelle M-x terminvocação de conchas como conchas não-login, para que lê Bash ~/.bashrc, mas não ~/.bash_profile. Adicione . ~/.bash_profilea ~/.bashrce continuar usando ~/.bash_profilecomo seu arquivo de configuração do Bash, ou adicionar . ~/.bashrcpara ~/.bash_profilee começar a usar ~/.bashrccomo seu arquivo de configuração do Bash.

Para criar shell-commande shell-command-on-regionler ~/.bash_profile, adicione -la shell-command-switch:

(setq shell-command-switch "-lc")

Você pode definir um caminho padrão amplo para o OS X salvando, por exemplo, uma lista de propriedades como esta ~/Library/LaunchAgents/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>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 aplicativos de terminal, no Emacs e em outros aplicativos após o logoff e o logon novamente. Esse método não altera o caminho nos aplicativos que são abertos como itens de logon ou que são reabertos no logon após um desligamento 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.

nisetama
fonte