カーソルキーを押したときにpecoの表示がバグる

zsh でコマンド履歴を表示するのに peco を使っているのですが、root ユーザにsuした状況で peco を起動し、選択項目を変更するために上下カーソルキーを押すと、表示が崩れる問題に悩んでいました。12
カーソルキーを使わず、Ctrl + N / Ctrl + P を使えば、表示が崩れないので、しばらくそうしていたのですが、やっと原因となる要素が特定できました。

LANG=en_US.UTF-8 だと崩れるみたいです。

英語に設定されているとどうして崩れるのか、というところまではまだ調べられていないのですが、とりあえず原因が分かったので、対策を講じられそうです。

zsh のコマンド履歴を peco で表示するために、.zshrc に以下のような設定を書いているのですが、

function peco-select-history() {
    local tac
    if which tac &> /dev/null; then
        tac="tac"
    elif which gtac &> /dev/null; then
        tac="gtac"
    else
        tac="tail -r"
    fi

    BUFFER=$(\history -n 1 | eval $tac | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}

if which peco &> /dev/null; then
    zle -N peco-select-history
    bindkey '^r' peco-select-history
fi

赤字で示した peco を呼び出している部分に、環境変数LANG=ja_JP.UTF-8を指定するようにしました。

BUFFER=$(\history -n 1 | eval $tac | LANG=ja_JP.UTF-8 peco --query "$LBUFFER")

これで、peco を表示している間だけLANG=ja_JP.UTF-8となり、表示が崩れなくなりました。

  1. Windows 8.1 + PuTTY-GDI で Fedora 21 or CentOS 6.6 + zsh + peco v0.3.2 の環境で発生しました。
  2. PuTTY で使用しているフォントは Ricty for Powerline で、文字コードの設定は UTF-8 で "CJK 用の文字幅を使用する" にチェックを入れています。

コメントを残す