From b5e56e2cbbfdffecdd85bdbef750bcea90a71b7d Mon Sep 17 00:00:00 2001 From: Ismo Vuorinen Date: Fri, 6 Jun 2025 10:14:39 +0300 Subject: [PATCH] feat(config): fish: meaningful-ooo/sponge Signed-off-by: Ismo Vuorinen --- config/fish/conf.d/sponge.fish | 52 +++++++++++++++++++ config/fish/fish_plugins | 1 + .../fish/functions/_sponge_clear_state.fish | 5 ++ config/fish/functions/_sponge_on_exit.fish | 3 ++ .../fish/functions/_sponge_on_postexec.fish | 24 +++++++++ config/fish/functions/_sponge_on_preexec.fish | 16 ++++++ config/fish/functions/_sponge_on_prompt.fish | 5 ++ .../_sponge_remove_from_history.fish | 9 ++++ .../fish/functions/sponge_filter_failed.fish | 11 ++++ .../fish/functions/sponge_filter_matched.fish | 11 ++++ 10 files changed, 137 insertions(+) create mode 100644 config/fish/conf.d/sponge.fish create mode 100644 config/fish/functions/_sponge_clear_state.fish create mode 100644 config/fish/functions/_sponge_on_exit.fish create mode 100644 config/fish/functions/_sponge_on_postexec.fish create mode 100644 config/fish/functions/_sponge_on_preexec.fish create mode 100644 config/fish/functions/_sponge_on_prompt.fish create mode 100644 config/fish/functions/_sponge_remove_from_history.fish create mode 100644 config/fish/functions/sponge_filter_failed.fish create mode 100644 config/fish/functions/sponge_filter_matched.fish diff --git a/config/fish/conf.d/sponge.fish b/config/fish/conf.d/sponge.fish new file mode 100644 index 0000000..e37fe38 --- /dev/null +++ b/config/fish/conf.d/sponge.fish @@ -0,0 +1,52 @@ +# Sponge version +set --global sponge_version 1.1.0 + +# Allow to repeat previous command by default +if not set --query --universal sponge_delay + set --universal sponge_delay 2 +end + +# Purge entries both after `sponge_delay` entries and on exit by default +if not set --query --universal sponge_purge_only_on_exit + set --universal sponge_purge_only_on_exit false +end + +# Add default filters +if not set --query --universal sponge_filters + set --universal sponge_filters sponge_filter_failed sponge_filter_matched +end + +# Don't filter out commands that already have been in the history by default +if not set --query --universal sponge_allow_previously_successful + set --universal sponge_allow_previously_successful true +end + +# Consider `0` the only successful exit code by default +if not set --query --universal sponge_successful_exit_codes + set --universal sponge_successful_exit_codes 0 +end + +# No active regex patterns by default +if not set --query --universal sponge_regex_patterns + set --universal sponge_regex_patterns +end + +# Attach event handlers +functions --query \ + _sponge_on_prompt \ + _sponge_on_preexec \ + _sponge_on_postexec \ + _sponge_on_exit + +# Initialize empty state for the first run +function _sponge_install --on-event sponge_install + set --global _sponge_current_command '' + set --global _sponge_current_command_exit_code 0 + set --global _sponge_current_command_previously_in_history false +end + +# Clean up variables +function _sponge_uninstall --on-event sponge_uninstall + _sponge_clear_state + set --erase sponge_version +end diff --git a/config/fish/fish_plugins b/config/fish/fish_plugins index 8720901..c04887f 100644 --- a/config/fish/fish_plugins +++ b/config/fish/fish_plugins @@ -5,3 +5,4 @@ halostatue/fish-macos@v7 danhper/fish-ssh-agent halostatue/fish-brew@v3 edc/bass +meaningful-ooo/sponge diff --git a/config/fish/functions/_sponge_clear_state.fish b/config/fish/functions/_sponge_clear_state.fish new file mode 100644 index 0000000..c6a07da --- /dev/null +++ b/config/fish/functions/_sponge_clear_state.fish @@ -0,0 +1,5 @@ +function _sponge_clear_state + set --erase --global _sponge_current_command + set --erase --global _sponge_current_command_exit_code + set --erase --global _sponge_current_command_previously_in_history +end diff --git a/config/fish/functions/_sponge_on_exit.fish b/config/fish/functions/_sponge_on_exit.fish new file mode 100644 index 0000000..0c6cc19 --- /dev/null +++ b/config/fish/functions/_sponge_on_exit.fish @@ -0,0 +1,3 @@ +function _sponge_on_exit --on-event fish_exit + sponge_delay=0 _sponge_remove_from_history +end diff --git a/config/fish/functions/_sponge_on_postexec.fish b/config/fish/functions/_sponge_on_postexec.fish new file mode 100644 index 0000000..1d67935 --- /dev/null +++ b/config/fish/functions/_sponge_on_postexec.fish @@ -0,0 +1,24 @@ +function _sponge_on_postexec --on-event fish_postexec + set --global _sponge_current_command_exit_code $status + + # Remove command from the queue if it's been added previously + if set --local index (contains --index -- $_sponge_current_command $_sponge_queue) + set --erase _sponge_queue[$index] + end + + # Ignore empty commands + if test -n $_sponge_current_command + set --local command '' + # Run filters + for filter in $sponge_filters + if $filter \ + $_sponge_current_command \ + $_sponge_current_command_exit_code \ + $_sponge_current_command_previously_in_history + set command $_sponge_current_command + break + end + end + set --prepend --global _sponge_queue $command + end +end diff --git a/config/fish/functions/_sponge_on_preexec.fish b/config/fish/functions/_sponge_on_preexec.fish new file mode 100644 index 0000000..a866491 --- /dev/null +++ b/config/fish/functions/_sponge_on_preexec.fish @@ -0,0 +1,16 @@ +function _sponge_on_preexec --on-event fish_preexec \ + --argument-names command + _sponge_clear_state + + set --global _sponge_current_command $command + + builtin history search --case-sensitive --exact --max=1 --null $command \ + | read --local --null found_entries + + # If a command is in the history and in the queue, ignore it, like if it wasn’t in the history + if test (count $found_entries) -ne 0; and not contains $command $_sponge_queue + set --global _sponge_current_command_previously_in_history true + else + set --global _sponge_current_command_previously_in_history false + end +end diff --git a/config/fish/functions/_sponge_on_prompt.fish b/config/fish/functions/_sponge_on_prompt.fish new file mode 100644 index 0000000..03e989a --- /dev/null +++ b/config/fish/functions/_sponge_on_prompt.fish @@ -0,0 +1,5 @@ +function _sponge_on_prompt --on-event fish_prompt + if test $sponge_purge_only_on_exit = false + _sponge_remove_from_history + end +end diff --git a/config/fish/functions/_sponge_remove_from_history.fish b/config/fish/functions/_sponge_remove_from_history.fish new file mode 100644 index 0000000..4d4f827 --- /dev/null +++ b/config/fish/functions/_sponge_remove_from_history.fish @@ -0,0 +1,9 @@ +function _sponge_remove_from_history + + while test (count $_sponge_queue) -gt $sponge_delay + builtin history delete --case-sensitive --exact -- $_sponge_queue[-1] + set --erase _sponge_queue[-1] + end + + builtin history save +end diff --git a/config/fish/functions/sponge_filter_failed.fish b/config/fish/functions/sponge_filter_failed.fish new file mode 100644 index 0000000..be26e5d --- /dev/null +++ b/config/fish/functions/sponge_filter_failed.fish @@ -0,0 +1,11 @@ +function sponge_filter_failed \ + --argument-names command exit_code previously_in_history + + if test $previously_in_history = true -a $sponge_allow_previously_successful = true + return 1 + end + + if contains $exit_code $sponge_successful_exit_codes + return 1 + end +end diff --git a/config/fish/functions/sponge_filter_matched.fish b/config/fish/functions/sponge_filter_matched.fish new file mode 100644 index 0000000..c3c7ea2 --- /dev/null +++ b/config/fish/functions/sponge_filter_matched.fish @@ -0,0 +1,11 @@ +function sponge_filter_matched \ + --argument-names command + + for pattern in $sponge_regex_patterns + if string match --regex --quiet $pattern -- $command + return + end + end + + return 1 +end