在我的項目中,我們有一個shell腳本爲某些環境變量設置默認值。當我嘗試運行rinari-console
時,由於該腳本未找到源,因此收到錯誤消息。有沒有辦法確保rinari能夠獲取它,這樣當rails控制檯啓動時,所有變量都具有所需的值?如何在啓動rinari控制檯之前獲取此shell腳本?
回答
好吧,我已經thinkg這個問題有點困難。通過包裝
該解決方案是一個有點笨拙
外Emacs的,但它應該工作:我想到了兩個可能的解決方案。
您可以創建一個包裝腳本,例如'emacs-wrapper.sh':
#!/bin/sh
set -a
. YOUR-SCRIPT.sh
emacs
如果啓動./emacs-wrapper.sh,YOUR-SCRIPT.sh將採購和Emacs之後開始的。這樣Emacs就可以看到相同的環境。測試我的機器上這種方法,我能夠(getenv的「VAR」)在YOUR-SCRIPT.sh
一些好的定義所有變量:通過shell命令在Emcas
這是IMO更加美好因爲它完全在Emacs內部運行。打電話給shell-command-to-string來源你的YOURSCRIPT.sh。最後它還會轉儲過程的環境。隨後將其添加到Emacs自己的過程環境中:
;; defadvice is optional, you could also just call source-script directly
(defadvice rinari-console (before init-environment activate)
(source-script "/PATH/TO/YOUR-SCRIPT.sh"))
(defun source-script (script)
(let ((env (extract-environment script)))
(mapc 'import-environment-variable (split-string env "\n"))))
(defun extract-environment (script)
(shell-command-to-string (format "set -a; . %s > /dev/null 2>&1; env" script)))
(defun import-environment-variable (variable-assignment)
(when (not (or (null variable-assignment) (string= "" variable-assignment)))
(let* ((key-value-pair (split-string variable-assignment "="))
(key (car key-value-pair))
(value (cadr key-value-pair)))
(setenv key value))))
我在我的機器上也驗證了這種方法。所有在YOUR-SCRIPT中定義的變量也在Emacs中定義。
我不使用rinari所以有可能是更好的方式來做到這一點,但在原則上,你可以做到這一點運行實際rinari控制檯命令之前運行「YOUR-SCRIPT.sh」。
(defadvice rinari-console (before run-my-script activate)
(shell-command "YOUR-SCRIPT.sh"))
參見:http://www.gnu.org/software/emacs/manual/html_node/elisp/Advising-Functions.html
我能夠做到你想要用的包裝是什麼。 假設您在~/test
中創建了一個rails項目。 Rinari將通過執行命令~/test/script/console
嘗試啓動irb
。 我創建了一個名爲~/test/script/console.sh
包裝:
#!/bin/sh
. ~/test/script/env.sh
~/test/script/console
包含環境變量,然後你的腳本包裝源執行常規命令。
文件~/test/script/env.sh
包含:
export TEST=test
我們使用的包裝,調用rinari-mode
用一個前綴參數C-u M-x rinari-mode
並添加.sh
所提出的命令結束。環境變量TEST
將被設置。
然後,您可以創建一個自動添加.sh
的宏。
由於某種原因,這個解決方案會導致我的Ubuntu凍結:) – Geo 2012-08-07 06:30:37
以我給出的例子或與您的腳本。如果是腳本,請將其複製到某個地方以查看發生了什麼。 – 2012-08-07 11:56:19
你的方法很棒!謝謝! – Geo 2012-08-08 20:46:40