From 619606d34cfb301c634d2a5f3602138b508becb8 Mon Sep 17 00:00:00 2001 From: Adar Nimrod <nimrod@shore.co.il> Date: Mon, 29 Apr 2019 09:26:35 +0300 Subject: [PATCH] Refactor my fancy prompt into command notification. - No more prerun files, remove said code. - Set PS1 during __prompt (called by BASH_COMMAND everytime the prompt is going to be shown). - Consistent calculation of runduration across __prompt and __command_notifier. - Open bug: the exit status is shown until a new command is run. --- .bashrc | 55 ++++++++++++++++++++----------------------------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/.bashrc b/.bashrc index 3a0b0bc..fcd7bb5 100644 --- a/.bashrc +++ b/.bashrc @@ -92,7 +92,6 @@ alias xargs="xargs " alias monitor="monitor " alias sudome="sudome " alias presentation='docker dev adarnimrod/presentation' -alias prune_prerun='find "$HOME" -maxdepth 1 -name ".prerun\.[0-9]*" | grep -v "$(pgrep -u "$(id -u)" "$(basename "$SHELL" )" )" | xargs -r rm' alias netdata='docker run --detach --name netdata --cap-add SYS_PTRACE --volume /proc:/host/proc:ro --volume /sys:/host/sys:ro --volume /var/run/docker.sock:/var/run/docker.sock --publish 19999:19999 firehol/netdata:alpine' alias newman='docker run --rm -u "$(id -u):$(id -g)" -v "$PWD:/etc/newman" -t postman/newman_alpine33' alias http-server='python3 -m http.server 8080' @@ -214,47 +213,36 @@ match_ssl_pair () { return "$exitcode" } -__run_duration () { - if [ -f "$HOME/.prerun.$$" ] +__prompt () { + local exitstatus="$?" + local runduration endtime + ! [ "$(type history 2> /dev/null)" = 'history is a shell builtin' ] || history -a + PS1='\u@\h:\w\$ ' + if [ -n "${starttime:-}" ] then - local endtime starttime endtime="$(date +%s)" - # shellcheck disable=SC1090 - . "$HOME/.prerun.$$" - rm "$HOME/.prerun.$$" - echo "$(( endtime - starttime ))" - else - echo 0 + runduration="$(( endtime - starttime))" + [ "$runduration" -lt '10' ] || PS1="\\[\\e[1;96m[Run duration: $runduration]\\e[0m\\] $PS1" + [ "$exitstatus" -eq '0' ] || PS1="\\[\\e[1;91m[Exit status: $exitstatus]\\e[0m\\] $PS1" fi -} - -__prerun () { - echo "starttime=$(date +%s)" > "$HOME/.prerun.$$" -} - -__prompt () { - local exitstatus="$?" - local runduration prompt - ! [ "$(type history 2> /dev/null)" = "history is a shell builtin" ] || history -a - prompt="" - [ ! -f "$HOME/.prerun.$$" ] || runduration="$(__run_duration)" - [ "${runduration:-0}" -lt "10" ] || prompt="$(cyan -n "[Run duration: $runduration]") $prompt" - [ -n "${runduration:-}" ] || exitstatus='0' - [ "$exitstatus" = "0" ] || prompt="$(red -n "[Exit status: $exitstatus]") $prompt" - echo -n "$prompt" + last_command='__prompt' + unset starttime trap __command_notifier debug } __command_notifier () { local exitstatus="$?" - local now runduration - now="$(date +%s)" - if [ -n "${last_finish:-}" ] && [ "$last_command" != "__prompt" ] + local runduration endtime + endtime="$(date +%s)" + if [ "${last_command:-}" = '__prompt' ] + then + starttime="$(date +%s)" + elif [ -n "${last_finish:-}" ] then - runduration="$(( now - last_finish ))" - if [ "$runduration" -gt "10" ] + runduration="$(( endtime - last_finish ))" + if [ "$runduration" -gt '10' ] then - if [ "$exitstatus" -eq "0" ] + if [ "$exitstatus" -eq '0' ] then notify-send "$last_command has finished." else @@ -288,7 +276,6 @@ if [ -n "${BASH:-}" ] then export CDPATH="$HOME:$HOME/Documents:$HOME/Documents/Shore:$HOME/Documents/Endless" # shellcheck disable=SC2016 - export PS0='$(__prerun)' export PROMPT_COMMAND='__prompt' shopt -s checkwinsize shopt -s cmdhist @@ -301,8 +288,6 @@ then [ ! -f "$sourcefile" ] || . "$sourcefile" done ! command -v direnv > /dev/null || eval "$(direnv hook bash)" - prune_prerun - trap prune_prerun EXIT fi prune_docker_remote -- GitLab