完了すると、ディスプレイにコマンドの最初の文字が繰り返されます。

完了すると、ディスプレイにコマンドの最初の文字が繰り返されます。

Tab完了に使用すると、最初の2文字が繰り返されます。以下のスクリーンショットではcdこれが繰り返されます。

ここに画像の説明を入力してください。

rxvt-unicdoe、xterm、ターミネーターを使ってみました。これらのすべての端末エミュレータにはこの問題があります。

Zsh バージョン 5.0.2、構成ファイル私のzshで

答え1

コマンドラインの文字が時々オフセットに現れる場合、これは通常zshが誤ったプロンプト幅を計算したためです。症状は、文字を追加したり、文字単位で移動したりすると表示が大丈夫に見えますが、カーソルを移動するHome他のコマンド(、完成など)を使用するとディスプレイが壊れます(一部の文字が元のものより大きく表示されます)。右に)。 ) またはコマンドが 2 行目と重なる場合。

Zshは幅を知る必要があります。早くコマンドの文字をどこに配置するかを知るために。特に明記しない限り、各キャラクターは1つの位置を占めると仮定します。

1つの可能性は、プロンプトに次のものが含まれていることです。エスケープシーケンス正しく定義されていません。テキストの色やその他の書式を変更したり、ウィンドウのタイトルやその他の効果を変更したりするエスケープシーケンスの幅はゼロです。それらパーセント中括弧構造で囲む必要があります%{…%}。より一般的には、このようなエスケープシーケンスは%42{…%}zshに中括弧の内容の幅が42文字であると仮定するように指示します。

したがって、プロンプト設定(または参照する変数)を確認し、すべてのPS1エスケープPROMPTシーケンス(\e[…mテキスト属性の変更 - 一部の変数(たとえば)を介して表示されることに注意してください)が含まれていることを$fg[red]確認してください%{…%}。 oh-my-zshを使用していますので、oh-my-zshで使用している自分の設定と定義を確認してください。

Bashでも同じ問題が発生します。幅0のシーケンスがあります。早くに含める必要があります\[…\]

もう1つの可能性は、プロンプトにASCII以外の文字が含まれており、zsh(または他のアプリケーション)と端末が幅について異なるアイデアを持っていることです。あれば、このようなことが起こったでしょう。エンコード間の不一致ターミナルのエンコーディングはシェルで宣言されたエンコーディングとは異なり、2つのエンコーディングによって一部のバイトシーケンスの幅が異なります。通常、Unicodeではない端末を使用しますが、Unicodeロケールを宣言するとき、またはその逆の場合にこの問題が発生する可能性があります。

アプリケーションは環境変数を使用してロケールを識別します。関連する設定はLC_CTYPE環境変数によって決定され(最初の設定が適用されます)、このコマンドは現在の設定を通知します。一般に、ロケールの問題を回避する最善の方法は、端末エミュレータが必要なエンコーディングを知っているので、それを設定することです。ただし、これが機能しない場合は必ず設定してください。LANGUAGELC_ALLLC_CTYPELANGlocale | grep LC_CTYPELC_CTYPELC_CTYPE

前のコマンドが改行文字で終わらないいくつかの出力を表示すると同じ症状が発生する可能性があるため、プロンプトは行の途中に表示されますが、シェルはそれを認識しません。この場合、これはそのコマンドを実行した後にのみ発生し、継続的には発生しません。

行が正しく表示されない場合は、コマンドまたはredisplayclear-screenデフォルトはCtrl+にバインドされている)として修正されます。L

答え2

私は同じ問題があり、ここで解決策を見つけました。https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519~/.zshrc.

export LC_CTYPE=en_US.UTF-8

答え3

macOSのiTerm 2でこの問題が発生しました。最後に、環境設定 - >プロファイル - >テキストに移動し、「Unicodeバージョン9幅を使用」を選択して問題を解決しました。

答え4

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

関連情報