
Esta es mi definición de mensaje actual:
PS1=$'%F{063}%1~%f %(1v.%F{099}%1v %f.)%F{063}%%%f '
RPROMPT='$VIMODE %m'
y estoy trabajando en la integracióneste. Básicamente estoy empezando a encontrarlo muy ilegible.
¿Hay alguna manera de que pueda hacerlo multilínea de una manera tal vez similar a lo que Perl puede hacer con las expresiones regulares (por ejemplo, lo que hace el modo /x. Como m{ ... }x
... ...
puede ser multilínea en eso)?
Algo como esto:
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'
Respuesta1
Podrías hacer algo como:
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.?
Respuesta2
Con Zsh 4.3.11, puede usar el Z
indicador de expansión de parámetros para dividir un valor de cadena de acuerdo con las reglas normales de análisis del shell mientras descarta los comentarios ( C
opción para Z
) y trata las nuevas líneas como espacios en blanco normales en lugar de reemplazarlos con punto y coma ( n
opción para Z
). Luego puede volver a unir los resultados ( j::
) y evaluar un nivel de comillas ( Q
) para permitirle citar espacios en blanco y otros caracteres problemáticos (como caracteres introductores de comentarios “desnudos”):
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" "
'}}
Nota: Este modo de análisis parece saber que debe analizar la %(v…)
expresión completa como una sola palabra, por lo que no tenemos que proteger el espacio incrustado en el valor condicional. Sin embargo, necesitamos proteger los espacios de "nivel superior" (los que vienen después %f
), ya que de lo contrario se tomarán como un separador de palabras normal. La pasada final sin comillas procesará cualquier mecanismo de comillas (es decir \
, ''
, ""
, $''
), por lo que puede elegir qué utilizar para proteger los caracteres especiales (por ejemplo, espacios de "nivel superior" o introductores de comentarios destinados al valor final).
Si no está utilizando 4.3.11, puede usar una matriz que le permita intercalar comentarios con los elementos de cadena. Probablemente tendrá que utilizar más comillas que con el Z
indicador de expansión de parámetros, pero el resultado aún puede ser tolerable.
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}
Algunas notas sobre la cita:
- Puedes evitar citar el
~
si lo dices%1~
en lugar de dividirlo (después de todo, es%~
con un argumento de1
). - Cité la
%(v…)
palabra completa, pero sólo los paréntesis y el espacio necesitan protección. - Solo necesita citar el
#
in%#
si tiene EXTENDED_GLOB habilitado. - Los espacios que vienen después
%f
necesitan algún tipo de cita. Puede utilizar una barra invertida, pero puede parecer una continuación de línea si no tiene "espacios en blanco visibles" en su editor.
Respuesta3
Como probablemente quieras una respuesta rápida, aquí tienes una solución.
PS1=$'\
%F{063}%1\
~\
%f\
%(1v.%F{099}%1v %f.)\
%F{063}\
%#\
%f '
pero tenga en cuenta que no puede comentar dentro de una cadena