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となり、表示が崩れなくなりました。