最初の2つの文字は、Tab完了に使用している間に繰り返されました。下のスクリーンショットでcd
は、が繰り返されています。
rxvt-unicdoe、xterm、ターミネーターを試しました。これらのターミナルエミュレータにはすべてこの問題があります。
Zshバージョン5.0.2、設定ファイルon-my-zsh
最初の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でも同じ問題が発生します。プロンプト内の幅がゼロのシーケンスは、で囲む必要があります\[…\]
。
もう1つの可能性は、プロンプトに非ASCII文字が含まれており、zsh(または他のアプリケーション)と端末がそれらの幅について異なる考えを持っていることです。これは、端末のエンコーディングとシェルで宣言されているエンコーディングとの間に不一致があり、2つのエンコーディングの結果、特定のバイトシーケンスの幅が異なる場合に発生する可能性があります。通常、Unicode以外の端末を使用しているときにUnicodeロケールを宣言する場合、またはその逆の場合、この問題に遭遇する可能性があります。
アプリケーションは環境変数に依存してロケールを認識します。関連する設定はLC_CTYPE
、環境変数から決定され、LANGUAGE
、LC_ALL
、LC_CTYPE
およびLANG
(適用される設定されているこれらの最初)。このコマンドlocale | grep LC_CTYPE
は、現在の設定を示します。通常、ロケールの問題を回避する最善の方法は、ターミナルエミュレーターに設定を許可LC_CTYPE
することです。しかし、それがうまくいかない場合は、必ず設定してくださいLC_CTYPE
。
前のコマンドが改行で終わらない出力を表示したときに同じ症状が発生する可能性があります。そのため、プロンプトは行の中央に表示されますが、シェルはそれを認識しません。この場合、そのようなコマンドを実行した後にのみ発生し、永続的には発生しません。
行が適切に表示されない場合は、コマンドredisplay
またはclear-screen
(デフォルトでCtrl+にバインドさLれている)によって修正されます。
->
私が思うに期待されている
locale
、andの出力echo $PS1 | od -t x1
(およびで使用される他の変数についても同じこと)を投稿してください$PS1
。
\e{7,8}
カーソル状態の保存/復元に使用。
LC_CTYPE
私のためにそれを修正したものでした。に設定しましたがC
、設定を解除するとすべてが機能しました。ありがとう。
私は同じ問題を抱えていたし、ここに私の解決策を見つけた:https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519を。以下を単純に入力してください~/.zshrc
。
export LC_CTYPE=en_US.UTF-8
私はubuntu lts docker image(ubuntu:latest
)を使用してこの問題を抱えています。対応するページhttps://hub.docker.com/_/ubuntuに記載されている指示で修正しました
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