diff options
Diffstat (limited to 'share/functions/history.fish')
-rw-r--r-- | share/functions/history.fish | 282 |
1 files changed, 138 insertions, 144 deletions
diff --git a/share/functions/history.fish b/share/functions/history.fish index a26db0f4..a365ae19 100644 --- a/share/functions/history.fish +++ b/share/functions/history.fish @@ -1,147 +1,141 @@ # -#Deletes an item from history +# Wrap the builtin history command to provide additional functionality. # - -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 - case --merge - set cmd merge - case --help - set cmd help - case -- - set -e argv[$i] - break - case "-*" "--*" - printf ( _ "%s: invalid option -- %s\n" ) history $argv[1] >& 2 - return 1 - 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 (string split " " -- $choice) - - 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 string match -qr '^[0-9]+$' $i - 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 merge - builtin history --merge - case help - builtin history --help - 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 +function history --shadow-builtin --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 + case --merge + set cmd merge + case --help + set cmd help + case -- + set -e argv[$i] + break + case "-*" "--*" + printf ( _ "%s: invalid option -- %s\n" ) history $argv[1] >&2 + return 1 + 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 (string split " " -- $choice) + + 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 string match -qr '^[0-9]+$' $i + 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 merge + builtin history --merge + case help + builtin history --help + 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 |