Existe uma maneira de tornar a definição do prompt multilinha?

Existe uma maneira de tornar a definição do prompt multilinha?

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 Zsinalizador 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 ( Copção to Z) e tratando novas linhas como espaços em branco normais em vez de substituí-los por ponto-e-vírgula ( nopçã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 Zsinalizador 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 %fprecisam 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

informação relacionada