Sobreposição de linhas longas no prompt personalizado do Bash PS1

13

Eu configurei um PS1prompt sofisticado de duas linhas , com nome do servidor, hora, nome do usuário e outras variáveis ​​úteis.

PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"

insira a descrição da imagem aqui

Fonte completa do Github aqui .

O problema é que muitas vezes as longas filas são contornadas, o que significa que a nova linha se sobrepõe à anterior.

O problema é inconsistente: algumas linhas estão quebradas corretamente, outras não.

Alguma idéia de como consertar isso?

Adam Matan
fonte

Respostas:

16

Aqui está o meu sofisticado PS1 de duas linhas para o prompt do bash.

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

Então aqui está o que eu fiz. Se essa fosse minha cor:

\e[1;32m

Eu mudei para:

\[\e[1;32m\]

Essencialmente, você precisa incluí-lo em:

\[$mycolor\]

Faça o checkout desta resposta .

varunyellina
fonte
+1 Obrigado. Curiosamente, ele não parece funcionar no mac.
Adam Matan
Você é um salva-vidas! Quanto ao mac, Adam .. É provavelmente devido à contagem de colunas. Tente definir o prompt para apenas uma sequência de caracteres, como 'this is my prompt:' e veja se o problema persiste. Nesse caso, a configuração da coluna no seu terminal é muito larga ou muito estreita.
Alex Summers
7

Encontrei esta solução on-line, que sugeria um colchete para as variáveis ​​de cores:

Mude isso:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

para:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

Eu comprometi a mudança - espero que funcione conforme o esperado.

Adam Matan
fonte
1
não tenho certeza do que isso deve alcançar. Você precisa envolver qualquer coisa que não ocupe espaço (ansi-escapes) \[ \], para que você não possa terminar todas as cores de ansi-escape com, \]porque, e se não houver um \[. Ao inserir caracteres não imprimíveis, basta envolvê-los \[ \](por exemplo PS1='\[\e[32;1m\] green prompt \[\e[0m\] $').
Dllnmc 26/09/16
De fato! Sem a abertura \ [, isso indica o prompt para nós, usuários linux. Talvez seja diferente para o OSX? Que estranho. \ [e \ e [são interpretados como duas coisas diferentes para o linux. O primeiro indica que o seguinte item não pode ser impresso e não deve contá-lo como parte dos caracteres exibidos no prompt. O \ e [é o colchete de escape para iniciar um esquema de cores ANSI.
Alex Summers
0

Minha solução preferida para a questão da sobreposição de linhas longas no bash PS1 é ter um \nno final das linhas de prompt do PS1.

por exemplo

insira a descrição da imagem aqui

Se você quiser todas as minhas outras coisas - hora, usuário, host, diretório e ramo git (!), Você pode usar este (mac ou linux):

/unix//a/124012/10043

Michael Durrant
fonte
para o ramo git você deve usar if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi. Esse é um padrão ao colocar o git em um script e avaliar o nome da ramificação pelo que li anteriormente.
dylnmc