diff --git a/files/bashrc.d/90-prompt.sh b/files/bashrc.d/90-prompt.sh index 36bbd64..129b1a7 100644 --- a/files/bashrc.d/90-prompt.sh +++ b/files/bashrc.d/90-prompt.sh @@ -7,13 +7,56 @@ ps1_show() { local format=$1 local fun=$2 - local str=$($fun) + local str="" + str=$($fun) if [ ! -z "$str" ]; then printf "$format\n" "$str" fi } +ps1_timetracking() { + local active_tracking="" + local active_tags_count="" + local active_tags="" + local current_tag="" + local bar_icon="" + local dom_prefix="" + # exit if timew is not installed + if ! hash timew > /dev/null 2>&1 ; then + return 0 + fi + + # exit if no active tracking + active_tracking="$(timew get dom.active)" + if [ "$active_tracking" -eq 1 ]; then + bar_icon="[▶]" + dom_prefix="dom.active" + else + bar_icon="[■]" + dom_prefix="dom.tracked.1" + fi + + active_tags_count="$(timew get "$dom_prefix.tag.count")" + if [ "$active_tags_count" -gt 0 ]; then + suffix="" + active_tags="" + if [ "$active_tags_count" -gt 1 ] && [ "$active_tracking" -eq 0 ]; then + # Bug when accessing multiple tags on non-active tasks + suffix="…" + active_tags_count=1 + fi + for tagidx in $(seq 1 "$active_tags_count") ; do + current_tag="$(timew get "$dom_prefix.tag.$tagidx")" + active_tags="$active_tags,$current_tag" + done + active_tags="$(echo "$active_tags" |cut -c2-)$suffix" + else + active_tags="(tag?)" + fi + echo "$bar_icon $active_tags " +} + ps1_vcs_branch() { local vcs="" local vcs_branch="" @@ -22,39 +65,53 @@ ps1_vcs_branch() { local vcs_root_url="" local vcs_branch_url="" - { - if hash git && git rev-parse; then - vcs='git' - vcs_branch=$(git branch |sed -n "s/\* \(.*\)/\1/p") - elif hash hg && hg -q status; then - vcs='hg' - vcs_branch=$(hg branch) - elif hash svn && svn info; then - vcs='svn' - vcs_root_path=$(LANG=C LC_ALL=C svn info |sed -n 's/^Working Copy Root Path: //p') - vcs_root_url=$(cd "$vcs_root" ; LANG=C LC_ALL=C svn info |sed -n 's/^Repository Root: //p') - vcs_branch_url=$(cd "$vcs_root" ; LANG=C LC_ALL=C svn info |sed -n 's/^URL: //p') - vcs_branch=$(echo "$vcs_branch_url" |sed "s#^$vcs_root_url/##") - fi - } >/dev/null 2>&1 + if hash git > /dev/null 2>&1 && git rev-parse > /dev/null 2>&1; then + vcs="git" + vcs_branch=$(git symbolic-ref --short -q HEAD 2>/dev/null) + vcs_branch=${vcs_branch:-(detached head)} + elif hash hg > /dev/null 2>&1 && hg -q status > /dev/null 2>&1; then + vcs="hg" + vcs_branch=$(hg branch) + elif hash svn > /dev/null 2>&1 && svn info > /dev/null 2>&1; then + vcs="svn" + # vcs_root_path=$(LANG=C LC_ALL=C svn info |sed -n "s/^Working Copy Root Path: //p") + vcs_root_url=$(cd "$vcs_root" || return ; LANG=C LC_ALL=C svn info |sed -n "s/^Repository Root: //p") + vcs_branch_url=$(cd "$vcs_root" || return ; LANG=C LC_ALL=C svn info |sed -n "s/^URL: //p") + vcs_branch=$(echo "$vcs_branch_url" |sed "s#^$vcs_root_url/##") + fi if [ -z "$vcs" ]; then echo "" else - echo "$vcs:$vcs_branch" + echo "$vcs $vcs_branch" fi } #export PS1=" \t [#\#]\n[\u@\h \w]\\$ " #PS1='\[\033[1;32m\][\t|\d]\[\033[1;33m\][\u@\h] \[\033[0;36m\]\w\$\[\033[0m\]\n ' +PS1="${ps1_context:-}" +PS1=$PS1"▪ \[\e[1;0m\]\w\[\e[0m\] " -PS1="$ps1_context ." -PS1=$PS1": \[\e[1;33m\]\w\[\e[0m\] :" -PS1=$PS1"\`ps1_show ': \[\e[1;34m\]%s\[\e[0m\] :' ps1_vcs_branch\`" # vcs branch -PS1=$PS1": \[\e[0;32m\]\t\[\e[0m\] :" -#PS1=$PS1": \[\e[1;34m\]#\#\[\e[0m\] :" #command count -PS1=$PS1": \[\e[0;31m\]\u@\h " #username -PS1=$PS1"("`uname -m`")\[\e[0m\] :" # architecture -PS1=$PS1":.\n\$ " +# Include VCS Info (eval at each line) +# shellcheck disable=SC2089 +PS1=$PS1"\$(ps1_show '▪ \[\e[1;34m\]%s\[\e[0m\] ' ps1_vcs_branch)" # vcs branch + +# Include DATETIME +# PS1=$PS1"▪ \[\e[0;32m\]\t\[\e[0m\] " + +# Include TIME TRACKING (timewarrior) +PS1=$PS1"\$(ps1_show '▪ \[\e[1;32m\]%s\[\e[0m\] ' ps1_timetracking)" # timetracking + +# Include command count +# PS1=$PS1": \[\e[1;34m\]#\#\[\e[0m\] :" + +# Include USERNAME +PS1=$PS1"▪ \[\e[0;31m\]\u@\h " + +# Include ARCHITECTURE (eval only once) +PS1=$PS1"($(uname -m))\[\e[0m\] " +PS1=$PS1"\n\$ " + +# shellcheck disable=SC2090 export PS1