123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- #!/bin/bash
-
- ######################################################
- ### things to do AFTER host/user-specific settings ###
- ######################################################
-
- #shellcheck disable=2120
- __bashum__lastrv() {
- local rvfile # path to return value cache file
- local lastrv # actual last return value
- local do_rm # true if we should remove the cache
- rvfile="$RV_TMP/$$.lastrv"
- lastrv="$(cat "$rvfile")"
- do_rm=false
- test "$1" == "-r" && do_rm=true
- if [ "0$lastrv" -gt 0 ];
- then
- echo "!$lastrv!"
- else
- echo ""
- fi
- $do_rm && rm -f "$rvfile"
- }
-
- __bashum__save_rv() {
- local rvfile="$RV_TMP/$$.lastrv"
- [ -w "${rvfile%/*}" ] && echo "$1" > "$rvfile"
- }
-
- __bashum__task_context() {
- $BASHUM_TASK_CTX || return 0
- local ctx # TaskWarrior context
- type -t task >/dev/null || return 1
- ctx=$(task _get rc.context)
- test -n "$ctx" || return
- echo -n "|$ctx"
- }
-
- #shellcheck disable=SC2154 disable=2016
- __bashum__mkps1() {
- # these functions must be already defined by ~/.bash/user/*.bashrc
- # and ~/.bash/host/*.bashrc
- test -n "$SSH_CONNECTION" \
- && echo -n "$(__bashum__mkps1user)" # username only when on ssh
- echo -n "$BASHUM_PS_COLOR_LWHITE@" # nice shiny at sign
- echo -n "$(__bashum__mkps1host)" # hostname colored per host
- echo -n "$BASHUM_PS_COLOR_LYELLOW" #\
- echo -n '$(__bashum__task_context)' # > taskwarrior's context
- echo -n "$BASHUM_PS_COLOR_NORMAL" #/
- echo -n "$BASHUM_PS_COLOR_LWHITE:" # nice shiny colon
- echo -n "$BASHUM_PS_COLOR_BLUE\w$BASHUM_PS_COLOR_NORMAL" # current workdir
- echo -n "$BASHUM_PS_COLOR_GREEN" #\
- echo -n '$(__git_ps1 "(%s)")' # > git's PS1
- echo -n "$BASHUM_PS_COLOR_NORMAL" #/
- echo -n "$BASHUM_PS_COLOR_LRED" #\
- echo -n '$(__bashum__lastrv -r)' # > last exit status (nothing if zero)
- echo -n "$BASHUM_PS_COLOR_NORMAL" #/
- echo '$ ' # obligatory dollar
- }
-
- #shellcheck disable=SC2154
- __bashum__mkps2() {
- echo "$BASHUM_PS_COLOR_LWHITE·$BASHUM_PS_COLOR_BLUE>$BASHUM_PS_COLOR_YELLOW>$BASHUM_PS_COLOR_WHITE>$BASHUM_PS_COLOR_NORMAL "
- }
-
- # and use to assemble own PS1
- PS1=$(__bashum__mkps1)
- PS2=$(__bashum__mkps2)
-
-
- __bashum__set_title() {
- #
- # Show the currently running command in the terminal title:
- #
- # http://www.davidpashley.com/articles/xterm-titles-with-bash.html
- #
- case "$BASH_COMMAND" in
- *"\033]"0*)
- # The command is trying to set the title bar as well;
- # this is most likely the execution of $PROMPT_COMMAND.
- # In any case nested escapes confuse the terminal, so don't
- # output them.
- ;;
- "")
- echo -ne "\033]0;$(__bashum__mkicon) "
- echo -n "$(__bashum__lastrv)$(__bashum__mkhostid)$(__bashum__wdir normal)\$"
- echo -ne "\007"
- ;;
- *)
- echo -ne "\033]0;$(__bashum__mkicon) "
- echo -n "${BASH_COMMAND} ($(__bashum__mkhostid)$(__bashum__wdir normal))"
- echo -ne "\007"
- ;;
- esac
- }
-
- __bashum__wdir() {
- #
- # Create abbreviated form of workdir
- #
- local mode=${1:-normal}
- case $mode:$PWD in
- shrinky:*) __bashum__shrinkypath "$PWD" ;;
- normal:*) echo "${PWD/$HOME/\~}" ;;
- short:$HOME) echo "~" ;;
- short:$HOME/??????????) echo "${PWD/$HOME/\~}" ;;
- short:$HOME/*/*) echo "…${PWD##*/}" ;;
- short:$HOME/*) echo "${PWD/$HOME/\~}" ;;
- short:*) echo "$PWD" ;;
- esac
- }
-
- __bashum__shrinkypath() {
- #
- # Convert path $1 to small path
- #
- local path=$1
- case $path in
- $HOME) echo "~"; return ;;
- $HOME/*) echo -n "~"; __bashum__shrink_relpath "${path#$HOME/}" ;;
- *) echo "$path"; return ;;
- esac
- }
-
- __bashum__shrink_relpath() {
- #
- # Shrink relative path according to rules
- #
- # Rules are:
- #
- # * if path has 7 chars or less, it's left as is and printed;
- # * else if there is only one element, it's left as is, and path is printed'
- # * else if there are three or more elements, elements
- # between first and last are replaced by '...',
- # * if the first element has 3 chars or less, it's left as is
- # and path is printed,
- # * else, the first element is
- # * broken into words by period,
- # * and each word, if longer than 2 characters,
- # is shortened to its first character followed by '...'
- # * and the shortened elements are joined back by period,
- # * finally the path is printed (first element shortened. '...', and
- # last element intact)
- #
- local path=$1
- local elems
- local frst
- local last
- local elnum
- local elem
- test "${#path}" -le 7 && echo -n "$path" && return 0
- while IFS= read -r elem; do
- elems+=("$elem"); elnum=${#elems[@]}
- done <<<"$(sed 's|/|\n|' <<<"$path")"
- frst=${elems[0]}
- last=${elems[$((elnum-1))]}
- case $elnum in
- 0) true ;; # hardly possible (caught by -le 7 above)
- 1) echo -n "$path"; return ;;
- 2) __bashum__shrink_elem "$frst"; echo -n "/$last" ;;
- *) __bashum__shrink_elem "$frst"; echo -n "/…/$last" ;;
- esac
- }
-
- __bashum__shrink_elem() {
- #
- # Shrink element by words
- #
- local buff=$1
- local word
- local words
- local head=true
- words=(${buff//./ }); wnum=${#words[@]}
- test "$wnum" -eq 0 && echo -n "$buff" && return 0
- for word in "${words[@]}"; do
- $head || { echo -n .; head=false; }
- case $word in
- ?|??) echo -n "$word" ;;
- *) echo -n "${word:0:1}…" ;;
- esac
- done
- }
-
- #shellcheck disable=SC2016
- __bashum__mkpc() {
- #
- # Compose PROMPT_COMMAND body
- #
- echo -n '__bashum__save_rv $?;'
- case "$TERM" in
- xterm*|rxvt*|screen*)
- echo -n 'echo -ne "\033]0;'
- echo -n "$(__bashum__mkicon) "
- echo -n '$(__bashum__lastrv)'
- echo -n "$(__bashum__mkhostid)"
- echo -n '$(__bashum__wdir shrinky)'
- echo -n '\$'
- echo -n '\007"'
- ;;
- esac
- }
-
- __bashum__mkicon() {
- case "$SSH_CONNECTION" in
- "") echo ;;
- *) echo ;;
- esac
- }
-
- __bashum__mkhostid() {
- test -n "$SSH_CONNECTION" || return
- echo "${HOSTNAME%%.*}:"
- }
-
- __bashum__setup_traps() {
- case "$TERM" in
- xterm*|rxvt*|screen*) trap __bashum__set_title DEBUG ;;
- esac
- }
-
- __bashum__setup_traps
-
- PROMPT_COMMAND=$(__bashum__mkpc)
-
- $BASHUM_BMO_NAG && bmo nag
|