2008-12-04 16 views
24

Aquí está mi la variable PS1:PS1 ajuste de líneas con problemas colores

PS1='\u:\W$(__git_ps1 "\e[32m\][%s]\e[0m\]")$ ' 

Funciona muy bien para recoger a mi rama Git, pero tiene el efecto secundario indeseable de envolver las líneas cuando los colores están activos, por lo que se superponen cuando usa comandos largos.

¿Alguien con habilidades mágicas de PS1 me puede ayudar a solucionar esto?

Respuesta

39

Lo tengo, es necesario para escapar de los colores correctamente.

Fix:

PS1='\u:\W$(__git_ps1 "\[\e[32m\][%s]\[\e[0m\]")$ ' 
+0

Gracias, que hizo que mi día! – Viktiglemma

+5

Y para aquellos demasiado flojos como para hacer un diff, los escapes del terminal deben estar rodeados por '\ [' '\]' para que bash pueda contar correctamente los caracteres de impresión al principio de la línea. http://manpages.ubuntu.com/manpages/precise/en/man1/bash.1.html#contenttoc26 – alberge

+0

Aupajo, estoy teniendo un problema similar, usando una PS1 generada. No sé lo suficiente para ver lo que no se está escapando correctamente. ¿Alguna sugerencia? Mi comando es: 'export PS1 =" \ [\ e [0; 40m \] \ h: \ W \ u \ 033 [0; 32m \ $ (parse_git_branch) \ [\ e [0m \] $ "' – karl

16

Puedo sugerir el método siguiente para los colores en Bash, hace que el código sea más legible y mucho más difícil para que pierda un escape o dos.

poner lo siguiente en su ~/.bashrc

BLACK=$(tput setaf 0) 
RED=$(tput setaf 1) 
GREEN=$(tput setaf 2) 
LIME_YELLOW=$(tput setaf 190) 
YELLOW=$(tput setaf 3) 
POWDER_BLUE=$(tput setaf 153) 
BLUE=$(tput setaf 4) 
MAGENTA=$(tput setaf 5) 
CYAN=$(tput setaf 6) 
WHITE=$(tput setaf 7) 
BRIGHT=$(tput bold) 
NORMAL=$(tput sgr0) 
BLINK=$(tput blink) 
REVERSE=$(tput smso) 
UNDERLINE=$(tput smul) 

Un PS1 muestra (o en realidad cualquier cosa que pueda imprimirse en la pantalla) sería:

PS1="\[${WHITE}\](\[${YELLOW}\]\[email protected]\h\[${WHITE}\])\[${NORMAL}\]$ " 

Sólo es necesario poner \ [\ ] alrededor de las palabras de color.

Si usted tiene un terminal de 256 colores, se puede experimentar con otros valores numéricos a 'tput setaf' todo el camino hasta 255.

+0

Oh, eso es simple, claro e impresionante. Ten un representante, en la casa. – Aupajo

1

Estas son las funciones de color que utilizo regularmente ... Escrito ellos años Hace mucho tiempo y se han acostumbrado tanto a ellos que son parte habitual de mis guiones. Simplemente inserte este bloque de código en su archivo .bashrc, inicie una nueva sesión y ¡ya está listo!

utilizo estas tan coloridos/reemplazos printf estilo:

## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ [ Aesthir's Color Functions ] ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
Normal() { printf '\e[m'"$*"; }     ; Tblack() { printf '\e[0;30m'"$*"'\e[m'; } 
TNormal() { printf '\e[m'"$*"; }     ; Tred() { printf '\e[0;31m'"$*"'\e[m'; } 
Bold() { printf '\e[1m'"$*"'\e[m'; }    ; Tgreen() { printf '\e[0;32m'"$*"'\e[m'; } 
TBold() { printf '\e[1m'"$*"'\e[m'; }   ; Tbrown() { printf '\e[0;33m'"$*"'\e[m'; } 
Underline() { printf '\e[4m'"$*"'\e[m'; }  ; Tyellow() { printf '\e[0;33m'"$*"'\e[m'; } 
TUnderline() { printf '\e[4m'"$*"'\e[m'; }  ; Tblue() { printf '\e[0;34m'"$*"'\e[m'; } 
Flash() { printf '\e[5m'"$*"'\e[m'; }   ; Tmagenta() { printf '\e[0;35m'"$*"'\e[m'; } 
TFlash() { printf '\e[5m'"$*"'\e[m'; }   ; Tpurple() { printf '\e[0;35m'"$*"'\e[m'; } 
Invert() { printf '\e[7m'"$*"'\e[m'; }   ; Taqua() { printf '\e[0;36m'"$*"'\e[m'; } 
TInvert() { printf '\e[7m'"$*"'\e[m'; }   ; Tcyan() { printf '\e[0;36m'"$*"'\e[m'; } 
Invisible() { printf '\e[8m'"$*"'\e[m'; }  ; Tgrey() { printf '\e[0;37m'"$*"'\e[m'; } 
TInvisible() { printf '\e[8m'"$*"'\e[m'; }  ; Twhite() { printf '\e[0;37m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ Bold Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞∞∞∞∞ Underlined Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
TblackB() { printf '\e[1;30m'"$*"'\e[m'; }  ; TblackU() { printf '\e[4;30m'"$*"'\e[m'; } 
TgreyB() { printf '\e[1;30m'"$*"'\e[m'; }  ; TredU() { printf '\e[4;31m'"$*"'\e[m'; } 
TredB() { printf '\e[1;31m'"$*"'\e[m'; }   ; TgreenU() { printf '\e[4;32m'"$*"'\e[m'; } 
TgreenB() { printf '\e[1;32m'"$*"'\e[m'; }  ; TbrownU() { printf '\e[4;33m'"$*"'\e[m'; } 
TbrownB() { printf '\e[1;33m'"$*"'\e[m'; }  ; TyellowU() { printf '\e[4;33m'"$*"'\e[m'; } 
TyellowB() { printf '\e[1;33m'"$*"'\e[m'; }  ; TblueU() { printf '\e[4;34m'"$*"'\e[m'; } 
TblueB() { printf '\e[1;34m'"$*"'\e[m'; }  ; TmagentaU() { printf '\e[4;35m'"$*"'\e[m'; } 
TmagentaB() { printf '\e[1;35m'"$*"'\e[m'; }  ; TpurpleU() { printf '\e[4;35m'"$*"'\e[m'; } 
TpurpleB() { printf '\e[1;35m'"$*"'\e[m'; }  ; TaquaU() { printf '\e[4;36m'"$*"'\e[m'; } 
TaquaB() { printf '\e[1;36m'"$*"'\e[m'; }  ; TcyanU() { printf '\e[4;36m'"$*"'\e[m'; } 
TcyanB() { printf '\e[1;36m'"$*"'\e[m'; }  ; TgreyU() { printf '\e[4;37m'"$*"'\e[m'; } 
TwhiteB() { printf '\e[1;37m'"$*"'\e[m'; }  ; TwhiteU() { printf '\e[4;37m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞ Flashing Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞∞∞∞∞∞ Inverted Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
TblackF() { printf '\e[5;30m'"$*"'\e[m'; }  ; TblackI() { printf '\e[7;40m'"$*"'\e[m'; } 
TredF() { printf '\e[5;31m'"$*"'\e[m'; }   ; TredI() { printf '\e[7;41m'"$*"'\e[m'; } 
TgreenF() { printf '\e[5;32m'"$*"'\e[m'; }  ; TgreenI() { printf '\e[7;42m'"$*"'\e[m'; } 
TbrownF() { printf '\e[5;33m'"$*"'\e[m'; }  ; TbrownI() { printf '\e[7;43m'"$*"'\e[m'; } 
TyellowF() { printf '\e[5;33m'"$*"'\e[m'; }  ; TyellowI() { printf '\e[7;43m'"$*"'\e[m'; } 
TblueF() { printf '\e[5;34m'"$*"'\e[m'; }  ; TblueI() { printf '\e[7;44m'"$*"'\e[m'; } 
TmagentaF() { printf '\e[5;35m'"$*"'\e[m'; }  ; TmagentaI() { printf '\e[7;45m'"$*"'\e[m'; } 
TpurpleF() { printf '\e[5;35m'"$*"'\e[m'; }  ; TpurpleI() { printf '\e[7;45m'"$*"'\e[m'; } 
TaquaF() { printf '\e[5;36m'"$*"'\e[m'; }  ; TaquaI() { printf '\e[7;46m'"$*"'\e[m'; } 
TcyanF() { printf '\e[5;36m'"$*"'\e[m'; }  ; TcyanI() { printf '\e[7;46m'"$*"'\e[m'; } 
TgreyF() { printf '\e[5;37m'"$*"'\e[m'; }  ; TgreyI() { printf '\e[7;47m'"$*"'\e[m'; } 
TwhiteF() { printf '\e[5;37m'"$*"'\e[m'; }  ; TwhiteI() { printf '\e[7;47m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞ Invisible Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞ Plain Text on Color Background ∞∞∞∞∞∞∞∞ ## 
TblackV() { printf '\e[8;30m'"$*"'\e[m'; }  ; Bblack() { printf '\e[m'"$*"'\e[m'; } 
TredV() { printf '\e[8;31m'"$*"'\e[m'; }   ; Bred() { printf '\e[0;41m'"$*"'\e[m'; } 
TgreenV() { printf '\e[8;32m'"$*"'\e[m'; }  ; Bgreen() { printf '\e[0;42m'"$*"'\e[m'; } 
TbrownV() { printf '\e[8;33m'"$*"'\e[m'; }  ; Bbrown() { printf '\e[0;43m'"$*"'\e[m'; } 
TyellowV() { printf '\e[8;33m'"$*"'\e[m'; }  ; Byellow() { printf '\e[0;43m'"$*"'\e[m'; } 
TblueV() { printf '\e[8;34m'"$*"'\e[m'; }  ; Bblue() { printf '\e[0;44m'"$*"'\e[m'; } 
TmagentaV() { printf '\e[8;35m'"$*"'\e[m'; }  ; Bmagenta() { printf '\e[0;45m'"$*"'\e[m'; } 
TpurpleV() { printf '\e[8;35m'"$*"'\e[m'; }  ; Bpurple() { printf '\e[0;45m'"$*"'\e[m'; } 
TaquaV() { printf '\e[8;36m'"$*"'\e[m'; }  ; Baqua() { printf '\e[0;46m'"$*"'\e[m'; } 
TcyanV() { printf '\e[8;36m'"$*"'\e[m'; }  ; Bcyan() { printf '\e[0;46m'"$*"'\e[m'; } 
TgreyV() { printf '\e[8;37m'"$*"'\e[m'; }  ; Bgrey() { printf '\e[0;47m'"$*"'\e[m'; } 
TwhiteV() { printf '\e[8;37m'"$*"'\e[m'; }  ; Bwhite() { printf '\e[0;47m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞ Bold Text on Color Background ∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞ Underlined Text on Color Background ∞∞∞∞∞ ## 
BblackB() { printf '\e[1;40m'"$*"'\e[m'; }  ; BblackU() { printf '\e[4;40m'"$*"'\e[m'; } 
BredB() { printf '\e[1;41m'"$*"'\e[m'; }   ; BredU() { printf '\e[4;41m'"$*"'\e[m'; } 
BgreenB() { printf '\e[1;42m'"$*"'\e[m'; }  ; BgreenU() { printf '\e[4;42m'"$*"'\e[m'; } 
BbrownB() { printf '\e[1;43m'"$*"'\e[m'; }  ; BbrownU() { printf '\e[4;43m'"$*"'\e[m'; } 
ByellowB() { printf '\e[1;43m'"$*"'\e[m'; }  ; ByellowU() { printf '\e[4;43m'"$*"'\e[m'; } 
BblueB() { printf '\e[1;44m'"$*"'\e[m'; }  ; BblueU() { printf '\e[4;44m'"$*"'\e[m'; } 
BmagentaB() { printf '\e[1;45m'"$*"'\e[m'; }  ; BmagentaU() { printf '\e[4;45m'"$*"'\e[m'; } 
BpurpleB() { printf '\e[1;45m'"$*"'\e[m'; }  ; BpurpleU() { printf '\e[4;45m'"$*"'\e[m'; } 
BaquaB() { printf '\e[1;46m'"$*"'\e[m'; }  ; BaquaU() { printf '\e[4;46m'"$*"'\e[m'; } 
BcyanB() { printf '\e[1;46m'"$*"'\e[m'; }  ; BcyanU() { printf '\e[4;46m'"$*"'\e[m'; } 
BgreyB() { printf '\e[1;47m'"$*"'\e[m'; }  ; BgreyU() { printf '\e[4;47m'"$*"'\e[m'; } 
BwhiteB() { printf '\e[1;47m'"$*"'\e[m'; }  ; BwhiteU() { printf '\e[4;47m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞ Flashing Text on Color Background ∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞ Inverted Text on Color Background ∞∞∞∞∞∞ ## 
BblackF() { printf '\e[5;40m'"$*"'\e[m'; }  ; BblackI() { printf '\e[7;30m'"$*"'\e[m'; } 
BredF() { printf '\e[5;41m'"$*"'\e[m'; }   ; BredI() { printf '\e[7;31m'"$*"'\e[m'; } 
BgreenF() { printf '\e[5;42m'"$*"'\e[m'; }  ; BgreenI() { printf '\e[7;32m'"$*"'\e[m'; } 
BbrownF() { printf '\e[5;43m'"$*"'\e[m'; }  ; BbrownI() { printf '\e[7;33m'"$*"'\e[m'; } 
ByellowF() { printf '\e[5;43m'"$*"'\e[m'; }  ; ByellowI() { printf '\e[7;33m'"$*"'\e[m'; } 
BblueF() { printf '\e[5;44m'"$*"'\e[m'; }  ; BblueI() { printf '\e[7;34m'"$*"'\e[m'; } 
BmagentaF() { printf '\e[5;45m'"$*"'\e[m'; }  ; BmagentaI() { printf '\e[7;35m'"$*"'\e[m'; } 
BpurpleF() { printf '\e[5;45m'"$*"'\e[m'; }  ; BpurpleI() { printf '\e[7;35m'"$*"'\e[m'; } 
BaquaF() { printf '\e[5;46m'"$*"'\e[m'; }  ; BaquaI() { printf '\e[7;36m'"$*"'\e[m'; } 
BcyanF() { printf '\e[5;46m'"$*"'\e[m'; }  ; BcyanI() { printf '\e[7;36m'"$*"'\e[m'; } 
BgreyF() { printf '\e[5;47m'"$*"'\e[m'; }  ; BgreyI() { printf '\e[7;37m'"$*"'\e[m'; } 
BwhiteF() { printf '\e[5;47m'"$*"'\e[m'; }  ; BwhiteI() { printf '\e[7;37m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞ Invisible Text on Color Background ∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ Color Code Notes ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
BblackV() { printf '\e[8;40m'"$*"'\e[m'; }  ## Unless I missed something or made a mistake, I ## 
BredV() { printf '\e[8;41m'"$*"'\e[m'; }  ## calculate a total of 7681 different color codes, ## 
BgreenV() { printf '\e[8;42m'"$*"'\e[m'; }  ## none of which produce a duplicate result.  ## 
BbrownV() { printf '\e[8;43m'"$*"'\e[m'; }  ##      These will be fine for now. ## 
ByellowV() { printf '\e[8;43m'"$*"'\e[m'; } 
BblueV() { printf '\e[8;44m'"$*"'\e[m'; } 
BmagentaV() { printf '\e[8;45m'"$*"'\e[m'; } 
BpurpleV() { printf '\e[8;45m'"$*"'\e[m'; } 
BaquaV() { printf '\e[8;46m'"$*"'\e[m'; } 
BcyanV() { printf '\e[8;46m'"$*"'\e[m'; } 
BgreyV() { printf '\e[8;47m'"$*"'\e[m'; } 
BwhiteV() { printf '\e[8;47m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
``

La única cosa a tener en cuenta es cuando se quiere una señal % por ciento o una barra invertida \, es necesario doblar hacia arriba en el interior:
gustan: printf "$(Tblue "%%s")\n" 'hi'
pero no para Tblue "%s\n" 'hi'
o printf "$(Tblue "%s" 'hi')\n"

Dado que estos uso printf, puede hacer cosas como:

printf "hi $(Tred there) man $(BaquaI "%c" '!') $(Bold 'This \\t is %%s') %s\n" "$(BgreenB 'super')" "$(Bblue mega Colorful)"
o en un eco:
echo "hi $(Tred there) man $(BaquaI "%c" '!') $(Bold 'This \\t is %s' "$(BblackB 'super')") $(Bblue mega Colorful)"
Un ejemplo más útil:
printf "\t%s Volume \"%s\" is not connected.\n" "$(TwhiteB [)$(TredB Error)$(TwhiteB \]:)" "$(Tbrown $Volume)"
o con otros comandos:
eval "echo 'This is OSX' | sed 's:OSX:$(Invert [)$(TaquaF OSX)$(Invert ]):'"
o algo con un poco más ostentoso:
find . -exec stat -f "Name: $(Tbrown %%N)%t%t$(Tpurple "->")%tPermissions: $(Tgreen %%Sp)" {} \;

¡Usa tu imaginación! Siéntete libre de usar todo esto ... lo único que pregunto es si alguien por ahí escribe más de ellos, los mezcla, los combina, como TcyanBgreenUI, o crea tus propios nombres ... ¿puedes publicarlos por mí y por favor? déjame saber acerca de la publicación? o envíelos por correo electrónico al [email protected]. Soy demasiado vago para escribir todas las posibilidades de.

¡Disfrútalo!

- Aesthir

+1

Gracias por compartir este increíble trabajo. Desafortunadamente tiene el mismo problema que el original de OP, que es que el indicador Bash necesita específicamente las secuencias '\ [' y '\]' para calcular la longitud correcta de la cadena. Lamentablemente, no he podido encontrar la forma de proporcionar esas secuencias correctamente desde una declaración printf. –

+0

Ah, está bien, finalmente encontré una forma de usar funciones como estas con las secuencias de escape correctas para un símbolo del sistema. En lugar de tratar de encontrar una sola cadena para $ PS1 que siempre funcione, definí una función que reconstruye el aviso cada vez, y lo agregué a $ PROMPT_COMMAND. por ejemplo: 'TredB() {echo -n" \ [\ e [1; 31m \] $ * \ [\ e [m \] "; } ' ' build_prompt() {PS1 = "$ (TredB \\ w) #"; } ' ' PROMPT_COMMAND = "$ {PROMPT_COMMAND} build_prompt;" ' –

Cuestiones relacionadas