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の詳細はここでは説明しない(できない)が,pythonIDE的な機能を提供してくれる拡張らしい.
とりあえず記述に従って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はそうならない.

問題を整理すると,

  • emacs shellの起動時に.bash_profileを読み込んでいない
  • pyenvも正しく読み込めていない

やったこと

対症療法的に,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に書き込むという方法でうまくいっているように思う.