diff --git a/clean_files.txt b/clean_files.txt index 6882ceff0d..f94b2dcafe 100644 --- a/clean_files.txt +++ b/clean_files.txt @@ -24,6 +24,12 @@ hooks .gitattributes lint_clean_files.sh +# plugins +# +plugins/available/history.plugin.bash +plugins/available/history-search.plugin.bash +plugins/available/history-substring-search.plugin.bash + # themes # themes/agnoster diff --git a/lib/history.bash b/lib/history.bash deleted file mode 100644 index a1a7cb04aa..0000000000 --- a/lib/history.bash +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# Bash History Handling - -shopt -s histappend # append to bash_history if Terminal.app quits -export HISTCONTROL=${HISTCONTROL:-ignorespace:erasedups} # erase duplicates; alternative option: export HISTCONTROL=ignoredups -export HISTSIZE=${HISTSIZE:-5000} # resize history size -export AUTOFEATURE=${AUTOFEATURE:-true autotest} # Cucumber / Autotest integration - -function rh { - history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head -} diff --git a/plugins/available/history-search.plugin.bash b/plugins/available/history-search.plugin.bash new file mode 100644 index 0000000000..ea02eb7494 --- /dev/null +++ b/plugins/available/history-search.plugin.bash @@ -0,0 +1,10 @@ +# shellcheck shell=bash +cite about-plugin +about-plugin 'search history using the prefix already entered' + +# enter a few characters and press UpArrow/DownArrow +# to search backwards/forwards through the history +if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then + bind '"\e[A":history-search-backward' + bind '"\e[B":history-search-forward' +fi diff --git a/plugins/available/history-substring-search.plugin.bash b/plugins/available/history-substring-search.plugin.bash new file mode 100644 index 0000000000..e0e37f43d5 --- /dev/null +++ b/plugins/available/history-substring-search.plugin.bash @@ -0,0 +1,10 @@ +# shellcheck shell=bash +cite about-plugin +about-plugin 'search history using the substring already entered' + +# enter a few characters and press UpArrow/DownArrow +# to search backwards/forwards through the history +if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then + bind '"\e[A":history-substring-search-backward' + bind '"\e[B":history-substring-search-forward' +fi diff --git a/plugins/available/history.plugin.bash b/plugins/available/history.plugin.bash index 528548ef02..08ca8de634 100644 --- a/plugins/available/history.plugin.bash +++ b/plugins/available/history.plugin.bash @@ -1,9 +1,39 @@ +# shellcheck shell=bash cite about-plugin -about-plugin 'history manipulation' -# enter a few characters and press UpArrow/DownArrow -# to search backwards/forwards through the history -if [[ ${SHELLOPTS} =~ (vi|emacs) ]] -then - bind '"":history-search-backward' - bind '"":history-search-forward' -fi +about-plugin 'improve history handling with sane defaults' + +# append to bash_history if Terminal.app quits +shopt -s histappend + +# erase duplicates; alternative option: export HISTCONTROL=ignoredups +export HISTCONTROL=${HISTCONTROL:-ignorespace:erasedups} + +# resize history to 100x the default (500) +export HISTSIZE=${HISTSIZE:-50000} + +top-history() { + about 'print the name and count of the most commonly run tools' + + if [[ -n $HISTTIMEFORMAT ]]; then + # To parse history we need a predictable format, which HISTTIMEFORMAT + # gets in the way of. So we unset it and set a trap to guarantee the + # user's environment returns to normal even if the pipeline below fails. + # shellcheck disable=SC2064 + trap "export HISTTIMEFORMAT='$HISTTIMEFORMAT'" RETURN + unset HISTTIMEFORMAT + fi + + history \ + | awk '{ + a[$2]++ + }END{ + for(i in a) + printf("%s\t%s\n", a[i], i) + }' \ + | sort --reverse --numeric-sort \ + | head \ + | column \ + --table \ + --table-columns 'Command Count,Command Name' \ + --output-separator ' | ' +}