[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: feature requests - bash history
From: |
What, me urgent? |
Subject: |
Re: feature requests - bash history |
Date: |
Wed, 3 Aug 2011 14:24:56 -0700 (PDT) |
As a follow-up to my post of a few weeks ago (excerpted below), here are two
bash procedures I wrote for my bashrc to demonstrate what I mean. Even if
the idea doesn't rise to a level to be integrated as bash features, maybe
some readers of this list or other bash users will find these useful.
Cheers.
CONTENTS
=========
hrm - a bash function to remove multiple lines from the bash history
hgrep - display multiple search solutions from within the current shell
context's history
function hrm {
# remove a range of lines from the history
todolist=()
function usage_message {
echo -e "\nhrm - remove multiple entries from history\nusage: hrm {
n-m | n,m | n }\n n-m delete from entry n until entry m\n n,m
starting from entry n, delete m entries\n n delete individual entry n"
}
function error_message {
echo "error: a parameter is non-numeric or out of bounds: "$myparm
usage_message
}
if [[ -z "$@" ]] || [[ "$1" =~ ^-[h?]$ ]] || [[ "$1" == "--help" ]]; then
usage_message
return
fi
for myparm in "$@" ;do
if [[ "$myparm" =~ ^[[:digit:]]*-[[:digit:]]*$ ]]; then
n=${myparm%%-*}
m=${myparm##*-}
if [[ $n == 0 ]] || [[ $m == 0 ]] || \
[[ $n -ge $HISTCMD ]] || [[ $m -ge $HISTCMD ]] ; then
error_message
return
else
if [[ $n == $m ]] ; then
echo "warning: start and end numbers identical: "$myparm
read -p "continue anyway? (y/N)"
[ "$REPLY" != "y" ] && return
elif [[ $n -gt $m ]] ; then
echo "warning: start "$n", greater than end, "$m
read -p "continue anyway? (y/N)"
[ "$REPLY" != "y" ] && return
z=$m; m=$n; n=$z
fi
while [[ $n -le $m ]]; do
todolist=("${todolist[@]}" $m)
let m--
done
fi
elif [[ "$myparm" =~ ^[[:digit:]]*,[[:digit:]]*$ ]]; then
n=${myparm%%,*}
z=${myparm##*,}
let m=$n+$z-1
if [[ $n == 0 ]] || [[ $z == 0 ]] || \
[[ $n -ge $HISTCMD ]] || [[ $m -ge $HISTCMD ]] ; then
error_message
else
while [[ $n -le $m ]]; do
todolist=("${todolist[@]}" $m)
let m--
done
fi
else
if ! [[ "$myparm" =~ ^[[:digit:]]*$ ]] || \
[[ $myparm == 0 ]] || \
[[ $myparm -ge $HISTCMD ]] ; then
error_message
return
fi
todolist=("${todolist[@]}" $myparm)
fi
done
for myparm in $(oldIFS="$IFS"; IFS=$'\n'; \
sort -g -r -u <<< "${todolist[*]}"; \
IFS="$oldIFS"); do
history -d $myparm
done
history -w
}
function hgrep {
if [[ -z "$@" ]] || [[ "$1" =~ ^-[h?]$ ]] || [[ "$1" == "--help" ]]; then
echo -e "hgrep - grep for bash's history buffer\nUsage: hgrep [grep
options] [grep pattern]"
return
fi
history | grep -v -e hgrep -e history | grep $*
echo "To edit a line, enter !nn <alt> ^"
}
> 1] display multiple solutions for a bash history search - Instead of a
> user having to repeat the crtl-r/ctrl-s sequence, and have each solution
> overwrite the previous one, allow the user to prefix ctrl-r/ctrl-s with an
> integer for the maximum number of entries to display. Maybe prefix each
> solution with it's line number in the history, so that the desired
> solution could be invoked using !nn
>
> 2] Add a feature for history -d to delete more than one line of the
> history. Maybe history -d n,m to delete lines n through m, or history -d
> n:m to delete m lines beginning with line number n.
>
> 3] Add a feature for history -d to delete multiple lines based upon a
> regular expression.
> EXAMPLES:
> history -d n ^man* - delete the n most recent history lines that begin
> with "man"
> history -d n:m ^man* - delete the first m lines that begin with "man",
> starting at line n.
> history -d n,m ^man* - delete all occurrences of ^man* between lines n and
> m.
>
>
>
--
View this message in context:
http://old.nabble.com/feature-requests---bash-history-tp32008330p32190052.html
Sent from the Gnu - Bash mailing list archive at Nabble.com.
- Re: feature requests - bash history,
What, me urgent? <=