######################################################################## # Colour definitions for parts of $PS1. # Do we even have a terminal we can do things to? we_have_term() { [ "$TERM" ] && [ "$TERM" != dumb ] } raw_termattr() { if we_have_term then for attr in "$@" do case "$attr" in normal) tput sgr0 ;; red) tput setaf 1 ;; blue) tput setaf 4 ;; bold) tput bold ;; esac done fi } # Output terminal attribute changing sequence, if there's a terminal. # Also output output bash $PS1 sequences to tell bash it's # non-printing characters. termattr() { printf '\[' raw_termattr "$@" printf '\]' } ######################################################################## # Collect info to show in $PS1 taskwarrior_context() { if command -v task > /dev/null && [ -e "$HOME/.task" ] then task context list | awk '$NF == "yes" { print $1 }' fi } # Context for git and Debian packging: QvarnLabs? QL() { case "$DEBEMAIL" in *@qvarnlabs.com) printf "[QL:$OS_PROJECT_SHORTNAME] " ;; esac } find_git_root() { ( set -e while [ "$(pwd)" != / ] do if [ -d .git ] then pwd break else cd .. fi done ) } is_git_repo() { case "$(find_git_root)" in /*) return 0 ;; *) return 1 ;; esac } get_git_branch() { git branch --no-color | awk ' BEGIN { max = 30 } /^\* / { name = $2 if (length(name) > max) name = "..." substr(name, length(name) - max) print name } ' } ######################################################################## # Set window title for terminal emulator, screen. set_window_title() { case "$TERM" in xterm*) printf '\033]1;%s\07' "$1" > /dev/tty printf '\033]2;%s\07' "$1" > /dev/tty ;; screen) printf '\ek%s\e\\' "$1" > /dev/tty ;; esac } ######################################################################## # Dynamically change $PS1 or output other things just before the prompt. wrap_if_nonempty() { local thing="$1" local before="$2" local after="$3" if [ -n "$thing" ] then printf '%s%s%s' "$before" "$thing" "$after" fi } define_ps1() { wrap_if_nonempty "$(taskwarrior_context)" "$(termattr red)" "$(termattr normal) " wrap_if_nonempty "$(QL)" "$(termattr bold red)" "$(termattr normal)" termattr bold blue date +%H:%M | tr -d '\n' local hostname="$(hostname)" case "$hostname" in exolobe3) printf ' \w ' ;; *) termattr red printf ' %s' "$hostname" termattr bold blue printf ':\w ' ;; esac termattr normal if is_git_repo then wrap_if_nonempty "$(get_git_branch)" "$(termattr bold blue)[" "]$(termattr normal)" fi termattr bold blue printf '\$ ' termattr normal } tell_about_exit_code() { local exit_code="$1" if [ "$exit_code" != 0 ] then raw_termattr bold red printf '[PREVIOUS COMMAND EXIT: %s]\n' "$exit_code" raw_termattr normal fi } export PROMPT_COMMAND=prompt_command prompt_command() { tell_about_exit_code "$?" PS1="$(define_ps1)" set_window_title "Terminal" } ######################################################################## # Function for using the QvarnLabs "os-rchelper" script more # conveniently. osrc() { eval `os-rchelper "$1"` } ############### ulimit -c unlimited umask 002 if command -v emacs > /dev/null then export EDITOR=emacs else export EDITOR=vi fi export PATH="$HOME/.cargo/bin:$PATH:$HOME/bin" export PAGER=less export LESSCHARSET=utf-8 export HISTCONTROL=ignoredups export HISTFILESIZE=500 export DEBEMAIL=liw@liw.fi export VIRSH_DEFAULT_CONNECT_URI=qemu:///system export LANG=en_GB.UTF-8 export LC_COLLATE=fi_FI.UTF-8 export QVARNLABS_REPOS="$HOME/qvarnlabs/code" export ANSIBLE_ROLES_PATH="$HOME/code/debian-ansible/roles:$HOME/pers/debian-ansible/roles" PROMPT_DIRTRIM=1 set +H if [ -n "$PS1" ] then bind -r '' fi