ずっと MacBook Air で日常を暮らしてきて、やっぱりデカいディスプレイで暮らしたいなぁということで、昔つかってた iMac に乗り変えました。 そこで困ったのが、Emacs で環境変数が引き継がれてこないということでした。
Emacs では、exec-path-from-shell を使うことで、zsh に定義した環境変数を Emacs でも使えるようにしているんですが、PATH
とか GOPATH
とかが使用できなくなっている。なぜだ。
これ、原因は、デフォルトシェルを切り替えていないからでした。これで解決。
$ sudo echo '/usr/local/bin/zsh' >> /etc/shells $ chsh -s /usr/local/bin/zsh $ sudo shutdown -r now
内容
exec-path-from-shell は、環境変数の引き継ぎを「シェルを実際に Emacs 内部で実行し、printf
等を使用して環境変数の値を出力させ、それを読み取る」という形で実現しています。
そして、ここで実行されるシェルというのは、以下のように決定されます。
- exec-path-from-shell の
exec-path-from-shell-shell-name
で定義されたもの - Emacs の
shell-file-name
で定義されたもの - (Emacs から見える)
SHELL
環境変数の値
具体的な関数はこちら。
(defun exec-path-from-shell--shell () "Return the shell to use. See documentation for `exec-path-from-shell-shell-name'." (or exec-path-from-shell-shell-name shell-file-name (getenv "SHELL") (error "SHELL environment variable is unset")))
Emacs の設定を色んな環境で使用しようと思うと、elisp の変数に対してパスを設定することは望ましくありませんから、ぼくはこのうちの 3. を使っていました。 結果として、デフォルトシェル(bash)の環境変数が使用されていたというお話。