全然使ひかたを覚えられない Emacs を飼ひ馴らさうと、最近また時間をとってカスタマイズしようとしてます。で、餅は餅屋、Emacs を使ふなら eshell だよってことらしいので、これも飼ひ馴らさうかと。
基本的には M-x eshell とやれば最低限動くのだけれど、僕の Ubuntu の環境では ruby
が /home/megurine/.rbenv/shims/ruby にあったり、Mercurial (hg
) が /home/megurine/.pythonz/pythons/CPython-2.7.3/bin/hg にあったりするので、これらは上手く動かないんですね。いやあ、困った困った。
もちろんこれらは、メインで使ってる zsh
ではちゃんと設定してあるので、eshell でも同じ設定をしなほすのは二度手間ですね。ってことで、zsh
から環境変数を取り込んでみます。
(let ((zshpath (shell-command-to-string "/usr/bin/zsh -c 'printenv PATH'"))) (let ((pathlst (split-string zshpath ":"))) (setq exec-path pathlst)) (setq eshell-path-env zshpath) (setenv "PATH" zshpath)))
事前に $HOME/.zshenv
でちゃんと $PATH
を設定してあることとします。.zshrc
じゃだめですよ。ログインシェルではなくて、インタプリタとして実行するときに読まれません。$PATH
を設定すべきは .zshrc
です。
zsh の設定ファイルが読まれるタイミングなんかは、漢のzsh (1) 最強のシェル、それは「zsh」を参照のこと。
shell-command-to-string
はシェルコマンドを実行して文字列にして返す函数です。zsh -c '...'
は、引数に渡したスクリプトをワンライナーで実行します。printenv HOGE
は環境変数 HOGE
の内容を出力します。
といふわけで、(shell-command-to-string "/usr/bin/zsh -c 'printenv PATH'")
で zsh の PATH を頂いてこられるわけです。やりましたね!
let
は特殊形式 (スペシャルフォーム) で、束縛ですね。zshpath
, pathlst
といふ名前に値を束縛します。(setenv "HOGE" value)
といふ函数は Emacs の PATH 環境変数を書き換へる副作用を持ち、書き換へられた HOGE の値を返します。
ぐぐる先生で検索してみると (setq eshell-path-env (setenv "HOGE" value))
みたいに書いてるコードが見つかったりするけれど、値を返すからってこの書き方はきもいです…ってことで setq
と setenv
は分けて書きます。
なんで chsh
でデフォルトのログインシェルを zsh
に設定してるのに Emacs は読んでくれないのかなー、と考へてみたりしたんですけど、きっと Gnome は zsh の環境変数を読んでくれなくて、Emacs が Gnome 上のランチャから起動されてるからなんですね。
よくわかんないので、その辺りは後々の宿題といふことでひとつ。