我想通過Emacs的編譯模式編譯u-boot,它看起來像Emacs不知道如何找到bash環境變量。儘管我設置了它們,並且可以通過Emacs shell仿真進行編譯,但編譯模式仍然會嘗試編譯,就好像它們不在那裏一樣。如何讓Emacs識別用於編譯的bash環境變量?
我需要做些什麼才能使其更具環保意識?
我想通過Emacs的編譯模式編譯u-boot,它看起來像Emacs不知道如何找到bash環境變量。儘管我設置了它們,並且可以通過Emacs shell仿真進行編譯,但編譯模式仍然會嘗試編譯,就好像它們不在那裏一樣。如何讓Emacs識別用於編譯的bash環境變量?
我需要做些什麼才能使其更具環保意識?
你可以嘗試添加像你.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後代,如kdm
和gdm
。
在OS X上,env變量的處理完全是另一個問題,爲了獲得ENV變量,您通常必須從命令行運行Emacs,例如/Applications/Emacs.app/Contents/MacOS/Emacs
或使用~/.MacOSX/environment.plist
。但是,我提供的代碼片段應該會在兩種情況下都包含您。
更新
最近這個過程中取得了由exec-path-from-shell擴展更容易。它或多或少以相同的方式設置emacs $PATH
,但使用擴展名通常更適合自己破解解決方案。
它並不嚴格回答您的問題,但您始終可以在make
命令行上傳遞環境變量。例如:的Mxcompile
RETmake -k CXXFLAGS='-Wall'
RET
這是該開始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
這解決與Flymake不perlbrew使用正確的Perl我的問題。不像perlbrew-mini.el – titanofold 2013-04-20 01:28:39
_exec-path-from-shell_很好,解決了我的問題,因爲_ensime_無法啓動並拋出錯誤的類型參數stringp nil錯誤。 – cyrillk 2014-07-21 20:17:47
爲什麼你使用split-string-and-unquote而不是split-string? – 2017-05-14 18:30:36