summaryrefslogtreecommitdiff
path: root/.bashprompt
blob: 295a0f369c4dfd43fb496a2defd58002c87062b8 (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
# Based on the brilliant https://redandblack.io/blog/2020/bash-prompt-with-updating-time/

NEWLINE="\n"
SINGLE_SPACE=" "
PRINTING_OFF="\["
PRINTING_ON="\]"
RESTORE_CURSOR_POSITION="\e[u"
SAVE_CURSOR_POSITION="\e[s"

NON_COLOUR="$(tput sgr0)"
DEF_COLOUR="$(tput setaf 240)"
TIM_COLOUR="$(tput bold)$(tput setaf 32)"
DIR_COLOUR="$(tput bold)$(tput setaf 201)"
ERR_COLOUR="$(tput setaf 9)"
DOL_COLOUR="$(tput rev)$(tput setaf 34)"
VCS_COLOUR="$(tput setaf 214)"

HOST="\H:"
PS2_PROMPT=">"
DIRECTORY="\w"
TIMESTAMP="date +%m/%H.%M"

move_cursor_to_start_of_ps1() {
    command_rows=$(history 1 | wc -l)
    if [ "$command_rows" -gt 1 ]; then
        let vertical_movement=$command_rows+1
    else
        command=$(history 1 | sed 's/^\s*[0-9]*\s*//')
        command_length=${#command}
        ps1_prompt_length=${#PS1_PROMPT}
        let total_length=$command_length+$ps1_prompt_length
        let lines=$total_length/${COLUMNS}+1
        let vertical_movement=$lines
    fi
    tput cuu $vertical_movement
}

PS0_ELEMENTS=(
    "$SAVE_CURSOR_POSITION" "\$(move_cursor_to_start_of_ps1)"
    "(" "$TIM_COLOUR" "\$($TIMESTAMP)" "$NON_COLOUR" ")" "$RESTORE_CURSOR_POSITION"
)
PS0=$(IFS=; echo "${PS0_ELEMENTS[*]}")

set_ps1_prompt() {
    local rval=$?;

    local PS1_SYMBOL="#";
    (( $(id -u) )) && PS1_SYMBOL=\$;

    if (( $rval )); then
        local PROMPT_COLOUR="$(tput rev)$ERR_COLOUR"
        local ERROR_ELEMENTS=(
            "$PRINTING_OFF" "$ERR_COLOUR" "$PRINTING_ON"
            "<$rval>"
            "$PRINTING_OFF" "$DEF_COLOUR" "$PRINTING_ON"
        )
        local ERROR_VALUE=$(IFS=; echo "${ERROR_ELEMENTS[*]}")
    else
        local PROMPT_COLOUR="$DOL_COLOUR"
        local ERROR_VALUE=""
    fi
    PS1_ELEMENTS=(
        "(" "$PRINTING_OFF" "$DEF_COLOUR" "$PRINTING_ON" "\$($TIMESTAMP)"
        "$PRINTING_OFF" "$NON_COLOUR" "$PRINTING_ON" ")" "[" "$HOST"
        "$PRINTING_OFF" "$DIR_COLOUR" "$PRINTING_ON" "$DIRECTORY"
        "$PRINTING_OFF" "$NON_COLOUR" "$PRINTING_ON" "]"
        "$PRINTING_OFF" "$VCS_COLOUR" "$PRINTING_ON" "\$(vcs)"
        "$ERROR_VALUE"
        "$PRINTING_OFF" "$PROMPT_COLOUR" "$PRINTING_ON" "$PS1_SYMBOL"
        "$PRINTING_OFF" "$NON_COLOUR" "$PRINTING_ON" "$SINGLE_SPACE"
    )
    PS1=$(IFS=; echo "${PS1_ELEMENTS[*]}")
}

PROMPT_COMMAND=set_ps1_prompt

PS2_ELEMENTS=(
    "$PRINTING_OFF" "$PROMPT_COLOUR" "$PRINTING_ON" "$PS2_PROMPT"
    "$SINGLE_SPACE" "$PRINTING_OFF" "$NON_COLOUR" "$PRINTING_ON"
)
PS2=$(IFS=; echo "${PS2_ELEMENTS[*]}")

shopt -s histverify

PS4='[$EPOCHREALTIME]'