ベストアンサー1
カーソルを適切に管理するために、シェルはプロンプト文字列のどの部分が実際にカーソルを移動させ、どの部分がそうでないかを知る必要があります。
これを行うには、表示される文字を生成しないプロンプト部分を次に囲む必要があります\\[
。\\]
プロンプトの書式設定は、最終的にいくつかの段階で発生します。プロンプト拡張コードとシェル変数はシェル自体で処理されますが、色と書式設定コードは別々のプロセスである端末エミュレータにのみ渡されます。
あなたのヒントは次のとおりです。
declare -- PS1="\\[\\e]0;\\u@\\h: \\w\\a\\]\${debian_chroot:+(\$debian_chroot)}\\[\\e[1m\\e[38;5;208m\\e[48;5;24m\\u@\\h\\[\\e[0m\\]:\\[\\e[97m\\]\\w\\[\\e[0m\\]\\\$
\\[
- 非生産的な部分を始めましょう\\e]0;\\u@\\h: \\w\\a
- この部分は、この機能をサポートするターミナルエミュレータのウィンドウタイトルを変更するため、実際のプロンプトの一部にはなりません。\\]
- 非生産部分の終了\${debian_chroot:+(\$debian_chroot)}
-$debian_chroot
変数が設定されていて空でない場合(つまり、シェルがchroot環境にある場合)、その値は括弧内に出力されます。それ以外の場合は空の文字列が出力されます。これらの拡張はシェル内で完全に処理されるため、シェルは常にこの部分の長さを知っています。\\[
- 別の非生産的な部分を始めましょう\\e[1m\\e[38;5;208m\\e[48;5;24m
- 太字設定、8ビット前景色設定、8ビット背景色設定。これは有効な非印刷フォーマットコードです。- ここに「非生産セクションの終了」コードがあるはずですが、欠落しています!
\\u@\\h
admin@OLAF
- これにより、ユーザー名@ホスト名などのテキストが生成されます。\\[\\e[0m\\]
- 「デフォルト出力にリセット」コードを正しくカプセル化します。:
- コロンのみ出力\\[\\e[97m\\]
- 「明るい前景色設定」コードを正しくカプセル化します。\\w
- シェルプロンプト拡張:現在の作業ディレクトリの出力\\[\\e[0m\\]
- 「デフォルト出力にリセット」コードを正しくカプセル化します。\\\$
- シェルプロンプト特殊拡張:$
一般ユーザーまたは#
rootの場合に出力されます。
したがって、コードが不足しているため、シェルは文字列 "admin@OLAF"(シェルで拡張\\u@\\h
)が書式設定コードの一部になり、実際のプロンプト以外の場所で終わると想定します。文字列の長さは10文字なので、シェルがプロンプトの後にコマンドを再構築する必要があるときに移動する列を誤って計算します。つまり、正確に10文字です。