about summary refs log tree commit diff
path: root/alpine-river/config/fish/functions/_fzf_search_history.fish
diff options
context:
space:
mode:
authorvenomade <venomade@venomade.com>2025-02-27 17:06:42 +0000
committervenomade <venomade@venomade.com>2025-02-27 17:06:42 +0000
commit1cace80e4832a5d250ef4b7ccd687996563fb01b (patch)
treedb1ced91d1382ca3cabe37dbae00da51231d6a99 /alpine-river/config/fish/functions/_fzf_search_history.fish
Add old dotfiles
Diffstat (limited to 'alpine-river/config/fish/functions/_fzf_search_history.fish')
-rw-r--r--alpine-river/config/fish/functions/_fzf_search_history.fish39
1 files changed, 39 insertions, 0 deletions
diff --git a/alpine-river/config/fish/functions/_fzf_search_history.fish b/alpine-river/config/fish/functions/_fzf_search_history.fish
new file mode 100644
index 0000000..cafbce9
--- /dev/null
+++ b/alpine-river/config/fish/functions/_fzf_search_history.fish
@@ -0,0 +1,39 @@
+function _fzf_search_history --description "Search command history. Replace the command line with the selected command."
+    # history merge incorporates history changes from other fish sessions
+    # it errors out if called in private mode
+    if test -z "$fish_private_mode"
+        builtin history merge
+    end
+
+    if not set --query fzf_history_time_format
+        # Reference https://devhints.io/strftime to understand strftime format symbols
+        set -f fzf_history_time_format "%m-%d %H:%M:%S"
+    end
+
+    # Delinate time from command in history entries using the vertical box drawing char (U+2502).
+    # Then, to get raw command from history entries, delete everything up to it. The ? on regex is
+    # necessary to make regex non-greedy so it won't match into commands containing the char.
+    set -f time_prefix_regex '^.*? │ '
+    # Delinate commands throughout pipeline using null rather than newlines because commands can be multi-line
+    set -f commands_selected (
+        builtin history --null --show-time="$fzf_history_time_format │ " |
+        _fzf_wrapper --read0 \
+            --print0 \
+            --multi \
+            --scheme=history \
+            --prompt="History> " \
+            --query=(commandline) \
+            --preview="string replace --regex '$time_prefix_regex' '' -- {} | fish_indent --ansi" \
+            --preview-window="bottom:3:wrap" \
+            $fzf_history_opts |
+        string split0 |
+        # remove timestamps from commands selected
+        string replace --regex $time_prefix_regex ''
+    )
+
+    if test $status -eq 0
+        commandline --replace -- $commands_selected
+    end
+
+    commandline --function repaint
+end