summaryrefslogtreecommitdiff
path: root/.bashprompt
blob: 49869fbaaffdf5ca7346a38886cec05e4028f40d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
__set-title ()
{
    local title
    local path=$(git root 2> /dev/null)

    if [ ${path} ]
    then
        title=$(basename ${path})
    else
        title="${USER}:${PWD/~/\~}"
    fi

    echo -ne "\033]2;${title}\007"
}

# In order to know how much space PS1 takes, Bash needs us to delimit
# non-printing characters with \[ and \].
__start-nonprinting ()
{
    if [ ${BUILDING_PS1} ]
    then
        echo -en '\['
    fi
}

__end-nonprinting ()
{
    if [ ${BUILDING_PS1} ]
    then
        echo -en '\]'
    fi
}

__fontify ()
{
    local -A codes
    codes[red]='31'
    codes[green]='32'
    codes[blue]='34'
    codes[white]='37'
    codes[bold]='1'
    codes[dim]='2'
    codes[clear]='0'

    local text=$1
    shift

    output=$(__start-nonprinting)
    output+='\033['

    for ((i=1; i<=$#; i++))
    do
        output+=${codes[${!i}]}

        if ((i<$#))
        then
            output+=';'
        else
            output+='m'
        fi
    done

    output+=$(__end-nonprinting)

    output+="${text}"
    output+=$(__start-nonprinting)
    output+='\033[0m'
    output+=$(__end-nonprinting)

    echo -en "${output}"
}

__set-prompt ()
{
    BUILDING_PS1=t

    local last_status=$1

    PS1=''

    if [ ${last_status} -ne 0 ]
    then
        PS1+=$(__fontify "${last_status} " bold red) 
    fi

    PS1+=$(__fontify '\u' green)

    if [ ${PS1_SHOWHOSTNAME} ]
    then
        PS1+=$(__fontify '@\H' dim green)
    fi

    PS1+=$(__fontify : bold white)
    PS1+=$(__fontify '\w' bold blue)
    PS1+=$(__fontify "$(__git_ps1 '(%s)')" red)
    PS1+=$(__fontify '\$' bold white)
    PS1+=' '

    BUILDING_PS1=
}

__draw-rule ()
{
    rule=''
    for ((i=0; i<COLUMNS; i++))
    do
        rule+=—
    done
    __fontify ${rule} dim
}

__refresh-terminal ()
{
    local last_status=$?

    __set-title
    __set-prompt ${last_status}
    __draw-rule
}


. /usr/lib/git-core/git-sh-prompt
GIT_PS1_SHOWDIRTYSTATE=t
GIT_PS1_SHOWUPSTREAM=auto

export PROMPT_COMMAND=__refresh-terminal