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 起動時は起きないところ…….

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)