Gibt es eine Möglichkeit, die Eingabeaufforderungsdefinition mehrzeilig zu machen?

Gibt es eine Möglichkeit, die Eingabeaufforderungsdefinition mehrzeilig zu machen?

Dies ist meine aktuelle Eingabeaufforderungsdefinition:

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

und ich arbeite an der IntegrationDas. Im Grunde genommen finde ich es langsam sehr unlesbar.

Gibt es eine Möglichkeit, es mehrzeilig zu machen, vielleicht ähnlich wie Perl es mit regulären Ausdrücken machen kann (z. B. wie es der /x-Modus macht. So m{ ... }x, ...also kann es mehrzeilig sein)?

Etwas wie das:

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'

Antwort1

Sie könnten beispielsweise Folgendes tun:

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

usw.?

Antwort2

Mit Zsh 4.3.11 können Sie das ZParametererweiterungsflag verwenden, um einen Stringwert gemäß den normalen Shell-Analyseregeln aufzuteilen, wobei Kommentare verworfen werden ( COption auf Z) und Zeilenumbrüche als normale Leerzeichen behandelt werden, anstatt sie durch Semikolons zu ersetzen ( nOption auf Z). Sie können die Ergebnisse dann wieder zusammenfügen ( j::) und eine Anführungsebene auswerten ( Q), um Leerzeichen und andere problematische Zeichen (wie „nackte“ Kommentareinführungszeichen) in Anführungszeichen zu setzen:

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" "
'}}

Hinweis: Dieser Analysemodus scheint zu wissen, dass er den gesamten %(v…)Ausdruck als einzelnes Wort analysieren soll, sodass wir das im bedingten Wert eingebettete Leerzeichen nicht schützen müssen. Wir müssen jedoch die Leerzeichen der „obersten Ebene“ schützen (die, die zufällig nach kommen %f), da diese sonst als normale Worttrennzeichen verwendet werden. Der letzte Durchgang zum Aufheben der Anführungszeichen verarbeitet alle Anführungszeichenmechanismen (d. h \. , '', "", $''), sodass Sie auswählen können, was Sie zum Schutz von Sonderzeichen verwenden (z. B. Leerzeichen der „obersten Ebene“ oder Kommentareinführungen, die für den endgültigen Wert vorgesehen sind).


Wenn Sie nicht 4.3.11 verwenden, können Sie ein Array verwenden, um Kommentare in die String-Elemente einzufügen. Sie müssen wahrscheinlich mehr Anführungszeichen verwenden als mit dem ZParametererweiterungsflag, aber das Ergebnis ist möglicherweise noch akzeptabel.

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}

Einige Anmerkungen zum Zitat:

  • Sie können das Zitieren vermeiden, ~wenn Sie sagen, %1~anstatt es aufzuteilen ( schließlich ist es %~mit einem Argument von versehen ).1
  • Ich habe das ganze %(v…)Wort zitiert, aber nur die Klammern und das Leerzeichen müssen geschützt werden.
  • Sie müssen das „ #in“ nur in Anführungszeichen setzen %#, wenn Sie EXTENDED_GLOB aktiviert haben.
  • Die Leerzeichen, die danach kommen, %fmüssen in Anführungszeichen gesetzt werden. Sie können einen Backslash verwenden, aber es könnte wie eine Zeilenfortsetzung aussehen, wenn Ihr Editor keine „sichtbaren Leerzeichen“ hat.

Antwort3

da Sie wahrscheinlich eine schnelle Antwort wollen, hier ist eine Lösung

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

Beachten Sie jedoch, dass Sie innerhalb einer Zeichenfolge keine Kommentare abgeben können.

verwandte Informationen