私のプロジェクトには、いくつかの環境変数のデフォルト値を設定するシェルスクリプトがあります。を実行しようとするとrinari-console
、スクリプトがソースされていないため、エラーが発生します。rinariがそれを調達していることを確認する方法はありますか?それにより、railsコンソールが起動したときに、すべての変数が必要な値を持つようになりますか?
4 に答える
さて、私はその質問についてもう少し真剣に考えてきました。私は2つの可能な解決策を思いつきました:
ラッパーを介した Emacs の外部
このソリューションは少し不器用ですが、うまくいくはずです。
「emacs-wrapper.sh」などのラッパー スクリプトを作成できます。
#!/bin/sh
set -a
. YOUR-SCRIPT.sh
emacs
./emacs-wrapper.sh を起動すると、YOUR-SCRIPT.sh が読み込まれ、その後 Emacs が起動します。このようにして、同じ環境が Emacs に表示されます。私のマシンでこのアプローチをテストしたところ、YOUR-SCRIPT.sh で定義されたすべての変数を(getenv "var")することができました。
より良い: シェルコマンドを介して Emcas 内で
これは、Emacs 内で完全に実行されるため、IMO より優れたソリューションです。shell-command-to-string を呼び出して、YOUR-SCRIPT.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 でも定義されていました。
私はなんとかラッパーであなたがやりたいことをすることができました。でRailsプロジェクトを作成するとします~/test
。Rinariはirb
、コマンドを実行して起動を試み~/test/script/console
ます。次の名前のラッパーを作成しました~/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
ます。
私は rinari を使用していないので、もっと良い方法があるかもしれませんが、原則として、実際の rinari-console コマンドを実行する前に "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
スクリプトを入手したい場合は、tkfが提案したものと非常によく似たことができるはずです:
(defadvice rinari-console (before run-my-script activate)
(shell-command ". YOUR-SCRIPT.sh"))