訳あって Zsh を使うことになり、手持ちの Bash 資産を Zsh に対応させていた時のこと。screen / tmux で訳の分からない挙動にハマった。
screen や tmux で Zsh を使うと、何故か Ctrl + p とか Ctrl + n とか、Ctrl キーを絡めた入力が使えなくなる。Ctrl + p と打っても、「^P」とか出る。ググってもみんなは普通に使えてるっぽいし、探し方が悪かったのかこれといった情報も見つからず、解決に 5 週間かかった。:-/
.zshrc に「bindkey -e」を入れるだけ。orz
しかし何故 screen / tmux だけで発生するのか。普通にターミナルで Zsh を使う分には何も問題ない。
% man zshzle
<...snip...>
In addition to these names, either `emacs' or `viins' is also linked to
the name `main'. If one of the VISUAL or EDITOR environment variables
contain the string `vi' when the shell starts up then it will be `vi‐
ins', otherwise it will be `emacs'. bindkey's -e and -v options pro‐
vide a convenient way to override this default choice.
環境変数 VISUAL / EDITOR に「vi」という文字列があると、Zsh が気を利かせて viins モードにしてくれるらしい。・・・いやいやいや、Vim 使いでもシェルは普通 emacs モードだと思うけど? ともかく、確かに私は(Emacs 使いだけど) EDITOR=vim としている。これで一応は先の疑問に説明はつく。
- Zsh 起動時、EDITOR は未設定なので emacs モードになる。
- 起動した Zsh が .zshrc を読み込み、EDITOR=vim になる。
- この状態で Zsh の子プロセスが起動すると、EDITOR=vim なので viins モードになる。
説明はつくが、これが適切な仕様だとはとても思えない。これだと EDITOR の値に関係なくログインシェルは常に emacs モードになる。だからこそ、他の人は困ってないっていうね。screen / tmux 使いの内、更にその一部の人だけが困ることになる。これが本当に意図通りの仕様だとしたら、こんな分かりにくい仕様はさっさと捨てた方がいいよ。
しばらく Zsh を使ってみて、Zsh は使い勝手を重視した結果として、驚き最小の法則に反することがあるような気がする。別に Zsh に拘りや思い入れがある訳でもなし、これ以上何かあったら Bash に戻すかも知れない。