emacs shell の起動時に.bash_profileが読み込まれない問題
問題
emacsのシェルでpythonを実行すると,入っているはずのパッケージが呼び出されないことがある.
$ which python /usr/bin/python $ pyenv versions system (set by /Users/user/.pyenv/version) 2.7.10 3.4.6 ∗ anaconda2-4.3.1 anaconda3-4.3.1
こんな感じで,pyenvはanaconda2を呼び出しているつもりのようだが,shellが実行しているのはシステムのpythonになっている.
類似の問題
同じような問題をまとめてくれている人がいた.
emacs + elpy + pyenv-virtualenv でシステムの python が使われてしまう
elpyの詳細はここでは説明しない(できない)が,pythonのIDE的な機能を提供してくれる拡張らしい.
とりあえず記述に従ってpyenv-virtualenvを入れ,elpyを入れ,あれこれやる.
このサイトも参考にした.
ちなみに
M-x package-install
を実行するには,
(package-initialize) (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/") ("melpa" . "http://melpa.org/packages/") ("org" . "http://orgmode.org/elpa/")))
を.emacsなりinit.elなりの先頭に書き込んでおく.
いくつか気づいたこと
まだ問題
とりあえずシェルでpyenvのpythonを読むことはできるようになったが,シェルを立ち上げてもその時点ではまだシステムのpythonを呼び出している.
あと,なぜか環境変数PS1が書き換えられていて,プロンプトが
(anaconda2-4.3.1) computer:~ user$
のようになっている.システムのpythonを呼び出しているのに.
.bash_profileに
export PS1="\h:\W \u$ "
のように書いているのだが,無視されているのか,どこかで自動的に上書きされているのかのどちらからしい.
emacs shellでは他の環境変数も半端に読み込まれている(なぜそんなことになるのか不明)が,ターミナルのshellだと他の変数は普通に読み込まれている.
ターミナルではpyenvも普通に読み込まれているので,pythonを切り替えるとプロンプトの表示も切り替わるが,やはりemacs shellはそうならない.
問題を整理すると,
やったこと
対症療法的に,shellの起動時に.bash_profileを読み込ませることにした.
.emacsに,
(defun open-shell-holizontally () (interactive) (shell nil) (execute-extended-command nil "shell" "shell") (delete-window) (split-window-right nil) (other-window 1) (switch-to-buffer "*shell*" nil 'force-same-window) (insert "source ~/.bash_profile") (comint-send-input))
を書き込む.
もともと設定していた,バッファを縦に分割してshellを右側に出すマクロに付け加えた.
なおelispを直接書いたわけではなく,elmacroというパッケージを使ってキーボードマクロをそれっぽく変換しただけ.
elmacro.el : キーボードマクロで超簡単に自作コマンドを作ろう!
2019/5/9追記
こんな記事を見つけた.
teratail.com
とりあえず,export PYENV_VIRTUALENV_DISABLE_PROMPT=1
を.bash_profileに書き込むという方法でうまくいっているように思う.