0

私のプロジェクトには、いくつかの環境変数のデフォルト値を設定するシェルスクリプトがあります。を実行しようとするとrinari-console、スクリプトがソースされていないため、エラーが発生します。rinariがそれを調達していることを確認する方法はありますか?それにより、railsコンソールが起動したときに、すべての変数が必要な値を持つようになりますか?

4

4 に答える 4

2

さて、私はその質問についてもう少し真剣に考えてきました。私は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 でも定義されていました。

于 2012-08-06T16:15:44.193 に答える
1

私はなんとかラッパーであなたがやりたいことをすることができました。で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ます。

于 2012-08-06T19:52:17.110 に答える
-1

私は 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

于 2012-08-06T07:52:29.827 に答える
-1

スクリプトを入手したい場合は、tkfが提案したものと非常によく似たことができるはずです:

(defadvice rinari-console (before run-my-script activate)
  (shell-command ". YOUR-SCRIPT.sh"))
于 2012-08-06T09:36:53.053 に答える