私が使用している間、最初の2文字が繰り返されました Tab 完了を行います。以下のスクリーンショットでは、cd
が繰り返されています。
私はrxvt-unicdoe、xterm、ターミネーターを試しました。これらすべてのターミナルエミュレータにこの問題があります。
Zshバージョン5.0.2、設定ファイル on-my-zsh
コマンドラインの文字がオフセットで表示される場合があるのは、zshがプロンプトの誤った幅を計算したためです。症状は、文字を追加したり、文字ごとに移動したりしている間は表示がきれいに見えますが、カーソルを移動する他のコマンドを使用すると(一部の文字が本来よりも右に表示されて)文字化けします(Home、補完など)、またはコマンドが2行目に重なる場合。
Zshは、コマンドの文字が配置されている場所を知るために、 プロンプト の幅を知る必要があります。特に断りのない限り、各キャラクターは1つのポジションを占めると想定しています。
1つの可能性として、プロンプトにエスケープシーケンスが含まれており、適切に区切られていない可能性があります。テキストの色やその他の書式設定を変更したり、ウィンドウのタイトルやその他の効果を変更したりするエスケープシーケンスの幅はゼロです。それらはパーセント中括弧構造%{…%}
内に含まれる必要があるです。より一般的には、%42{…%}
のようなエスケープシーケンスは、中かっこ内が42文字幅であると想定するようにzshに指示します。
したがって、プロンプト設定(PS1
、Prompt
、またはそれらが参照する変数)を確認し、すべてのエスケープシーケンス(\e[…m
など)でテキスト属性を変更していることを確認してください。 $fg[red]
などの変数を介して存在する必要があります)は%{…%}
内にあります。 oh-my-zshを使用しているので、独自の設定とoh-my-zshから使用している定義の両方を確認してください。
同じ問題がbashでも発生します。 プロンプトにゼロ幅のシーケンスがあります を\[…\]
で囲む必要があります。
別の可能性としては、プロンプトに非ASCII文字が含まれていて、zsh(またはその他のアプリケーション)と端末で、文字の幅が異なるという考えがあります。これは、ターミナルのエンコーディングとの不一致とシェルで宣言されているエンコーディングがあり、2つのエンコーディングによって特定のバイトシーケンスの幅が異なる場合に発生する可能性があります。通常、非Unicode端末を使用していて、Unicodeロケールを宣言している場合、またはその逆の場合、この問題が発生する可能性があります。
アプリケーションは、ロケールを知るために環境変数に依存しています。関連する設定はLC_CTYPE
であり、これは環境変数LANGUAGE
、LC_ALL
、LC_CTYPE
およびLANG
(これらの最初に設定されている)から決定されます適用されます)。コマンドlocale | grep LC_CTYPE
は、現在の設定を通知します。通常、ロケールの問題を回避する最良の方法は、ターミナルエミュレータにLC_CTYPE
を設定させることです。それでもうまくいかない場合は、必ずLC_CTYPE
を設定してください。
前のコマンドで改行で終わっていない出力が表示されたため、プロンプトが行の中央に表示されてもシェルがそれを認識しない場合、同じ現象が発生する可能性があります。この場合、それはそのようなコマンドを実行した後にのみ発生し、永続的には発生しません。
行が適切に表示されない場合は、コマンドredisplay
またはclear-screen
(bound to Ctrl+L デフォルトでは)修正されます。
私は同じ問題を抱えていて、ここに私の解決策を見つけました: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 。以下を単に~/.zshrc
。
export LC_CTYPE=en_US.UTF-8
MacOSのiTerm 2でこの問題が発生しました。私はそれを解決するために、環境設定->プロファイル->テキストと進み、「Use Unicode Version 9 Widths」にチェックを入れました。
私はubuntu lts docker image(ubuntu:latest
)を使用してこの問題を抱えています。対応するページで提供されている指示でそれを修正しました: https://hub.docker.com/_/ubunt
apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh