# -*- shell-script -*- # hist.sh - Bourne Again Shell Debugger history routines # # Copyright (C) 2002-2003, 2006-2008, 2011, 2015 Rocky Bernstein # # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with This program; see the file COPYING. If not, write to # the Free Software Foundation, 59 Temple Place, Suite 330, Boston, # MA 02111 USA. typeset -i _Dbg_hi_last_stop=0 typeset -i _Dbg_hi=0 # Current next history entry to store into. typeset -a _Dbg_history; _Dbg_history=() typeset -i _Dbg_set_history=1 typeset -i _Dbg_history_length=${HISTSIZE:-256} # gdb's default value typeset _Dbg_histfile=${HOME:-.}/.bashdb_hist # Set to rerun history item, or print history if command is of the form # !n:p. If command is "history" then $1 is number of history item. # the history command index to run is returned or $_Dbg_hi if # there's nothing to run. # Return value in $history_num _Dbg_history_parse() { history_num=$1 ((history_num < 0)) && ((history_num=${#_Dbg_history[@]}-1+$1)) _Dbg_hi=${#_Dbg_history[@]} [[ -z $history_num ]] && let history_num=$_Dbg_hi-1 if [[ $_Dbg_cmd == h* ]] ; then if [[ $history_num != $int_pat ]] ; then if [[ $history_num == -$int_pat ]] ; then history_num=$_Dbg_hi+$history_num else _Dbg_errmsg "Invalid history number skipped: $history_num" history_num=-1 fi fi else # Handle ! form. May need to parse number out number and modifier # case $_Dbg_cmd in # \!\-${int_pat}:p ) # typeset -a word1 # word1=($(_Dbg_split '!' $_Dbg_cmd)) # local -a word2 # word2=($(_Dbg_split ':' ${word1[0]})) # typeset -i num=_Dbg_hi+${word2[0]} # _Dbg_do_history_list $num $num # history_num=-1 # ;; # [!]${int_pat}:p ) # local -a word1 # word1=($(_Dbg_split '!' $_Dbg_cmd)) # local -a word2 # word2=($(_Dbg_split ':' ${word1[0]})) # _Dbg_do_history_list ${word2[0]} ${word2[0]} # history_num=-1 # ;; # \!\-$int_pat ) # local -a word # word=($(_Dbg_split '!' $_Dbg_cmd)) # history_num=$_Dbg_hi+${word[0]} # ;; # \!$int_pat ) # local -a word # word=($(_Dbg_split '!' $_Dbg_cmd)) # history_num=${word[0]} # ;; # '!' ) # if [[ $history_num != $int_pat ]] ; then # if [[ $history_num == -$int_pat ]] ; then # history_num=$_Dbg_hi+$history_num # else # _Dbg_msg "Invalid history number skipped: $history_num" # history_num=-1 # fi # fi # ;; # * ) # _Dbg_errmsg "Invalid history number skipped: $_Dbg_cmd" # history_num=-1 # esac : fi } _Dbg_history_read() { if [[ -r $_Dbg_histfile ]] ; then history -r $_Dbg_histfile typeset -a last_history; last_history=($(history 1)) typeset -i max_history=${last_history[0]} if (( max_history > _Dbg_history_length )) ; then max_history=$_Dbg_history_length fi local OLD_HISTTIMEFORMAT=${HISTTIMEFORMAT} local hist HISTTIMEFORMAT='' local -i i for (( i=1; (( i <= max_history )) ; i++ )) ; do last_history=($(history $i)) hist=${last_history}[1] # _Dbg_history[$i]=$hist done HISTTIMEFORMAT=${OLD_HISTTIMEFORMAT} fi } # Save history file _Dbg_history_write() { (( _Dbg_history_length > 0 && _Dbg_set_history)) \ && history -w $_Dbg_histfile } # Remove the last command from the history list. _Dbg_history_remove_item() { _Dbg_hi=${#_Dbg_history[@]}-1 unset _Dbg_history[$_Dbg_hi] } # _Dbg_history_read