プロンプトで複数行を定義する方法はありますか?

プロンプトで複数行を定義する方法はありますか?

これは現在のプロンプト定義です。

PS1=$'%F{063}%1~%f %(1v.%F{099}%1v %f.)%F{063}%%%f '
RPROMPT='$VIMODE %m'

統合しようとしています。これ。基本的に私は読むのが非常に難しいことを知り始めました。

m{ ... }xおそらく、Perlが正規表現に対して実行するのと同様に、複数行にする方法はあり...ますか?

このような:

PS1=$'
   %F{063}%1 # format blue
      ~      # show current directory
   %f
   %(1v.%F{099}%1v %f.) # show git branch if git repo in purple
   %F{063}   # format blue
      %#     # % for user and # for root
   %f '
RPROMPT='$VIMODE %m'

答え1

次のことができます。

PS1='%F{063}%1' # format blue
PS1=$PS1'~'     # show current directory
PS1=$PS1'%f'
PS1=$PS1'%(1v.%F{099}%1v %f.)' # show git branch if git repo in purple

など。 ?

答え2

Zsh 4.3.11では、Z引数拡張フラグを使用して、通常のシェル構文解析規則に従って文字列値を分割すると同時にコメント(Coption)を削除し、新しい行をセミコロン(option)Zに置き換える代わりに通常の空白として扱うことができます。その後、結果を再度集め()、引用レベルを評価して()、スペースやその他の問題のある文字(「基本」注釈の紹介文字など)を引用することができます。nZj::Q

PS1=${(j::Q)${(Z:Cn:):-$'
   %F{063}%1 # format blue
      ~      # show current directory
   %f" "
   %(1v.%F{099}%1v %f.) # show git branch if git repo in purple
   %F{063}   # format blue
      %#     # % for user and # for root
   %f" "
'}}

注:この解析モードでは、式全体を単一の単語に解析する必要があることがわかっているよう%(v…)で、条件値に含まれるスペースを保護する必要はありません。ただし、「先頭」スペース(すぐ後ろのスペース)を保護する必要があります%f。そうしないと、通常の単語区切り文字として扱われるからです。最後の逆参照パスは、すべての引用メカニズム(たとえば\、、、、、など)を処理''するため、特殊文字(たとえば、「親」スペースまたは最終値のコメントインストーラ)を保護するための項目を選択できます。""$''


4.3.11を使用しない場合は、文字列要素にコメントを挿入できる配列を使用できます。パラメータ拡張フラグよりも多くの参照を使用する必要があるかもしれませんが、Z結果は依然として受け入れられます。

ps1_arr=(
   %F{063}%1 # format blue
      \~     # show current directory
   %f' '
   '%(1v.%F{099}%1v %f.)' # show git branch if git repo in purple
   %F{063}   # format blue
      %\#    # % for user and # for root
   %f' '
)
PS1=${(j::)ps1_arr}

引用に関する注意事項:

  • ~分割する代わりに引用を避けることができます%1~%~最終的にはパラメータが必要です)。1
  • 単語全体を引用していますが、%(v…)括弧と空白だけを保護すればいいです。
  • EXTENDED_GLOBを有効にした場合は、引用符のみが必要です#%#
  • それ以降のスペースには%f一種の引用が必要です。バックスラッシュを使用できますが、エディタに「表示される空白」がない場合は、行が続くように見えます。

答え3

おそらく迅速な答えが欲しいので、ここに解決策があります。

PS1=$'\
%F{063}%1\
~\
%f\
%(1v.%F{099}%1v %f.)\
%F{063}\
%#\
%f '

ただし、文字列内にコメントを付けることができないことに注意してください。

関連情報