Skip to content

Commit

Permalink
Merge pull request #1940 from gaelicWizard/history
Browse files Browse the repository at this point in the history
Feature: automatic history management
  • Loading branch information
NoahGorny authored Feb 13, 2022
2 parents 23f9b74 + 5d58580 commit 253004a
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 19 deletions.
1 change: 1 addition & 0 deletions clean_files.txt
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ completion/available/wpscan.completion.bash
# libraries
lib/colors.bash
lib/helpers.bash
lib/history.bash
lib/log.bash
lib/preexec.bash
lib/search.bash
Expand Down
49 changes: 49 additions & 0 deletions lib/history.bash
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# shellcheck shell=bash
#
# Functions for working with Bash's command history.

function _bash-it-history-init() {
safe_append_preexec '_bash-it-history-auto-save'
safe_append_prompt_command '_bash-it-history-auto-load'
}

function _bash-it-history-auto-save() {
case $HISTCONTROL in
*'noauto'* | *'autoload'*)
: # Do nothing, as configured.
;;
*'auto'*)
# Append new history from this session to the $HISTFILE
history -a
;;
*)
# Append *only* if shell option `histappend` has been enabled.
shopt -q histappend && history -a && return
;;
esac
}

function _bash-it-history-auto-load() {
case $HISTCONTROL in
*'noauto'*)
: # Do nothing, as configured.
;;
*'autosave'*)
# Append new history from this session to the $HISTFILE
history -a
;;
*'autoloadnew'*)
# Read new entries from $HISTFILE
history -n
;;
*'auto'*)
# Blank in-memory history, then read entire $HISTFILE fresh from disk.
history -a && history -c && history -r
;;
*)
: # Do nothing, default.
;;
esac
}

_bash_it_library_finalize_hook+=('_bash-it-history-init')
12 changes: 7 additions & 5 deletions plugins/available/history-eternal.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
# shellcheck shell=bash
about-plugin 'eternal bash history'

# Load after the history plugin
# BASH_IT_LOAD_PRIORITY: 375
if [[ ${BASH_VERSINFO[0]} -lt 4 ]] || [[ ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 3 ]]; then
_log_warning "Bash version 4.3 introduced the 'unlimited' history size capability."
return 1
fi

# Modify history sizes before changing location to avoid unintentionally
# truncating the history file early.

# "Numeric values less than zero result in every command being saved on the history list (there is no limit)"
export HISTSIZE=-1
readonly HISTSIZE=-1 2> /dev/null || true

# "Non-numeric values and numeric values less than zero inhibit truncation"
export HISTFILESIZE='unlimited'
readonly HISTFILESIZE='unlimited' 2> /dev/null || true

# Use a custom history file location so history is not truncated
# if the environment ever loses this "eternal" configuration.
HISTDIR="${XDG_STATE_HOME:-${HOME?}/.local/state}/bash"
[[ -d ${HISTDIR?} ]] || mkdir -p "${HISTDIR?}"
export HISTFILE="${HISTDIR?}/history"
readonly HISTFILE="${HISTDIR?}/history" 2> /dev/null || true
3 changes: 0 additions & 3 deletions plugins/available/history-search.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
# shellcheck shell=bash
about-plugin 'search history using the prefix already entered'

# Load after the history plugin
# BASH_IT_LOAD_PRIORITY: 375

# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then
Expand Down
3 changes: 0 additions & 3 deletions plugins/available/history-substring-search.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
# shellcheck shell=bash
about-plugin 'search history using the substring already entered'

# Load after the history plugin
# BASH_IT_LOAD_PRIORITY: 375

# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then
Expand Down
11 changes: 5 additions & 6 deletions plugins/available/history.plugin.bash
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@ about-plugin 'improve history handling with sane defaults'
# variable when the shell exits, rather than overwriting the file.
shopt -s histappend

# erase duplicates; alternative option: export HISTCONTROL=ignoredups
export HISTCONTROL=${HISTCONTROL:-ignorespace:erasedups}
# 'ignorespace': don't save command lines which begin with a space to history
# 'erasedups' (alternative 'ignoredups'): don't save duplicates to history
# 'autoshare': automatically share history between multiple running shells
: "${HISTCONTROL:=ignorespace:erasedups:autoshare}"

# resize history to 100x the default (500)
export HISTSIZE=${HISTSIZE:-50000}

# Flush history to disk after each command.
export PROMPT_COMMAND="history -a;${PROMPT_COMMAND}"
: "${HISTSIZE:=50000}"

function top-history() {
about 'print the name and count of the most commonly run tools'
Expand Down
5 changes: 3 additions & 2 deletions themes/base.theme.bash
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,7 @@ function aws_profile {
}

function _save-and-reload-history() {
local autosave=${1:-0}
[[ $autosave -eq 1 ]] && history -a && history -c && history -r
local autosave="${1:-${HISTORY_AUTOSAVE:-0}}"
[[ ${autosave} -eq 1 ]] && local HISTCONTROL="${HISTCONTROL:-}${HISTCONTROL:+:}autoshare"
_bash-it-history-auto-save && _bash-it-history-auto-load
}

0 comments on commit 253004a

Please sign in to comment.