Раскраска подсказок bash для Mac OS X

Цель

Я пытаюсь раскрасить свое приглашение bash в Mac OS X с помощью ветки git (если доступно).

Что я пробовал

Обладая ограниченными знаниями о bash, я собрал следующий код из результатов поиска Google и других вопросов:

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\]\$ "

Эта проблема

Пока окраска работает, приглашение содержит некоторые escape-последовательности из parse_git_branch.

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

Кроме того, такие вещи, как история команд (вверх) и рекурсивный поиск (ctrl + r), дают дополнительные символы.

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

Вопросы

  1. Как я могу исправить экранирование правильными видимыми и невидимыми символами.
  2. Должен ли я использовать tput вместо этих цветовых кодов для более широкой поддержки?

person Jason McCreary    schedule 30.12.2013    source источник
comment
(1) перейти на zsh, (2) получить oh-my-zsh, (3) выберите тему, (4) никогда не оглядывайтесь назад!   -  person Oliver Charlesworth    schedule 30.12.2013
comment
@Oli Charlesworth, спасибо за предложение. Но хочу решить текущую проблему.   -  person Jason McCreary    schedule 30.12.2013
comment
@Kevin, не могли бы вы предоставить дополнительную информацию - где, почему?   -  person Jason McCreary    schedule 30.12.2013
comment
Когда вы устанавливаете PS1="...$(parse_git_branch)...", он оценивается точно один раз при поиске файла. Вам нужно PS1='...', чтобы он оценивался каждый раз.   -  person Kevin    schedule 30.12.2013
comment
@ Кевин, у меня проблема не в этом. Он оценивается каждый раз.   -  person Jason McCreary    schedule 30.12.2013


Ответы (2)


Зачем идти на все эти хлопоты. Просто создайте .bash_profile Шахта: -

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

Вы должны установить .bashrc, чтобы ссылаться на это

[ -r ~/.bash_profile ] && source ~/.bash_profile
person Milliways    schedule 30.12.2013
comment
Смотрите мое обновление, я пытаюсь включить ветку git (если есть). - person Jason McCreary; 30.12.2013

Проблема в том, что \[ \] не соблюдается в расширенных данных.

Чтобы обойти это, вы можете установить для PS1 версию самого себя после расширения в PROMPT_COMMAND, содержимое которой оценивается перед каждым запросом:

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

Поскольку \[ \] теперь являются частью буквального значения PS1 и не создаются расширением подсказки, они интерпретируются правильно.

person that other guy    schedule 30.12.2013
comment
Ага. Более простой пример: ps1() { echo '\h:\W$ '; }; PS1='$(ps1)'; Ваше приглашение будет буквально \h:\W$ . - person Mark Reed; 30.12.2013
comment
Хотя я попробую это сделать, мне это покажется хакерским. Должен быть способ исправить то, что у меня есть. - person Jason McCreary; 30.12.2013