Zsh の bindkey に嵌まる

20150910_02:09:18-8531
新しい kernel が降りてきたので再起動したのですが,Ctrl + a の行頭移動や,Ctrl + e の行末移動が使えず ^A^E と表示されるようになってしまいました.Ctrl + U など利用できるものもある.環境は以下のような感じです.

  • OS: Debian testing stretch amd64
  • Shell: zsh 5.0.8
  • byobu backend: screen
  • GNU Screen 4.03.01

GNU Screen を抜けると問題はありません.
最近 GNU Screen のアップデートがあった気がしたので,GNU Screen のせいかな?と思い以前野良ビルドした GNU Screen や Tmux で起動してみましたがこちらでも同じ現象が置きました.
% screen bash の様にして bash を起動すると問題ありません.
GNU Screen 起動後でも bindkey で以下のように設定すると動作します.

% bindkey "^A" beginning-of-line
% bindkey "^E" end-of-line

bindkey のリストを確認すると GNU Screen 起動前 120行,GNU Screen 起動後では 34行と大分少なくなってしまっています.

% echo $TERM
xterm
% bindkey -L | wc -l
120
% echo $TERM
screen-bce
% bindkey -L | wc -l
34

とりあえず GNU Screen 起動前に ~/.zshrcprecmd() の中に bindkey -L の結果を vim で :r!bindkey -L | sed -e 's/^/ /' な感じで貼ってひとまず反映させました.

case "${TERM}" in
screen*|ansi*)
        preexec()
        {
                echo -ne "\ek${1%% 2%% *}\e\\"
        }
        precmd()
        {
                echo -ne "\ek$(basename $SHELL) :::: waiting your command ... > (:3[___]\e\\"
                bindkey -R "^A"-"^C" self-insert
                bindkey "^D" list-choices
                  :
                  :
                  :
 
                  :
                bindkey -R "\M-^@"-"\M-^?" self-insert
        }
        ;;
esac

切り分けのために新しくユーザを作って chsh -s /bin/zsh してまっさらな状態から試すと ~/.zshrc を cp すると現象が起こりました.更に切り分けていくと .zshrc の中の export EDITOR=vim でした.
% EDITOR=vim screen で発症する.% EDITOR=emacs screen はok…….その他 vi NG / jed, nano は ok と vi/vim を指定すると起きるよう.

検索するとこんなページが見つかりました.

環境変数 EDITOR が vi/vim だと Zsh のキーバインドが vim モードになるということのようです.Esc -> 0 で行頭移動,Esc -> Shift+a で行末に.確かに vim モードのようです.ということで ~/.zshrc で emacs モードに設定することで解決しました.(上の方で設定した bindkey の設定は消しました)

export EDITOR=vim
bindkey -e

腑に落ちないのは GNU Screen / Tmux 起動時には起こるけど普通の Zsh 起動時は起きないところ…….