zshプロンプトの醜いハッキングは奇妙なオートコンプリートを引き起こしました。

zshプロンプトの醜いハッキングは奇妙なオートコンプリートを引き起こしました。

現在、.zshrcには次の行があります。

export PROMPT=$(printf "\e[38;5;6m")%m$(printf "\e[m")%d-%h:" "

ホスト名は青色で表示され、履歴と現在の作業ディレクトリは通常の端末色で表示されます。どのように説明するのかわかりませんが、最初の文字を指定して複数のファイル名が一致すると、奇妙で​​予期しないことが発生します。説明するのは難しいです。一度試してみてください。

スクリーンショット:

仕上げる前に:
仕上げる前に

Tab可能な完了を表示するにはクリックしてください。終わった後

答え1

メニューの完成を表示し、コマンドラインを編集できるようにするため、アイテムを印刷し、アイテムを消去または再作成する必要があるというzshのアイデアを完全に無効にしました。これは、先端を過度に複雑にするためです。

  • 文字列リテラルを単語に入れないでくださいprintf
  • 色を変更するためにハードワイヤードCSI制御シーケンスを使用しないでください。

私が言ったようにhttps://superuser.com/a/695350/38062、Zシェルはこのようなことを知っており、指示なしにシーケンスを印刷しません。また、ハードワイヤなしで%F{green}正しいエスケープシーケンスを計算できます。terminfo

PROMPT="%B%F{青}%m%f%b%d-%h: "

追加読書

答え2

Zshはカーソルを正しく配置するためにプロンプ​​トの幅を知る必要があります。プロンプトの幅に誤った値があると仮定すると、コマンドラインを再描画すると、間違った場所にテキストが書き込まれます。これは、zshが可能な完了を示すために次の行に移動した後に発生します。表示する必要があると思う場所で完了するようにコマンドを再描画します。

プロンプトに幅0のエスケープシーケンスが含まれています。その効果は、次のテキストの外観を変更することです。 Zshはこれを知りません。特に明記しない限り、各文字の幅が1であると仮定する。 zsh にプロンプ​​トの一部の幅が 0 であることを知らせるには、その部分を囲みます。%{…%}

PROMPT=%{$(printf "\e[38;5;6m")%}%m%{$(printf "\e[m")%}%d-%h:" "

これを簡素化できます。を呼び出す代わりに、構文を使用してバックスラッシュエスケープを含めることがprintfできます。$'…'

PROMPT=$'%{\e[38;5;6m%}%m%{\e[m%}%d-%h: '

エクスポートしないでくださいPROMPT。他のアプリケーションで見られる環境変数ではなく、内部シェル変数です。

Zshには、簡単な方法でテキストの外観を変更できるヒントエスケープシーケンスがあります。何をしたいのかわかりません38;5;6。太い青は、34;1またはzshプロンプトでエスケープします。

PROMPT='%F{blue}%B%m%b%f%d-%h: '

関連情報