exec-pathおよび$ PATH


28

オンラインでEmacsのデフォルトパスにパスを追加する例を見ました:

(add-to-list 'exec-path "/usr/local/bin/")

私はElispが初めてで、上記の声明が何をするのか理解していますが、いくつか質問があります。

  • ではどのような順序 Emacsは実行パスを検索しますか?例えば、$PATH(env。variable)の値をまったく考慮しますか(もしそうなら、その前後にexec-path?)

  • このようなパスを複数追加するにはどうすればよいですか?それらを連結し続けることはできますか?例えば

    (add-to-list 'exec-path "PATH1", "PATH2")
    

    または私はすべきか:

    (add-to-list 'exec-path "PATH1:PATH2:PATH3") 
    

また、GitHubでこの興味深いパッケージexec-path-from-shellを見つけました。なぜこれのためのパッケージが必要なのですか?

動機

コマンドがシェルで機能するが、Emacsでは機能しないことを発見したことはありませんか?

これは、GUIから起動されたEmacsインスタンスが環境変数のデフォルトセットを継承するOS Xで頻繁に発生します。

このライブラリは、重要な環境変数をユーザーのシェルからコピーすることでこの問題を解決します。目的の変数を出力するようシェルに要求し、Emacs環境にコピーすることで機能します。


3
EmacsとElispへようこそ!私はまだ自分自身でこのトピックについてかなり新鮮で、あなたの質問への答えを知りませんが、私は人生をずっと楽にしてくれた何かに言及するだろうと思いました:記述機能。例(describe-function 'add-to-list)C-h f)は、add-to-list関数のドキュメントとソースへのリンクを提供します。(describe-variable 'exec-path)C-h v)もあります。これはRTFMのコメントを意図したものではありません。これらのドキュメントは、リストしたすべての質問に答えているわけではなく、役に立つものです。
jtmoulia 14年

ありがとう@jtmoulia!今後の質問のために、このことを忘れないでください。
アメリオバスケスレイナ14年

に加えてC-h v exec-path、マニュアル(EmacsおよびElisp)を使用します。マニュアルでi exec-pathは、役立つ説明が表示されます。最初にEmacsに聞いてください -申し訳ありません。
ドリュー

回答:


23

1)PATHおよびexec-path

Emacsは起動時exec-pathの値から設定しますがPATH、後で再び調べることはありません。ただし、コマンドを実行するとPATH、ではなくを継承するexec-pathため、サブプロセスはEmacsとは異なるコマンドを見つけることができます。

フランチェスコが言うように、これは特にために混乱することができshell-command、そのように使用されますされ、直接プロセスを実行しますが、それを実行するためにシェルを呼び出していないPATH、ではありませんexec-path

2)への複数のパスの追加 exec-path

add-to-list繰り返し呼び出すだけです:

(add-to-list 'exec-path "PATH1")
(add-to-list 'exec-path "PATH2")

ノート行いadd-to-list、これはとなってしまいますので、リストの先頭に追加を"PATH2"しているexec-path前に"PATH1"

リストへの「低レベル」アクセスを使用することもできます。

(setq exec-path (append '("PATH1" "PATH2")
                        exec-path))

これが追加されます"PATH1""PATH2"、あなたにexec-pathそのためには、。

3)Mac OSのパス

Mac OS Xの問題は、グローバルUIからプログラムを呼び出すとき、またはシェルから呼び出すときに、Mac OSが同じ環境を設定しないことです。これは、シェルからEmacsを実行すると、ファインダーから実行する場合とは異なる環境変数が設定されることを意味します。環境変数を設定し.bashrcたり、類似した環境変数を設定すると、「グローバルな」Emacsに影響を与えないため、これは特に面倒です。

パッケージは明らかにシェルを起動し、そこから環境変数をインポートし、グローバルに起動されたEmacsのシェルから取得した環境を模倣します。


ありがとうヨルゲン。Q3に関して:PATHグローバルUI(デスクトップ環境)から起動されたプログラムのデフォルトがどこで定義されているかを知っていますか?私も同じ問題を抱えてPYTHONPATHいますelpy:)。デスクトップからEmacsを起動すると、Emacsはファイル(の初期化ファイル)のPYTHONPATH定義を認識しません。これは、Pythonパッケージの場所がわからないため、非常にイライラします。これらの定義を別のシェルファイルに移動できてうれしいです(理想的には、Emacsから私の定義を使用したいです).zshenvzshelpyPYTHONPATHinit.zshenv
Amelio Vazquez-Reina 14年

Mac OS Xについてはまったく知らないのではないかと心配しています。簡単なGoogleがstackoverflow.com/questions/135688/に到達しました。launchd.confが適切な場所であることを示しているようです。これが必要なのがEmacsだけである場合は、もちろん、exec-pathとの両方を設定できPATHます.emacsPATHを使用して設定でき(setenv "PATH" (format "%s:%s" "/new/path/element" (getenv "PATH")))ます。
ヨルゲンシェーファー14年

ありがとう。私は、次のQはOPからのビットを発散するが、Emacsで指定する方法がある知ってPYTHONPATHいるelpy使用する必要がありますが?
アメリオバスケスレイナ14年

process-environmentたとえば、を使用して変更できsetenvます。でそれを行うことができますelpy-mode-hookが、それはglobsl変数であり、それをバッファローカルにすることは簡単に混乱した動作につながります。
ヨルゲンシェーファー14年

9

Emacsはプリミティブのような機能を使用して新しい外部プロセスを開始するcall-processか、をstart-process、実行可能はで検索exec-path(としません$PATH

ただし、などの関数shell-commandは、サブプロセスとしてシェルを開始し、実行するコマンドを渡します。このコマンドを実行するために、シェルは$PATH(ではなくexec-path)で実行可能ファイルを見つけようとします。

したがって、exec-pathemacs自体によって開始される外部プロセスの場合に最も重要$PATHなのは、高レベルの機能を使用M-!して自分で実行するコマンドの場合に重要なのです(たとえば)


に複数のディレクトリを追加するexec-path場合は、add-to-list複数回使用する必要があります 。

手動でもできます

(add-to-list 'exec-path "dir1")
(add-to-list 'exec-path "dir2")

またはループを使用して

(dolist (dir '("dir1" "dir2"))
  (add-to-list 'exec-path dir))

3番目の質問に関して、emacsがデスクトップ環境から起動された場合、それから環境を継承します。これは、完全なシェルの環境よりも完全ではない可能性があります。

これは$PATH、通常のシェルが見るものを使用するためにEmacsの値を完全にする必要がある場合があることを意味します。これが、exec-path-from-shellあなたが言及したライブラリの目的です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.