Как помешать выводу цветов bash

Я пытаюсь настроить bash для отображения текущей ветви git, основываясь на примере здесь , но я не могу понять, как заставить bash перестать экранировать цветовые строки. Все, что я пробую, приводит к выводу цветовых строк в строке приглашения.

Моя подсказка выглядит следующим образом:

valorin@gandalf:~/workspace/wyoa (\[\033[0;31m\]master\[\033[00m\])$

Соответствующий раздел в .bashrc:

##
# Custom Git Branch name in prompt
##
function git_prompt {
    if !  git rev-parse --git-dir > /dev/null 2>&1; then
        return 0
    fi

    git_branch=$(git branch 2>/dev/null| sed -n '/^\*/s/^\* //p')

    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        if git diff --quiet 2>/dev/null >&2; then
            echo " (\[\033[0;31m\]$git_branch\[\033[00m\])"
        else
            echo " (\[\033[0;33m\]$git_branch\[\033[00m\])"
        fi
    else
        if git diff --quiet 2>/dev/null >&2; then
            echo " ($git_branch)"
        else
            echo "($git_branch*)"
        fi
    fi
}


if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(git_prompt)$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(git_prompt)\$ '
fi

Любая помощь будет оценена.

3
задан 14 July 2012 в 05:07

1 ответ

В приглашении bash не может быть функции, которая выводит как текст, так и цвет. Все, что выводит функция, воспринимается буквально. Я предлагаю пойти по-другому.

Во-первых, то, что пытается сделать приглашение, - это проверить, находится ли ты в git-дереве, и, если так, добавь в приглашение цветную (ветвь). Вместо того, чтобы проверять каждый раз, когда приглашение выводится, вам действительно нужно выполнять эту проверку всякий раз, когда вы меняете каталог, поэтому мы можем переопределить только три команды, которые могут изменить каталог, чтобы установить для переменной git_branch имя текущей ветви, если оно есть.

cd() {
    builtin cd "$@" || return
    git_branch=$(git branch 2>/dev/null|sed -n '/^[*] /s///p') || true
}
pushd() {
    builtin pushd "$@" || return
    git_branch=$(git branch 2>/dev/null|sed -n '/^[*] /s///p') || true
}
popd() {
    builtin popd "$@" || return
    git_branch=$(git branch 2>/dev/null|sed -n '/^[*] /s///p') || true
}

Далее, проверьте, является ли stderr терминалом, и установите цвета с помощью tput

user_color= dir_color= git_color= reset=
if [[ -t 2 ]]; then
    user_color=$(tput setaf 2; tput bold)
    dir_color=$(tput setaf 4; tput bold)
    reset=$(tput sgr0)
fi

И функции, которая выводит один из двух цветов в зависимости от того, есть изменения или нет

_git_color() {
    [[ $git_branch && -t 2 ]] || return
    if git diff --quiet >/dev/null 2>&1; then
        tput setaf 1
    else
        tput setaf 3
    fi
}

Теперь, составив подсказку. Это немного громоздко, поскольку некоторые переменные должны быть расширены при присваивании (сейчас), в то время как некоторые должны быть расширены при выводе приглашения, поэтому нам нужно чередовать кавычки, плюс они становятся довольно длинными. Использование массива для этого должно помочь сохранить обзор

prompt=(
    "\[$user_color\]" '\u@\h' "\[$reset\]"
    : "\[$dir_color\]" '\w' "\[$reset\]"

    '${git_branch:+ (}'
    '\[$(_git_color)\]' '$git_branch' "\[$reset\]"  
    '${git_branch:+)}'

    '\$ '
)

Я здесь опускаю материал debian_chroot, он мне сам никогда не нужен, вы, конечно, можете добавить это, если хотите. Наконец, присоединитесь к массиву подсказок и очистите переменные, которые нам больше не нужны.

printf -v PS1 %s "${prompt[@]}"
unset user_color dir_color reset prompt
0
ответ дан 14 July 2012 в 05:07

Другие вопросы по тегам:

Похожие вопросы: