Bash prompt coloring para Mac OS X

La meta

Estoy intentando colorear mi indicador bash en Mac OS X con la twig git (donde esté disponible).

Lo que he intentado

Con mi conocimiento limitado de bash, reconstruí el siguiente código de las búsquedas de Google y otras preguntas:

function parse_git_branch() { branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) if [[ -z "$branch" ]]; then return fi if [[ -z "$(git status -s 2>/dev/null)" ]]; then color=$'\e[1;32m' else color=$'\e[1;31m' fi echo "\[$color\] (${branch}) " } PS1="\h:\W \u\$(parse_git_branch)\[\e[0m\]\$ " 

El problema

Mientras la coloración funciona, el post contiene algunas de las secuencias de escape de parse_git_branch .

 leonidas:AYI jason\[\] (master) $ 

Además, elementos como el historial de commands (arriba) y la búsqueda recursiva (ctrl + r) arrojan caracteres adicionales.

 leonidas:AYI jason\[\] (master) $h)`re': git status 

Las preguntas

  1. ¿Cómo puedo solucionar el escape con los caracteres visibles y no visibles adecuados?
  2. ¿Debo usar tput lugar de estos códigos de color para un soporte más amplio?

El problema es que \[ \] no se respeta en los datos expandidos.

Para PROMPT_COMMAND , puede configurar la PS1 en una versión posterior a la expansión en PROMPT_COMMAND , cuyo contenido se evalúa antes de cada aviso:

 PROMPT_COMMAND='PS1="\h:\W \u$(parse_git_branch)\[\e[0m\]\\\$ "' 

Dado que los \[ \] ahora son parte del valor literal de PS1, y no se crean mediante la expansión rápida, se interpretan correctamente.

Porque pasar por todo este problema. Solo crea un .bash_profile mío es: –

 export PS1="\[\033[0;30;33m\]\w\[\e[0m\]$ " 

Debes configurar .bashrc para hacer reference a esto

 [ -r ~/.bash_profile ] && source ~/.bash_profile