Added history completion file

Updated history function to assume --search as the default behavior
This commit is contained in:
ridiculousfish 2012-06-05 00:40:42 -07:00
parent 7698553c3a
commit 3836bfe5a1
2 changed files with 95 additions and 79 deletions

View file

@ -0,0 +1,5 @@
complete -c history -r -l prefix --description "Match history items that start with the given prefix"
complete -c history -r -l contains --description "Match history items that contain the given string"
complete -c history -l search --description "Print matching history items, which is the default behavior"
complete -c history -l delete --description "Interactively delete matching history items"
complete -c history -l clear --description "Clear your entire history"

View file

@ -8,8 +8,7 @@ function history --description "Deletes an item from history"
set -l prefix_args ""
set -l contains_args ""
set -l delete 0
set -l clear 0
set -l cmd print
set -l search_mode none
@ -17,7 +16,7 @@ function history --description "Deletes an item from history"
for i in (seq $argc)
switch $argv[$i]
case --delete
set delete 1
set cmd delete
case --prefix
set search_mode prefix
set prefix_args $argv[(math $i + 1)]
@ -25,81 +24,93 @@ function history --description "Deletes an item from history"
set search_mode contains
set contains_args $argv[(math $i + 1)]
case --clear
set clear 1
end;
end;
end;
if test $delete = 1
set -l found_items ""
switch $search_mode
case prefix
set found_items (builtin history --search --prefix $prefix_args)
case contains
set found_items (builtin history --search --contains $contains_args)
case none
builtin history $argv
return 0
end;
set found_items_count (count $found_items)
if test $found_items_count -gt 0
echo "[0] cancel"
echo "[1] all"
echo
for i in (seq $found_items_count)
printf "[%s] %s \n" (math $i + 1) $found_items[$i]
set cmd clear
case --search
set cmd print
end
end
end
read --local --prompt "echo 'Delete which entries? > '" choice
set choice (echo $choice | tr " " "\n")
for i in $choice
# Skip empty input; for example, if the user just hits return
if test -z $i
continue
end
#Following two validations could be embedded with "and" but I find the syntax kind of weird.
if not echo $i | grep -E -q "^[0-9]+\$"
printf "Invalid input: %s\n" $i
continue
end
if test $i -gt (math $found_items_count + 1)
printf "Invalid input : %s\n" $i
continue
end
if test $i = "0"
printf "Cancel\n"
return
else
if test $i = "1"
for item in $found_items
builtin history --delete $item
end
printf "Deleted all!\n"
return
else
builtin history --delete $found_items[(math $i - 1)]
end;
end;
end;
end;
else
if test $clear = 1
echo "Are you sure you want to clear history ? (y/n)"
read ch
if test $ch = "y"
builtin history $argv
echo "History cleared!"
end;
else
builtin history $argv
end;
end;
end;
switch $cmd
case print
# Print matching items
# Note this may end up passing --search twice to the builtin,
# but that's harmless
builtin history --search $argv
case delete
# Interactively delete history
set -l found_items ""
switch $search_mode
case prefix
set found_items (builtin history --search --prefix $prefix_args)
case contains
set found_items (builtin history --search --contains $contains_args)
case none
builtin history $argv
return 0
end
set found_items_count (count $found_items)
if test $found_items_count -gt 0
echo "[0] cancel"
echo "[1] all"
echo
for i in (seq $found_items_count)
printf "[%s] %s \n" (math $i + 1) $found_items[$i]
end
read --local --prompt "echo 'Delete which entries? > '" choice
set choice (echo $choice | tr " " "\n")
for i in $choice
# Skip empty input, for example, if the user just hits return
if test -z $i
continue
end
#Following two validations could be embedded with "and" but I find the syntax kind of weird.
if not echo $i | grep -E -q "^[0-9]+\$"
printf "Invalid input: %s\n" $i
continue
end
if test $i -gt (math $found_items_count + 1)
printf "Invalid input : %s\n" $i
continue
end
if test $i = "0"
printf "Cancel\n"
return
else
if test $i = "1"
for item in $found_items
builtin history --delete $item
end
printf "Deleted all!\n"
return
else
builtin history --delete $found_items[(math $i - 1)]
end
end
end
end
case clear
# Erase the entire history
if test $clear = 1
echo "Are you sure you want to clear history ? (y/n)"
read ch
if test $ch = "y"
builtin history $argv
echo "History cleared!"
end
else
builtin history $argv
end
end
end