
Esta é minha definição de prompt atual:
PS1=$'%F{063}%1~%f %(1v.%F{099}%1v %f.)%F{063}%%%f '
RPROMPT='$VIMODE %m'
e estou trabalhando na integraçãoesse. Basicamente, estou começando a achar isso muito ilegível.
Existe alguma maneira de torná-lo multilinha de uma forma talvez semelhante ao que Perl pode fazer com regex (por exemplo, o que o modo /x faz. Como m{ ... }x
. ...
pode ser multilinha nisso)?
Algo assim:
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'
Responder1
Você poderia fazer 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.?
Responder2
Com o Zsh 4.3.11, você pode usar o Z
sinalizador de expansão de parâmetro para dividir um valor de string de acordo com as regras normais de análise do shell, descartando comentários ( C
opção to Z
) e tratando novas linhas como espaços em branco normais em vez de substituí-los por ponto-e-vírgula ( n
opção to Z
). Você pode então juntar os resultados novamente ( j::
) e avaliar um nível de aspas ( Q
) para permitir citar espaços em branco e outros caracteres problemáticos (como caracteres introdutores de comentários “vazios”):
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álise parece saber que deve analisar toda a %(v…)
expressão 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 vêm depois de %f
), pois, caso contrário, serão considerados um separador normal de palavras. A passagem final sem aspas processará qualquer mecanismo de citação (ou seja \
, ''
, , ""
, $''
), para que você possa escolher o que usar para proteger caracteres especiais (por exemplo, espaços de “nível superior” ou introdutores de comentários destinados ao valor final).
Se você não estiver usando o 4.3.11, poderá usar um array para permitir intercalar comentários com os elementos da string. Você provavelmente terá que usar mais citações do que com o Z
sinalizador de expansão de parâmetro, 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 citar
~
if você diz em vez de dividi-lo ( afinal,%1~
é%~
com um argumento de ).1
- Citei a
%(v…)
palavra inteira, mas apenas os parênteses e o espaço precisam de proteção. - Você só precisa citar
#
in%#
se tiver EXTENDED_GLOB ativado. - Os espaços que vêm depois
%f
precisam de algum tipo de citação. Você pode usar uma barra invertida, mas pode parecer uma continuação de linha se você não tiver “espaços em branco visíveis” em seu editor.
Responder3
já que você provavelmente está querendo uma resposta rápida, aqui está uma solução
PS1=$'\
%F{063}%1\
~\
%f\
%(1v.%F{099}%1v %f.)\
%F{063}\
%#\
%f '
mas observe que você não pode comentar dentro de uma string