追記:
この記事の内容は時代遅れなので、purcell/exec-path-from-shellを利用しよう。
EmacsでPATHの設定が引き継がれない問題をエレガントに解決する - Qiita
Ruby や Python を /usr/bin や /usr/local/bin などのシステムディレクトリではなく、バージョンごとにホームディレクトリ内にインストールして環境変数 PATH を通して使用する、なんてひとも少なくはないですね。筆者も rbenv や Pythonz 、 nodebrew に頼りきりです。
ところで Ubuntu で GTK 版の Emacs をデスクトップのランチャーから起動すると、ユーザのログインシェルを /bin/zsh などに設定してても、 環境変数をちゃんと引き継いでくれません。これは困った! 特に /usr/bin/ruby には何もありませんし。
Emacs から term などで、 zsh を起動する場合はその中で .zshenv を読んでくれるのでまた困らないんですけど、 Emacs のシェルと言ったら Eshell なので、こっちの PATH は確実に設定しておきたいところです。
あ、Zsh の PATH はちゃんと .zshenv とかに設定しといてください。
(let* ((zshpath (shell-command-to-string
"/usr/bin/env zsh -c 'printenv PATH'"))
(pathlst (split-string zshpath ":")))
(setq exec-path pathlst)
(setq eshell-path-env zshpath)
(setenv "PATH" zshpath))
これを評価すると
-
zshを起動して、出力される$PATHを文字列として受け取る -
1 で取得した
PATH環境変数を Emacs の環境にも設定する -
PATHは:区切り形式の文字列なのでリストに変換する -
2 のリストを Emacs の
exec-path、eshell-path-envに設定する
って流れで設定していきます。
練習がてらにもうちょっと汎用性持たせて Windows のこともちょびっと考慮しつつ Emacs Lisp としてまとめてみるのも良いですかね。