Com o Zsh 4.3.11, você pode usar o sinalizador de expansão do parâmetro Z
para dividir um valor de string de acordo com as regras normais de análise de shell, descartando comentários ( C
option para Z
) e tratando novas linhas como espaços em branco normais em vez de substituí-los por ponto e vírgula ( n
opção para Z
). Você pode então juntar novamente os resultados ( j::
) e avaliar um nível de citações ( Q
) para permitir que você cite o espaço em branco e outros caracteres problemáticos (como caracteres introdutórios de comentário "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" "
'}}
Nota: Esse modo de análise parece saber que deve analisar a expressão %(v…)
inteira como uma única palavra, portanto, não precisamos proteger o espaço incorporado no valor condicional. No entanto, precisamos proteger os espaços de “nível superior” (aqueles que por acaso vêm depois de %f
), já que esses serão considerados como um separador de palavras normal. O último passo de unquoting processará qualquer mecanismo de cotação (por exemplo, \
, ''
, ""
, $''
), para que você possa escolher o que você usa para proteger caracteres especiais (por exemplo, espaços de nível superior ou introdutores de comentários pretendidos para o valor final).
Se você não estiver usando o 4.3.11, você pode usar uma matriz para permitir que você intercale comentários com os elementos de string. Você provavelmente terá que usar mais citações do que com o sinalizador de expansão do parâmetro Z
, mas o resultado ainda pode ser tolerável.
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}
Algumas notas sobre a citação:
- Você pode evitar a citação de
~
se disser%1~
em vez de dividi-lo (é%~
com um argumento de1
, afinal). - Eu citei toda a palavra
%(v…)
, mas apenas os parênteses e o espaço precisam de proteção. - Você só precisa citar o
#
em%#
se tiver o EXTENDED_GLOB ativado. - Os espaços que vêm depois de
%f
precisam de algum tipo de cotação. Você pode usar uma barra invertida, mas pode parecer uma continuação de linha se você não tiver "espaço em branco visível" no seu editor.