追記:
この記事の内容は時代遅れなので、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 としてまとめてみるのも良いですかね。