bash - prompt complexo

4

Eu quero um prompt realmente complexo. Deve conter login, nome do computador, data, hora, diretório de trabalho, resultado do último comando e novo símbolo de linha. Eu quero colorir cada item também. Então eu inseri no meu .bashrc algum tipo de monstro como esse aqui:

# login and computer name
PS1='[\e[1;37m\]\u\e[m\]@\e[1;32m\]\h\e[m\]] '
# date, time and working directory
PS1=$PS1'[\e[1;34m\]\D{%Y-%m-%d} \e[1;35m\]\t\e[m\]] \e[1;33m\]\w\e[m\] '
# result of last command and command prompt in new line
PS1=$PS1'\e[1;31m\]${?#0}\e[m\]\n \e[1;36m\]\$\e[m\] '

Eu sei que é uma solução terrível, mas tenho pouca experiência com o bash para melhorar isso. Mas este não é o único problema.

 $ aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bash: bbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: command not found...

Após o último a , pressionei a tecla Home , mas o cursor visual não foi para o início do comando. Como você pode ver, o cursor real foi para o começo. Por que isso ocorreu? Como posso melhorar meu prompt de comando no meu .bashrc ?

Atualização:

Depois de usar o conselho do @Groxxda, tenho outro problema. Minha definição .bashrc PS1 parece esta . Problema descrito não ocorre agora. Mas se no meu histórico de comandos eu tenho ls e antes disso eu tenho cat script.sh , e se eu empurrar a seta duas vezes, eu tenho o comando como cat scls e o buffer tem apenas dois sinais (somente ls ). Por que isso ocorre? Como posso gerenciar isso?

    
por pt12lol 03.08.2014 / 12:45

2 respostas

3

Você precisa colocar partes invisíveis do texto do prompt em \[ e \] .
Isso é usado por bash para calcular o tamanho do prompt completo, para que ele possa determinar onde o cursor será após a impressão. Por exemplo, os códigos de escape de cor ANSI são invisíveis - eles alteram a cor do texto que será produzido posteriormente. Eles precisam ser colocados assim:

\e[1;35m torna-se \[\e[1;35m\]

Na sua atualização, você escreve que isso ajudou, mas há outro problema: a tela não é apagada nos locais corretos se você usar o histórico com Up / Abaixo .

Este é apenas outro aspecto do primeiro problema: O cálculo da duração do texto do prompt está errado.

Vamos dar uma olhada no texto do prompt corrigido em seu link:

# login and computer name                                                      
PS1='[\e[\[1;37m\]\]\u\e[\[m\]\]@\e[\[1;32m\]\]\h\e[\[m\]\]] '                  
# date, time                                                                    
PS1=$PS1'[\e[\[1;34m\]\]\D{%Y-%m-%d} \e[\[1;35m\]\]\t\e[\[m\]\]] '              
# working directory and result of last command                                  
PS1=$PS1'\e[\[1;33m\]\]\w\e[\[m\]\] \e[\[1;31m\]\]${?#0}\e[\[m\]\]\n '          
# command prompt                                                                
PS1=$PS1'\e[\[1;36m\]\]\$\e[\[m\]\] '

O problema é que \[ e \] não estão incluindo as seqüências de escape de cores inteiras:
O prompt começa com

[\e[\[1;37m\]\]... 

A sequência de escape de cores é \e[1;37m . Portanto, o caractere de escape \e e o [ estão fora. Pelo menos, o [ será contado como visível. Além disso, há dois fechamento \] - pode não causar um problema, mas é pelo menos confuso - eles não podem ser aninhados. A maneira correta de escrever é:

[\[\e[1;37m\]... 

As outras seqüências de escape de cores têm o mesmo problema.

    
por 21.08.2014 / 00:23
2

Você deve modularizar isso alguns - isso tornaria muito mais fácil rastrear:

CS='\[3[1;3' CE='m\]'
WT=${CS}7${CE} LB=${CS}6${CE} PR=${CS}5${CE} \
DB=${CS}4${CE} YL=${CS}3${CE} GN=${CS}2${CE} RD=${CS}1${CE} 
CE='\[3[m\]' CS=

Agora você faz suas coisas:

# login and computer name                                                      
PS1="[${WT}\u${CE}@${GN}\h${CE}] "

...

E assim por diante .. Você vê? É um pouco mais fácil dizer o que está acontecendo dessa maneira.

    
por 21.08.2014 / 02:03

Tags