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

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

これが私の現在のプロンプトの定義です:

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

そして私は統合に取り組んでいますこれ基本的に、非常に読みにくくなってきています。

Perl が正規表現で実行できるのと同じような方法で、これを複数行にする方法はありますか (たとえば、/x モードが実行すること。たとえばm{ ... }x、. は...複数行にすることができます)?

このようなもの:

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通常のシェル解析ルールに従って文字列値を分割し、コメントを破棄し (CのオプションZ)、改行をセミコロンに置き換えるのではなく通常の空白として扱うことができます (nのオプションZ)。その後、結果をつなぎ合わせて ( j::)、引用符のレベルを評価して ( 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" "
'}}

注: この解析モードでは、式全体を 1 つの単語として解析する必要があることがわかっている%(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 が有効になっている場合にのみ、#in を引用符で囲む必要があります。%#
  • 後に続くスペースには、%f何らかの引用符が必要です。バックスラッシュを使用することもできますが、エディターに「可視の空白」がない場合は、行の継続のように見える場合があります。

答え3

おそらくすぐに答えが欲しいと思うでしょうから、ここに解決策があります

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

ただし、文字列内にコメントを記述することはできないので注意してください。

関連情報