アイコンやDockから起動したEmacsのPATHやexec-pathが正しく設定されてないのをなんとかする

ややこしくなるのでこういうことを調べることになった過程は省くんですが、Emacs内部で外部のコマンドへのパスは以下の変数に格納されてるのです。

  • 環境変数 PATH

    M-! (shell-command) で起動されるコマンドへのパス。(getenv "PATH")で確認

  • グローバル変数 exec-path

    start-process などの関数から起動されるコマンドへのパス

で、OSXやXfceで確認したんですがデスクトップアイコンなどから起動されたEmacsではこれらが正しく設定されない。ターミナルからemacsと打って起動すればちゃんとシェルのPATHを引き継いで設定されるみたいなんだけれど、GUIのEmacs使っててわざわざターミナルから起動する人は少ないので問題になる。ターミナルで問題なく呼べるコマンドがstart-process関数などで呼ぶとファイルが見つからないエラーが出てあるぇー?となったりするわけです。そのせいでflymakeが失敗したり・・・(まあ、それでこういうことを調べたわけなのです)。

で、どうやって解決するかというと、ちょっと強引な方法ですが以下のように~/.emacs.d/init.elなどに書いておく。

やってるのはecho $PATHstart-process-shell-commandで実行して、出力をEmacsのPATHexec-pathに設定するということ。

あと、ここにあるように設定用elispに直接書いてしまう方法もあるので、個人の環境によってどちらを使うか選べば良いと思う。