Como posso alterar a cor do meu prompt em zsh (diferente do texto normal)?

121

Para reconhecer melhor o início e o fim da saída em uma linha de comando, quero alterar a cor do meu prompt, para que seja visivelmente diferente da saída do programa. Como eu uso zsh, alguém pode me dar uma dica?

Mnementh
fonte

Respostas:

57

Aqui está um exemplo de como definir um prompt vermelho:

PS1=$'\e[0;31m$ \e[0m'

A mágica é \e[0;31m(ativar o primeiro plano vermelho) e \e[0m(desativar os atributos do personagem). Essas são chamadas de sequências de escape. Diferentes sequências de escape fornecem resultados diferentes, desde o posicionamento absoluto do cursor até a cor, a capacidade de alterar a barra de título de sua janela e assim por diante.

Para obter mais informações sobre sequências de escape, consulte a entrada da Wikipedia sobre códigos de escape ANSI

Bryan Oakley
fonte
3
Estou usando PROMPT = '[%!]' No meu .zshrc. Como você pode colorir? Executei PROMPT = '\ e [0; 31m [%!] \ E [0m' sem sucesso no meu .zshrc.
Léo Léopold Hertz 준영
3
@ erikb85: por que você diz que está errado? Posso fazer algo para melhorar a resposta? Para mim, fazer o acima me dá um cifrão vermelho, então não entendo por que você acha que está errado.
Bryan Oakley
4
Está funcionando, mas o $ antes da string faz zshrc falhar. O texto é colocado à esquerda quando uso a tabulação. Prefiro a resposta @Joe the Person
Moebius
1
Eu concordo, @Moebius, eu queria que este funcionasse era claro e simples, mas bagunça completamente a guia no cd
diek
2
Achei que zsh não precisava de coisas estranhas e loucas de escape ANSI ... deve haver uma resposta melhor ...
Charlie Parker
264

Coloque isso em ~/.zshrc:

autoload -U colors && colors
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "

Cores Suportadas:
red, blue, green, cyan, yellow, magenta, black, e white(a partir de esta resposta ), embora diferentes computadores podem ter diferentes opções válidas.

Códigos de cores surround (e quaisquer outros caracteres não imprimíveis) com %{....%}. Isso é para que a quebra automática de texto funcione corretamente.

Além disso, aqui está como você pode fazer isso funcionar com a remoção de diretório a partir daqui .

PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%(5~|%-1~/.../%3~|%4~) %{$reset_color%}%% "
Joe a Pessoa
fonte
3
Concordo, de longe a resposta superior (felizmente esta resposta foi o terceiro resultado do Google;)
novo123456
3
não está funcionando para mim. :(zsh: colors: function definition file not found
Balki
Você está usando ZSH4? Não acho que funcione em versões inferiores a 4.3.11. Se você tiver a versão mais recente, talvez ela não esteja usando os arquivos certos.
Joe the Person,
Quais são os valores de cor válidos?
chakrit
12
os %{...%}meios que o conteúdo vai ser interpretados como uma sequência de escape literal, de modo que o cursor não vai mover durante a impressão a sequência. Se você não usar isso, os códigos de cores podem mover o cursor e produzir efeitos indesejados. Isso está documentado na Visual Effectsseção da página do manual do zshmisc
Bruno Penteado
69

Zsh vem com prompts coloridos integrados. Experimentar

autoload -U promptinit && promptinit

e depois prompt -llista os prompts disponíveis, -p firevisualiza o prompt "disparar" e -s firedefine-o.

Quando estiver pronto para adicionar um prompt, adicione algo assim abaixo da linha de carregamento automático acima:

prompt fade red
Mitro
fonte
Existe uma maneira de colorir todos os temas? Eu gosto do prompt walters, mas gostaria em vermelho.
Pat Myron
24

Não acho que autoload -U colors && colorsseja mais necessário e pode-se simplesmente fazer:

PS1="%{%F{red}%}%n%{%f%}@%{%F{blue}%}%m %{%F{yellow}%}%~ %{$%f%}%% "

para obter o mesmo resultado da resposta do FireDude . Veja a documentação do ZSH para mais informações.

Andrew Marshall
fonte
PARA SUA INFORMAÇÃO. Acabei de experimentar o Ubunutu 11.04 e as cores não funcionaram para mim semautoload -U colors && colors
dpc.pw
2
Esquisito. Funciona para mim no OS X e Ubuntu 10.04.
Andrew Marshall,
@Andrew Marshall Sim, mas é mais provável que funcione com autoload.
Joe the Person
@ fireDude67 Como configurar autoload on?
balki,
1
Se você não precisar autoload -U colors, isso significa que sua distribuição já o possui em algum outro arquivo de inicialização zsh. Você ainda deve incluí-lo nos scripts que pretende compartilhar com outras pessoas.
kindall
23

Cores disponiveis:

for i in {1..256}; do print -P "%F{$i}Color : $i"; done;

                                      


Variáveis ​​Disponíveis:

  • %F{118} (1 a 256)
  • $FG[018] (1 a 256)
  • $fg[magenta] (magenta, vermelho, branco, amarelo, preto, azul, ciano, verde)

Exemplo de prompt:

PS1='%(?.%F{green}.%F{green})%n@%m:%~%# %f'

Capturar

PS1='%{$fg[gray]%}[%T][%n@%m%{$reset_color%}:%c%{$reset_color%}%{$fg[gray]%}$(git_prompt_info)]$(prompt_char)%{$reset_color%} ' 

Capturar


Instalar:

A definição de variáveis ​​(PS1 / PROMPT) precisa ser adicionada a ~/.zshrc

Também podemos redefinir a variável PS1 no prompt atual para testá-la imediatamente (as alterações não são salvas).

Intika
fonte
15

A resposta de Bryan Oakley acima tem uma falha, pois já foi apontada e a solução oferecida por Andrew Marshall embora não tenha a falha, no entanto, não a torna óbvia para muita personalização nas cores usadas.

Como o macOS Catalina pede que zsh seja o shell padrão de agora em diante, acho que várias outras pessoas podem querer personalizar seu prompt e podem vir aqui para obter uma resposta. Portanto, pensei em tentar fornecer um resumo mais amplo e tocar em outras noções intimamente relacionadas que permitem mais personalização.

Códigos de 3 dígitos para várias cores. Em primeiro lugar, aqui podemos encontrar códigos de 3 dígitos para várias cores: https://unix.stackexchange.com/a/124409/194343 . Por exemplo, 214 é algum tipo de cor laranja.

Primeiro plano e plano de fundo. A outra informação importante é que para cores de fundo F oreground e bac K pode-se definir o que querem com F e K respectivamente. A fonte é o manual zsh sobre efeitos visuais: http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Visual-effects

Então, por exemplo, os dois comandos a seguir

autoload -U colors && colors
export PS1="%F{214}%K{000}%m%F{015}%K{000}:%F{039}%K{000}%~%F{015}%K{000}\$ "

apresente o nome do host em laranja com fundo preto, seguido por dois pontos em branco com fundo preto, seguido pelo diretório de trabalho atual em azul brilhante com fundo preto, seguido pelo cifrão em branco com fundo preto.

Mais informações relacionadas são encontradas abaixo.

Informações rápidas no lado direito. Por exemplo, adicionar um carimbo de data / hora. Consulte https://superuser.com/a/1251045/290299 . Claro, isso pode ser codificado por cores, por exemplo, com alguma cor azul claro / roxo, como este:

RPROMPT="%F{111}%K{000}[%D{%f/%m/%y}|%@]"

Cores para ls. Depois de ler o manual do ls, um, por exemplo, pode ativar as cores para lsusar os dois comandos a seguir:

export CLICOLOR=1
export LSCOLORS=gafacadabaegedabagacad

Por fim, como última observação que não testei, pois estou feliz com minha configuração, outro caminho pode ser alguém instalar a porta coreutilsdo MacPorts e usar gdircolors(fonte: https://unix.stackexchange.com/a/174596 / 194343 ). (Posso editar esta última parte no futuro, pois todas as acima são peças relacionadas que tornam a vida cotidiana muito mais divertida e fácil de lidar.)

Rato poderoso
fonte
1
Esta é uma resposta extremamente útil. Obrigado por colocar isso junto.
shaunakde
@shaunakde De nada! :)
MightyMouse
4

Descobri que, com zsh5 (o padrão no Debian Jessie), todas essas soluções funcionam:

  • $'\e[00m
  • $fg[white]
  • $fg{white}

Agora, eles têm um problema: eles moverão o cursor, resultando em um decalque feio durante a tabulação (para preenchimento automático). A solução é simplesmente cercar as sequências de escape com %{FOOBAR%}. Levei um tempo para descobrir isso. Para as 2ª e 3ª soluções, o colorsmódulo de carregamento é obrigatório. Para manter a 1ª solução legível, basta definir as variáveis ​​para as cores que você usa.

user3459474
fonte
2

Para obter um prompt com a cor dependendo do status de saída do último comando, você pode usar isto:

PS1='%(?.%F{green}.%F{red})%n@%m:%~%# %f'

Basta adicionar esta linha ao seu ~/.zshrc.

A documentação lista possíveis marcadores.

Martin
fonte
Esta é a melhor solução aqui, muito obrigado.
Eddy Ekofo
2

Experimente o meu favorito: coloque

~/.zshrc

está linha:

PROMPT='%F{240}%n%F{red}@%F{green}%m:%F{141}%d$ %F{reset}'

não esqueça

source ~/.zshrc

para testar as mudanças

você pode alterar as cores / códigos de cores, é claro :-)

Hermann Schwarz
fonte
0

man zshall e pesquise PROMPT EXPANSION

Depois de ler as respostas existentes aqui, várias delas são conflitantes. Eu tentei as várias abordagens em sistemas executando zsh 4.2 e 5+ e descobri que o motivo pelo qual essas respostas são conflitantes é que elas não dizem a qual versão do ZSH se destinam. Versões diferentes usam sintaxe diferente para isso e algumas delas requerem vários carregamentos automáticos.

Portanto, a melhor aposta é provavelmente manobrar o zshall e pesquisar PROMPT EXPANSION para descobrir todas as regras para sua instalação específica do zsh. Observe nos comentários, coisas como "Eu uso o Ubuntu 11.04 ou 10.4 ou OSX" não são muito significativas, pois não está claro qual versão do ZSH você está usando. Ubuntu 11.04 não implica uma versão mais recente do ZSH do que o ubuntu 10.04. Pode haver vários motivos pelos quais uma versão mais antiga foi instalada. Por falar nisso, uma versão mais recente do ZSH não implica qual sintaxe usar sem saber qual versão do ZSH é.

cs_alumnus
fonte
0

Para complementar todas as respostas acima, outro truque conveniente é colocar as configurações coloridas do prompt em uma função zsh. Lá você pode definir variáveis ​​locais para alias de comandos mais longos, por exemplo, rc=$reset_colorou definir suas próprias variáveis ​​de cor. Não se esqueça de colocá-lo em seu .zshrcarquivo e chamar a função que você definiu:

# Coloured prompt
autoload -U colors && colors
function myprompt {
  local rc=$reset_color
  export PS1="%F{cyan}%n%{$rc%}@%F{green}%m%{$rc%}:%F{magenta}%~%{$rc%}%# "
}
myprompt
mabalenk
fonte