Emacsのshell,iTerm2,zshの組み合わせで変な制御文字が表示されてしまうバグ

emacs-shell-iterm2-bug.png

Emacsのshell (M-x shell) をMax OSXのiTerm2で使うとこのような変な制御文字が表示されてしまいました。
^[]2;echo hello^G^[]1;echo^Ghello

原因が皆目検討がつかないので見て見ぬふりをしていたのですが、この制御文字があまりにもウザくて、いつの間にか M-x shell を使わなくなっている自分がいました。

これではいかんと一念発起して解決するまでの一部始終です。

Linuxでは発生しない?

まず、詳しそうな友人に聞いてみたところ、「僕のLinuxでは発生しない」とのことでした。
確かにLinuxでは発生しませんでした。
友人いわく、「zshかscreenかiTerm2が、ウィンドウのタイトルを自動設定しようとしているのが原因じゃないか」とのこと。

iTerm2のときだけ発生する

Mac OSXの標準のターミナルでは発生しませんでした。iTerm2のときだけ発生しました。

Zshを使うと発生する

M-x shellしたあとに、"bash"と入力してインタラクティブシェルをbashに切り替えると直りました。
どうやらzshが原因のようです。

ここまでで、「MacのiTerm2でEmacsのshellでzshを使った時に発生する」ということがわかりました。

ただ、ここで行き詰まってしまいました。

.zshrcに原因がある

はてな人力検索で質問してみたら、「私の環境では再現しない」とのコメントをいただきました。
なるほど?これはもしかして .zshrcの内容に原因があるかもしれないと思いました。
.zshrcにごちゃごちゃ設定を書いていたので、「.zshrcを消して素のzshを起動するとどうなるだろう」とやってみたところ、現象が直りました。

そこで、.zshrcの真ん中あたりに"return"を書いてみて、二分探索の手法でどこで不具合が起きるのかを調べました。

oh-my-zshが原因だった

oh-my-zshを外してみたら直りました。どうやら oh-my-zshを使っているのが原因でした。

テーマを変更しても発生する

oh-my-zshのテーマが悪いのかと思いテーマをいろいろ変更してみましたが、どのテーマでも発生しました。
どうやらテーマに関係なくoh-my-zsh自体に原因がありそうです。

DISABLE_AUTO_TITLE="true"にしたら直った!!

oh-my-zshの設定を見ていると、下記の設定があることに気づきました。
# Uncomment following line if you want to disable autosetting terminal title.
# DISABLE_AUTO_TITLE="true"
こ、これは・・・!!
冒頭で友人が言っていたことと関係がありそうです。

というわけでこのコメントを消して DISABLE_AUTO_TITLE="true" を有効にしたところ、見事に解決しました!!

よかったよかった。
カテゴリ: