/usr/share/fish/functions/history.fish is in fish-common 2.2.0-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | #
#Deletes an item from history
#
function history --description "Deletes an item from history"
set -l argc (count $argv)
set -l prefix_args ""
set -l contains_args ""
set -l cmd print
set -l search_mode none
set -l pager less
if set -q PAGER
set pager $PAGER
end
if test $argc -gt 0
for i in (seq $argc)
switch $argv[$i]
case --delete
set cmd delete
case --prefix
set search_mode prefix
set prefix_args $argv[(math $i + 1)]
case --contains
set search_mode contains
set contains_args $argv[(math $i + 1)]
case --save
set cmd save
case --clear
set cmd clear
case --search
set cmd print
end
end
else
#Execute history builtin without any argument
if status --is-interactive
builtin history | eval $pager
else
builtin history
end
return
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
#Save changes after deleting item
builtin history --save
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"
else
builtin history --delete $found_items[(math $i - 1)]
end
end
end
#Save changes after deleting item(s)
builtin history --save
end
case save
#Save changes to history file
builtin history $argv
case clear
# Erase the entire history
echo "Are you sure you want to clear history ? (y/n)"
read ch
if test $ch = "y"
builtin history $argv
echo "History cleared!"
end
end
end
|