Tab を使用している間、最初の2つの文字が繰り返されました 完了します。下のスクリーンショットでは、cd
繰り返されます。
rxvt-unicdoe、xterm、terminatorを試しました。これらすべてのターミナルエミュレータにはこの問題があります。
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
を設定してください。 。
前のコマンドが改行で終わっていない出力を表示した場合にも同じ症状が発生する可能性があります。そのため、プロンプトは行の中央に表示されますが、シェルはそれを認識しません。この場合、それはそのようなコマンドを実行した後にのみ発生し、永続的には発生しません。
関連:IOリダイレクトとheadコマンド?
行が正しく表示されない場合は、コマンドredisplay
またはclear-screen
( Ctrlにバインドされています + L デフォルトで)修正されます。