#!/bin/bash # # set_prompt - define useful constants and load bash prompts which use them # shellcheck disable=SC2034 function set_prompt() { local STYLES_DIR="${BASH_SOURCE%/*}/styles" if [ "x$1" = "x" ]; then echo "Available prompts:"; for file in "$STYLES_DIR"/*; do grep -q '^[ \t]*PS1' "$file" && echo " $(basename "$file")"; done return 0 fi local STYLE_FILE="$STYLES_DIR/$1" if [ ! -f "$STYLE_FILE" ]; then echo "Cannot find prompt style '$(basename "$STYLE_FILE")'." 1>&2 return 1 fi # ANSI Escape Color # http://www.termsys.demon.co.uk/vtansi.htm # http://ascii-table.com/ansi-escape-sequences.php # http://www2.gar.no/glinkj/help/cmds/ansa.htm # http://vt100.net/docs/tp83/appendixh.html local ATTR_RESET=0 local BOLD=1 local DIM=2 local UNDERSCORE=4 local BLINK=5 local REVERSE=7 local HIDDEN=8 local FG_BLACK=30 local FG_RED=31 local FG_GREEN=32 local FG_YELLOW=33 local FG_BLUE=34 local FG_MAGENTA=35 local FG_CYAN=36 local FG_WHITE=37 local FG_NULL=00 local BG_BLACK=40 local BG_RED=41 local BG_GREEN=42 local BG_YELLOW=43 local BG_BLUE=44 local BG_MAGENTA=45 local BG_CYAN=46 local BG_WHITE=47 local BG_NULL=00 # ANSI Escape Commands # # NOTE: # # Bash recommends enclosing non-printing characters in a delimited sequence. # # From the bash(1) man page: # # \[ begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt # \] end a sequence of non-printing characters # local ESC='\033' local RESET="\\[${ESC}[${ATTR_RESET}m\\]" # Shortcuts for Colored Text (Foreground Only) # NORMAL TEXT local BLACK="\\[${ESC}[${ATTR_RESET};${FG_BLACK}m\\]" local RED="\\[${ESC}[${ATTR_RESET};${FG_RED}m\\]" local GREEN="\\[${ESC}[${ATTR_RESET};${FG_GREEN}m\\]" local YELLOW="\\[${ESC}[${ATTR_RESET};${FG_YELLOW}m\\]" local BLUE="\\[${ESC}[${ATTR_RESET};${FG_BLUE}m\\]" local MAGENTA="\\[${ESC}[${ATTR_RESET};${FG_MAGENTA}m\\]" local CYAN="\\[${ESC}[${ATTR_RESET};${FG_CYAN}m\\]" local WHITE="\\[${ESC}[${ATTR_RESET};${FG_WHITE}m\\]" # BOLD TEXT local BOLD_BLACK="\\[${ESC}[${BOLD};${FG_BLACK}m\\]" local BOLD_RED="\\[${ESC}[${BOLD};${FG_RED}m\\]" local BOLD_GREEN="\\[${ESC}[${BOLD};${FG_GREEN}m\\]" local BOLD_YELLOW="\\[${ESC}[${BOLD};${FG_YELLOW}m\\]" local BOLD_BLUE="\\[${ESC}[${BOLD};${FG_BLUE}m\\]" local BOLD_MAGENTA="\\[${ESC}[${BOLD};${FG_MAGENTA}m\\]" local BOLD_CYAN="\\[${ESC}[${BOLD};${FG_CYAN}m\\]" local BOLD_WHITE="\\[${ESC}[${BOLD};${FG_WHITE}m\\]" # Some shortcuts to switch charset mode # https://en.wikipedia.org/wiki/Box-drawing_characters#Unix.2C_CP.2FM.2C_BBS # From the console_codes(4) man page: # # ESC ( B Select default (ISO 8859-1 mapping) # ESC ( 0 Select VT100 graphics mapping local MODE_DEFAULT='\[\033(B\]' local MODE_GRAPHIC='\[\033(0\]' # The linux tty terminal does not display the DEC graphic set when it is in # UTF-8 mode (see also unicode_start and kbd_mode) so disable UTF-8 when # entering the GRAPHIC mode and re-enable it in DEFAULT mode. # # From the console_codes(4) man page: # # ESC % @ Select default (ISO 646 / ISO 8859-1) # ESC % G Select UTF-8 # case $TERM in linux*) # TODO: check if the terminal is actually in UTF-8 mode, maybe using # kbd_mode. MODE_DEFAULT='\[\033(B\033%G\]' MODE_GRAPHIC='\[\033%@\033(0\]' # If the variables from above were used in a printf format string (e.g. # inside the __git_ps1 argument), '%G' and '%@' would be wrongly # interpreted as conversion specifiers. # # Define alternative variables to use with printf, to ensure that # a literal '%' is produced eventually in the output of printf. MODE_DEFAULT_QUOTED='\[\033(B\033%%G\]' MODE_GRAPHIC_QUOTED='\[\033%%@\033(0\]' ;; *) local MODE_DEFAULT_QUOTED="$MODE_DEFAULT" local MODE_GRAPHIC_QUOTED="$MODE_GRAPHIC" ;; esac # VT100 Line Drawing Set # http://vt100.net/docs/vt102-ug/table5-15.html # # Also called DEC Special Graphics set # https://en.wikipedia.org/wiki/DEC_Special_Graphics local UPPER_LEFT_CORNER="l" local UPPER_RIGHT_CORNER="k" local LOWER_LEFT_CORNER="m" local LOWER_RIGHT_CORNER="j" local CROSS="n" local HORIZ_LINE="q" local VERT_LINE="x" local UPPER_T="v" local LOWER_T="w" local RIGHT_T="t" local LEFT_T="u" local CENTERED_DOT="~" local SOLID_BLOCK="a" local TRANSPARENT_BLOCK="_" # An attempt to reset the charset attributes. # http://www.in-ulm.de/~mascheck/various/alternate_charset/ # # ESC (B Select G0 Character Set: United States (USASCII) # ESC )0 Select G1 Character Set: Special Character and Line Drawing Set # O ( Ctrl-O ) Switch to Standard Character Set # ESC [?5l DEC Private Mode Reset: Normal Video # ESC 7 Save Cursor # ESC [r weird (actually 'ESC [0;0r' ? Set Scrolling Region [top;bottom] ) # ESC 8 Restore Cursor local RESET_CHARSET='\[\033(B\033)0\017\033[?5l\0337\033[r\0338\]' # Add the current user@host : pwd to the xterm title bar case $TERM in xterm*|rxvt*|Eterm|aterm|kterm|gnome*|interix) PROMPT_COMMAND='export ERR=$?; true; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/\~}\007"' ;; screen*) PROMPT_COMMAND='export ERR=$?; true; echo -ne "\033k${USER}@${HOSTNAME%%.*}:${PWD/$HOME/\~}\033\\"' ;; *) PROMPT_COMMAND='export ERR=$?; true' ;; esac # shellcheck source=/dev/null source "$STYLE_FILE" export PS1 PROMPT_COMMAND }