2012-03-12 63 views
14

我想通過Emacs的編譯模式編譯u-boot,它看起來像Emacs不知道如何找到bash環境變量。儘管我設置了它們,並且可以通過Emacs shell仿真進行編譯,但編譯模式仍然會嘗試編譯,就好像它們不在那裏一樣。如何讓Emacs識別用於編譯的bash環境變量?

我需要做些什麼才能使其更具環保意識?

回答

26

你可以嘗試添加像你.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))) 

根據您是否已在.bash_profile或設置ENV變量.bashrc你可能需要稍微調整此片段。這個例子適用於PATH變量,這個變量有點特別(因爲你必須在Emacs中設置exec-path),但是可以擴展爲適用於任意變量 - 你可以有一個必須從.bashrc並設置成Emacs。

我不確定您是否使用OS X或GNU/Linux。從Linux的GUI菜單欄啓動Emacs通常會導致Emacs與命令行啓動的Emacs沒有相同的PATH。這個問題可以追溯到第一個xdm Xsession腳本,雖然它們很容易修復(基本上使用Xsessionwrapper腳本,但exec $SHELL -c Xsession因此shell在運行用戶的Xsession之前運行),但沒有人花費很長時間時間(我懷疑任何人都會)。據我所知,這個問題甚至存在於現代xdm後代,如kdmgdm

在OS X上,env變量的處理完全是另一個問題,爲了獲得ENV變量,您通常必須從命令行運行Emacs,例如/Applications/Emacs.app/Contents/MacOS/Emacs或使用~/.MacOSX/environment.plist。但是,我提供的代碼片段應該會在兩種情況下都包含您。

更新

最近這個過程中取得了由exec-path-from-shell擴展更容易。它或多或少以相同的方式設置emacs $PATH,但使用擴展名通常更適合自己破解解決方案。

+0

這解決與Flymake不perlbrew使用正確的Perl我的問題。不像perlbrew-mini.el – titanofold 2013-04-20 01:28:39

+1

_exec-path-from-shell_很好,解決了我的問題,因爲_ensime_無法啓動並拋出錯誤的類型參數stringp nil錯誤。 – cyrillk 2014-07-21 20:17:47

+0

爲什麼你使用split-string-and-unquote而不是split-string? – 2017-05-14 18:30:36

1

它並不嚴格回答您的問題,但您始終可以在make命令行上傳遞環境變量。例如:的MxcompileRETmake -k CXXFLAGS='-Wall'RET

4

這是該開始emacs過程中的環境變量是:

- 命令:GETENV VAR

該函數返回 環境變量var值,爲字符串。 var應該是一個字符串。如果在環境中未定義變量 ,則getenv返回nil。如果設置了var,則返回''「' 但爲空。在Emacs中,環境變量 及其值的列表保存在變量process-environment中。

 (getenv "USER") 
      ⇒ "lewis" 

- 變量:過程環境

該變量是字符串的列表,每個 描述一個環境變量。函數getenv和setenv通過這個變量來工作。

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

你似乎是假設的emacs是從慶典會議開始。但是,X下的進程通常是從sh會話開始的,而而不是會讀取您在~/.bashrc腳本中設置的環境變量。解決這個問題的一個簡單方法是將~/.xinitrc文件更改爲使用bash而不是sh(它可能與在文件頂部添加#!/bin/bash一樣簡單)。

來源:gnu.org

+1

你是不是指'#!/ bin/bash'? – Elena 2015-06-28 14:49:58

+0

謝謝,@Elena。固定。 :) – dmvianna 2015-06-29 00:39:45