1
1

More than 5 years have passed since last update.

Emacsにコマンドサーチパスを追加するにはどうしたらよいか

Last updated at Posted at 2012-12-26

そもそもOS XでEmacs.appをインストールしているのにMewを~配下にインストールしないといけない理由がわからないという人もいるかもしれませんが、Emacs.appにmewを混ぜたくないがあまり適当なディレクトリがない、というわけで、私はHomebrewでインストールしたEmacs.appと~配下に野良ビルドしたMewという組み合わせでメールを読み書きしています(2013年11月10日訂正・現在ではMewを使っていません)。

ところで、何も考えずにこの組み合わせでMewを使うと、~/bin配下にインストールしたバイナリを呼び出す必要があるときに「mewl: command not found」などのエラーに遭遇してしまうことがあります。これは、launchdから引き継いだPATHをEmacs.appが(事実上)そのまま使ってしまうためです。

(Emacs.appはbash等を経由して起動されるわけではないため、PATHを変更できるよいタイミングがありません。/etc/launchd.confを修正しても目的は達成できるのですが、/etc/launchd.confのsetenv PATH行に~配下のパスを書き加えるのは抵抗がありますので、私はこの方法を採用しませんでした。なお、launchdは~/.launchd.confを読みません)

つまり問題は「Emacsにコマンドサーチパスを追加するにはどうしたらよいか」なのですが、
この問題を解決するには、~/.emacs.d/init.el等に以下のコードを入れるのがよいようです。

~/.emacs.d/init.el
(if (file-directory-p (expand-file-name "~/bin"))
    (progn 
      (add-to-list 'exec-path (expand-file-name "~/bin"))
      (let ((exec-path (reverse (cdr-safe (reverse exec-path)))))
        (setenv "PATH" (mapconcat 'identity exec-path path-separator)))))

関数add-to-listは第1引数(ここではexec-path。関数実行前に展開されないようquoteし、シンボルとしておく)の要素に第2引数(ここでは~/binをexpand-file-nameしたもの)がない場合に限り第1引数のリストに第2引数を追加するという挙動を示します。

exec-pathに~/binが追加されたら、Emacs.Appの子プロセスからも使えるように環境変数PATHexec-pathに合わせます(exec-pathはもともとPATHの値をもとに設定されます)。それがsetenv行で、setenvの第2引数に対しexec-pathを「:」でmapconcatした結果を返しますが、mapconcatそれ自体は関数に対して引数を渡す関数なので、引数をそのまま返すだけの関数であるidentifyを介すことでsetenvを成立させています。

(2012年11月6日修正)exec-pathをそのまま使うとEmacsのlibexecディレクトリ(HomebrewでEmacs 24.1を入れたOS X 10.8の場合は/usr/local/Cellar/emacs/24.1/libexec/emacs/24.1/x86_64-apple-darwin12.2.0)もPATHに含まれてしまうため、letで束縛したexec-pathreverseで一旦逆さにしてから最初の要素だけを排除(cdr)し、再度reverseすることで順序をもとに戻したものを設定し、PATHの生成に利用しています。また、path-separatorを使いました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1