Existe-t-il un moyen de rendre la définition rapide multiligne?

Ceci est ma définition rapide actuelle:

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

et je travaille à l'intégrer. Fondamentalement, je commence à le find très illisible.

Existe-t-il un moyen de le rendre multiligne d'une façon peut-être similaire à ce que Perl peut faire avec les regex (par exemple, ce que fait le mode / x, comme m{ ... }x ... le ... peut être multiligne) ?

Quelque chose comme ça:

 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' 

Avec Zsh 4.3.11, vous pouvez utiliser l'indicateur d'expansion du paramètre Z pour split une valeur de string selon les règles normales d'parsing du shell tout en ignorant les commentaires (option C à Z ) et traiter les nouvelles lignes comme des espaces normaux au lieu de les replace par des points-virgules à Z ). Vous pouvez ensuite relier les résultats set ( j:: et évaluer un niveau de cotation ( Q ) pour vous permettre de citer des espaces blancs et d'autres caractères problématiques (tels que les caractères d'introduction des commentaires «nus»):

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

Remarque: Ce mode d'parsing semble savoir qu'il doit parsingr l'expression %(v…) entière comme un seul mot, il n'est donc pas nécessaire de protéger l'espace inclus dans la valeur conditionnelle. Cependant, nous avons besoin de protéger les espaces "de niveau supérieur" (ceux qui viennent après %f ) car ceux-ci seront sinon pris comme séparateur de mots normal. Le dernier passage sans mise en concurrency traitera tout mécanisme de citation (c.-à '' , "" , $'' ), De sorte que vous pouvez choisir ce que vous utilisez pour protéger les caractères spéciaux ).


Si vous n'utilisez pas la version 4.3.11, vous pouvez utiliser un tableau pour vous permettre d'intercaler des commentaires avec les éléments de string. Vous devrez probablement utiliser plus de guillemets que l'indicateur d'expansion du paramètre Z , mais le résultat peut être encore tolérable.

 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} 

Quelques notes sur la citation:

  • Vous pouvez éviter de citer le ~ si vous dites %1~ au lieu de le split (c'est %~ avec un argument de 1 , après tout).
  • J'ai cité le mot entier %(v…) , mais seules les parenthèses et l'espace ont besoin d'être protégés.
  • Il vous suffit de citer le # dans %# si vous avez activé EXTENDED_GLOB.
  • Les espaces qui viennent après %f besoin d'une citation. Vous pouvez utiliser une barre oblique inverse, mais cela pourrait ressembler à une continuation de ligne si vous n'avez pas de «blancs visibles» dans votre éditeur.

Vous pourriez faire quelque chose comme:

 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 

etc.?

puisque vous voulez probablement une réponse rapide, voici une solution

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

mais s'il vous plaît noter que vous ne pouvez pas commenter à l'intérieur d'une string