2012-03-12 11 views

risposta

26

Si può provare ad aggiungere qualcosa di simile al vostro .emacs:

(let ((path (shell-command-to-string ". ~/.bashrc; echo -n $PATH"))) 
    (setenv "PATH" path) 
    (setq exec-path 
     (append 
     (split-string-and-unquote path ":") 
     exec-path))) 

A seconda che hai impostato le variabili env in .bash_profile o .bashrc voi potrebbe aver bisogno di aggiustare leggermente questo snippet. L'esempio è per la variabile PATH, che è un po 'più speciale (dato che è necessario impostare exec-path in Emacs), ma può essere estesa per lavorare con variabili arbitrarie - si potrebbe avere un elenco di variabili che devono essere lette da .bashrc e impostato su Emacs.

Non sono sicuro che tu stia utilizzando OS X o GNU/Linux. L'avvio di Emacs dalla barra dei menu della GUI in Linux comporterà in genere un Emacs che non ha lo stesso PATH come lanciato dalla riga di comando. Questo problema risale ai primi script di Xsession xdm e anche se sono abbastanza facili da risolvere (in pratica si utilizza uno script Xsessionwrapper che esegue exec $SHELL -c Xsession in modo che la shell venga eseguita prima di eseguire Xsession dell'utente), nessuno si è preoccupato di farlo in un tempo molto lungo tempo (e dubito che qualcuno lo farà). Per quanto ne so, il problema è presente anche nei discendenti moder xdm come kdm e gdm.

Su OS X la gestione delle variabili env è un altro problema e per ottenere le variabili ENV in genere è necessario eseguire Emacs dalla riga di comando come questa /Applications/Emacs.app/Contents/MacOS/Emacs o giocare con ~/.MacOSX/environment.plist. Lo snippet di codice che ho fornito dovrebbe coprirti in entrambi i casi.

Aggiornamento

Recentemente questo processo è stato facilitato dall'estensione exec-path-from-shell. Imposta emacs $PATH più o meno allo stesso modo, ma generalmente è preferibile utilizzare un'estensione per hackerare la soluzione da soli.

+0

Questa risolvere il mio problema con Flymake non si utilizza la corretta Perl da perlbrew. A differenza di perlbrew-mini.el – titanofold

+1

_exec-path-from-shell_ è ottimo e ha risolto il mio problema con _ensime_ che non è stato possibile avviare e lanciare l'errore 'type erred type stringp nil'. – cyrillk

+0

Perché usi split-string-and-unquote anziché split-string? –

1

Non risponde alla domanda, ma è sempre possibile passare le variabili di ambiente sulla riga di comando make. Per esempio: MxcompileRETmake -k CXXFLAGS='-Wall'RET

4

Questo è dove le variabili di ambiente del processo che è iniziato emacs sono:

- Comando: getenv var

Questa funzione restituisce il valore della variabile ambiente var, come una stringa . var dovrebbe essere una stringa. Se var non è definito nell'ambiente, getenv restituisce nil. Restituisce "" "' se var è impostato ma null. All'interno di Emacs, un elenco di variabili di ambiente e i loro valori sono mantenuti nell'ambiente di processo variabile.

 (getenv "USER") 
      ⇒ "lewis" 

- Variabile: processo-ambiente

Questa variabile è una lista di stringhe, ognuno dei quali descrive una variabile d'ambiente. Le funzioni getenv e setenv funzionano tramite questa variabile.

 process-environment 
     ⇒ ("PATH=/usr/local/bin:/usr/bin:/bin" 
      "USER=lewis" 
      "TERM=xterm" 
      "SHELL=/bin/bash" 
      "HOME=/home/lewis" 
      ...) 

Sembra che tu stia assumendo che Emacs è stato avviato da una sessione dibash. Tuttavia, spesso i processi sotto X vengono avviati da una sessione sh, che sarebbe non leggere le variabili di ambiente che erano state impostate nello script ~/.bashrc. Un modo semplice per aggirare questo è quello di modificare il file ~/.xinitrc per utilizzare bash anziché sh (potrebbe essere semplice come aggiungere #!/bin/bash nella parte superiore del file).

Fonte: gnu.org

+1

Intendevi '#!/Bin/bash'? – Elena

+0

Grazie, @ Elena. Fisso. :) – dmvianna

Problemi correlati