mirror of
https://github.com/fish-shell/fish-shell
synced 2024-11-10 23:24:39 +00:00
Added history completion file
Updated history function to assume --search as the default behavior
This commit is contained in:
parent
7698553c3a
commit
3836bfe5a1
2 changed files with 95 additions and 79 deletions
5
share/completions/history.fish
Normal file
5
share/completions/history.fish
Normal 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"
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue