完了時にディスプレイで繰り返されるコマンドの最初の文字


21

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

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

rxvt-unicdoe、xterm、ターミネーターを試しました。これらのターミナルエミュレータにはすべてこの問題があります。

Zshバージョン5.0.2、設定ファイルon-my-zsh


zshが実行するコマンドで文字が繰り返されていますか、それとも単に表示されていますか?コマンドが2文字より長い場合、文字数は変わりますか?現在のディレクトリが変更されると、番号は変わりますか?
ジル 'SO-悪であるのをやめる'

@Gillesコマンドに繰り返し文字が存在しません。コマンドを実行できます。
ジレン

回答:


32

コマンドラインの文字がオフセットで表示されることがある場合、これは多くの場合、zshがプロンプトの間違った幅を計算したためです。症状は、文字を追加したり、文字ごとに移動している間は表示がきれいに見えるが、カーソルを移動する他のコマンド(Home、完了など)を使用すると文字化けする(一部の文字が本来よりも右に表示される)ことです)またはコマンドが2行目に重なる場合。

Zsh は、コマンドの文字がどこに配置されているかを知るために、プロンプトの幅を知る必要があります。特に指定のない限り、各文字は1つの位置を占めると想定しています。

1つの可能性は、プロンプトに適切に区切られていないエスケープシーケンスが含まれていることです。テキストの色やその他の書式設定を変更するエスケープシーケンス、またはウィンドウタイトルやその他の効果を変更するエスケープシーケンスの幅はゼロです。これらは、中括弧の構成内に含める必要があります%{…%}。より一般的に%42{…%}は、中括弧内の幅が42文字であると想定するようにzshに指示するようなエスケープシーケンスです。

だから、(あなたの迅速な設定を確認しPS1PROMPT彼らが参照している、または変数)と(のようなすべてのエスケープシーケンスことを確認してください\e[…m変更テキスト属性へ-ノートそれはのようないくつかの変数を経由して存在してもよいことは$fg[red])内部にあります%{…%}。oh-my-zshを使用しているため、独自の設定とoh-my-zshから使用している定義の両方を確認してください。

bashでも同じ問題が発生します。プロンプト内の幅がゼロのシーケンスは、で囲む必要があります\[…\]

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

アプリケーションは環境変数に依存してロケールを認識します。関連する設定はLC_CTYPE、環境変数から決定され、LANGUAGELC_ALLLC_CTYPEおよびLANG(適用される設定されているこれらの最初)。このコマンドlocale | grep LC_CTYPEは、現在の設定を示します。通常、ロケールの問題を回避する最善の方法は、ターミナルエミュレーターに設定を許可LC_CTYPEすることです。しかし、それがうまくいかない場合は、必ず設定してくださいLC_CTYPE

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

行が適切に表示されない場合は、コマンドredisplayまたはclear-screen(デフォルトでCtrl+にバインドさLれている)によって修正されます。


おそらく関連するフォントが欠落していると思います。最初の文字がおかしいことに気づきました。->私が思うに期待されている
-jilen

@jilenああ、これは私が言及するのを忘れた別の問題である可能性があります:多分あなたのプロンプトはあなたの端末とは異なるエンコーディングの非ASCII文字を含み、エンコーディングの一方または両方がマルチバイトです。それに関するヘルプが必要な場合はlocale、andの出力echo $PS1 | od -t x1(およびで使用される他の変数についても同じこと)を投稿してください$PS1
ジル 'SO-悪であるのをやめる'

2
ロケールを設定するのを忘れました(archlinuxを使用していますが、デフォルトではロケールは設定されていません)。localeを設定すると、この問題は修正されます。どうもありがとう、男!!!!
ジレン

私がそれを支持したのは、まあ、それはかなり素晴らしいからです。ただし、カーソルカウントを独自に処理する場合は、エスケープを角かっこに含める必要はありません。サブシェル化された関数の呼び出しは過去に私のために働いていました-または、stdoutを使用せずに/ dev / ttyにまだ上陸するリダイレクトが機能するかもしれません。働いていた他の方法- \e{7,8}カーソル状態の保存/復元に使用。
mikeserv 14

それはLC_CTYPE私のためにそれを修正したものでした。に設定しましたがC、設定を解除するとすべてが機能しました。ありがとう。
jmaloney

14

私は同じ問題を抱えていたし、ここに私の解決策を見つけた:https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519を。以下を単純に入力してください~/.zshrc

export LC_CTYPE=en_US.UTF-8


1
ヒントをありがとう!ただし、locale使用している全体をリセットする必要がありましたが、うまくいきました。この回答は、Ubuntuに必要な手順を提供します。
最大

どうもありがとうございます!保存されたたくさんaggrevationの私
モシェ

1

macOSのiTerm 2でこの問題が発生しました。最終的には、[設定]-> [プロファイル]-> [テキスト]に移動し、[Unicodeバージョン9の幅を使用]をオフにして解決しました。


うわー、これは実際に機能しました。ありがとう!
ポールカラブロ

1

私は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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.