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

3

Esta é a 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ção de isso . Basicamente, estou começando a achar muito ilegível.

Existe alguma maneira que eu possa torná-lo multilinha de uma forma talvez semelhante ao que Perl pode fazer com regex (por exemplo, o que / x modo faz. Como m{ ... }x . o ... pode ser multilinha em que)?

Algo parecido com isto:

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'
    
por xenoterracide 23.08.2010 / 08:53

3 respostas

3

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 de 1 , 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.
por 19.05.2011 / 09:50
8

Você pode 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?

    
por 23.08.2010 / 10:56
1

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 por favor note que você não pode comentar dentro de uma string

    
por 23.08.2010 / 15:12