como formatar o caminho em um prompt zsh?

21

Eu adoraria ter um caminho colorido legível. Por exemplo, em vez de simplesmente usar% ~ para retornar ~/path/to/foo , gostaria de formatá-lo em ~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfoo para destacar os separadores de caminho.

Posso definir o conteúdo de PROMPT para que a expressão de caminho seja reavaliada em cada exibição? Algo como ${${(%):-%~}//\//_some_format_expression/} obviamente não funciona.

Ou eu deveria continuar com isso, e forçar o valor PROMPT a ser redefinido toda vez que estivermos alterando um diretório?

Qualquer solução que atinja o objetivo de formatação do caminho será bem-vinda.

Obrigado :)

    
por Nicolas Dumazet 30.09.2009 / 18:26

4 respostas

33

zsh

Tente isto:

setopt PROMPT_SUBST
PROMPT='%{$(pwd|grep --color=always /)%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

Aqui está um resumo do prompt:

  • PROMPT_SUBST ativa a substituição de comando no prompt (e expansão de parâmetro e expansão aritmética)
  • %{...%} - uma sequência de escape
  • $(pwd|grep --color=always /) - imprime o diretório atual e destaca o / - a cor dependerá da variável de ambiente $ GREP_COLORS (ou seu valor padrão) - o negrito vermelho é o padrão
  • %${#PWD}G - use o comprimento em caracteres do nome do diretório atual como um valor de glitch. Isso faz com que o shell considere isso o comprimento da seqüência de caracteres anterior (após o " %{ ") em vez do comprimento real da seqüência de caracteres que inclui seqüências de escape ANSI. Isso impede que o shell fique confuso sobre a posição do cursor em relação ao final do prompt.
    - - - - - - - este é o fim da parte que responde sua pergunta - - - - - - -
  • %(!.%F{red}.%F{cyan}) - se este for um shell privilegiado (root), defina a cor do primeiro plano para vermelho, caso contrário, ciano
  • %n - gera o nome de usuário
  • %f - redefine a cor do primeiro plano para o padrão
  • @ - um literal no sinal
  • %F{yellow} - torna a cor do primeiro plano amarela
  • %m - produz o nome do host
  • %f - redefine a cor do primeiro plano para o padrão
  • %(!.%F{red}.) - se for um shell privilegiado (root), defina a cor do primeiro plano para vermelho
  • %# - imprime # para um shell privilegiado ou % para um desfavorecido
  • %f - redefine a cor do primeiro plano para o padrão

Eu coloquei o caminho primeiro neste prompt para ênfase, uma vez que a questão diz respeito ao caminho.

Aquiestáumaversãoparazshquealteraacordabarradependendosevocêéroot(privilegiado)manipulandoavariável$GREP_COLORS:

setoptPROMPT_SUBSTPROMPT='%{$(pwd|([[$EUID==0]]&&GREP_COLORS="mt=01;31" grep --color=always /|| GREP_COLORS="mt=01;34" grep --color=always /))%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

Bash

Você pode fazer um prompt semelhante no Bash. Neste exemplo, coloquei o usuário e o nome do host primeiro e a cor das barras também muda quando o UID é 0. Aviso: isso sobrescreve a variável de prompt $PS1 do Bash. Isso não deve ser um problema, a menos que você esteja fazendo algo especial ou espere que o comportamento mude quando você definir essa variável diretamente e isso estiver em vigor. Além disso, isso usa uma variável chamada " usercolor ", que pode colidir com outra coisa, embora essa coisa toda possa ser colocada em uma função e a variável declarada local.

PROMPT_COMMAND='usercolor="\[3[0;36m\]";[[ $EUID == 0 ]] && usercolor="\[3[1;31m\]";PS1="$(pwd)";PS1="$usercolor\u\[3[0m\]@\[3[0;33m\]\h\[3[0m\]:${PS1//\//$usercolor/\[3[0m\]}$usercolor\$\[3[0m\] "'

EuaproveiteiofatodequeoBashnãotemorecurso"glitch" do zsh para usar a substituição de expansão de parâmetro para colorir condicionalmente as barras (em vez de usar o grep).

    
por 17.10.2009 / 17:31
3

Depois de algumas mudanças, posso fornecer uma solução substituindo chpwd :

doprompt() {
  local my_path=${(%):-%~}
  PROMPT="${yourstuff}${my_path//\//${PR_BOLD_RED}/${reset_color}}${otherstuff}"
}
doprompt

chpwd() {
  doprompt
  # unrelated: set window title
  [[ -t 1 ]] || return;
  print -Pn "\e]2;%n@%m: %~\a";
}
  • Existe uma maneira de melhorar este código para se livrar do my_path var temporário? Eu não posso substituir diretamente o / inside% ~ ...
  • Qualquer solução que use uma sintaxe dinâmica para evitar chamadas em cada diretório altere doprompt é provavelmente mais limpa.
por 30.09.2009 / 19:18
3

Uma solução pura de zsh:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} é o caminho atual.
  • ${xxxxx//\//${PR_BOLD_RED}/%f} substitui todo / em xxxxx por um negrito de cor vermelha
  • e, claro, PROMPT_SUBST tem que estar ligado.

Eu estava usando aspas duplas nos meus testes, o que não permite a substituição. Tudo funciona bem com aspas simples.

    
por 30.10.2009 / 10:25
0

Aqui está minha tentativa (baseada em NicDumZ):

setopt PROMPT_SUBST
# red, green, yellow, blue, magenta, cyan, white, black
# B (bold), K(background color), F(foreground color)

function doprompt {
# this is just the directory (%d could be %~ -- I prefer full path always)
PROMPT='%F{yellow}${${(%):-%d}//\//%F{magenta\}%B/%b%F{yellow\}}%f'
}

function chpwd() {
    doprompt
}

A diferença é que estou usando o caminho colorido, portanto, preciso retornar à minha cor original para o caminho depois que a barra ficar colorida. No meu caso, o caminho é normalmente amarelo, e a barra fica colorida com magenta, depois volta para amarelo. Eu também prefiro usar sequências% F% f, pois elas parecem muito mais legíveis para mim.

    
por 01.12.2009 / 15:07

Tags