From 98d7e4b3d7f9710068111c5a80dc06f55c0d9dd4 Mon Sep 17 00:00:00 2001 From: afranco Date: Sun, 16 Mar 2025 01:09:34 +0000 Subject: [PATCH] chore(fish): big change --- .../conf.d/{myfunctions.fish => aliases.fish} | 0 .config/fish/conf.d/fishbang.fish | 6 -- .config/fish/config.fish | 10 +- .config/fish/functions/__fzf_complete.fish | 92 +++++++++++++++++++ 4 files changed, 96 insertions(+), 12 deletions(-) rename .config/fish/conf.d/{myfunctions.fish => aliases.fish} (100%) create mode 100644 .config/fish/functions/__fzf_complete.fish diff --git a/.config/fish/conf.d/myfunctions.fish b/.config/fish/conf.d/aliases.fish similarity index 100% rename from .config/fish/conf.d/myfunctions.fish rename to .config/fish/conf.d/aliases.fish diff --git a/.config/fish/conf.d/fishbang.fish b/.config/fish/conf.d/fishbang.fish index a6c6ed2..08b2c0b 100644 --- a/.config/fish/conf.d/fishbang.fish +++ b/.config/fish/conf.d/fishbang.fish @@ -1,5 +1,3 @@ -# Credits to https://github.com/BrewingWeasel/fishbang - function last_history_item echo $history[1] end @@ -57,7 +55,3 @@ abbr -a !^ --position anywhere --function first_history_arg # !^ returns the fir abbr -a !\$ --position anywhere --function last_history_arg # !$ returns the last argument of the last command abbr -a !\* --position anywhere --function history_args # !* returns all arguments of the last command abbr -a bang_nth_arg --position anywhere --regex '!:([0-9]*)' --function nth_history_arg # !$ returns the last argument of the last command - -bind -M insert enter expand-abbr execute -bind -M default enter expand-abbr execute -bind enter expand-abbr execute diff --git a/.config/fish/config.fish b/.config/fish/config.fish index 9c0a4f5..85c7e6b 100644 --- a/.config/fish/config.fish +++ b/.config/fish/config.fish @@ -5,9 +5,7 @@ end set -g fish_greeting fish_vi_key_bindings -bind -M insert \t complete-and-search -bind -M insert --key btab complete - +bind -M insert \t "__fzf_complete" # XDG directories set -x XDG_CONFIG_HOME "$HOME/.config" @@ -35,6 +33,7 @@ end # Common paths fish_add_path /usr/sbin fish_add_path /sbin +fish_add_path $HOME/opt/*/bin fish_add_path $HOME/.local/share/nvim/mason/bin fish_add_path $HOME/.local/bin fish_add_path $HOME/go/bin @@ -46,7 +45,6 @@ if test (uname) = "Darwin" eval (/opt/homebrew/bin/brew shellenv) end +# Set up fzf +set -U FZF_DEFAULT_OPTS "--bind 'bs:backward-delete-char/eof'" fzf --fish | source - -# Added by LM Studio CLI (lms) -set -gx PATH $PATH /Users/afonso/.lmstudio/bin diff --git a/.config/fish/functions/__fzf_complete.fish b/.config/fish/functions/__fzf_complete.fish new file mode 100644 index 0000000..bc9a675 --- /dev/null +++ b/.config/fish/functions/__fzf_complete.fish @@ -0,0 +1,92 @@ +function __fzf_complete -d 'fzf completion and print selection back to commandline' + # As of 2.6, fish's "complete" function does not understand + # subcommands. Instead, we use the same hack as __fish_complete_subcommand and + # extract the subcommand manually. + set -l cmd (commandline -co) (commandline -ct) + + switch $cmd[1] + case env sudo + for i in (seq 2 (count $cmd)) + switch $cmd[$i] + case '-*' + case '*=*' + case '*' + set cmd $cmd[$i..-1] + break + end + end + end + + set -l cmd_lastw $cmd[-1] + set cmd (string join -- ' ' $cmd) + + set -l initial_query '' + test -n "$cmd_lastw"; and set initial_query --query="$cmd_lastw" + + set -l complist (complete -C$cmd) + set -l result + + # do nothing if there is nothing to select from + test -z "$complist"; and return + + set -l compwc (echo $complist | wc -w) + if test $compwc -eq 1 + # if there is only one option dont open fzf + set result "$complist" + else + + set -l query + string join -- \n $complist \ + | eval fzf --height=90% (string escape --no-quoted -- $initial_query) --print-query (__fzf_complete_opts) \ + | cut -f1 \ + | while read -l r + # first line is the user entered query + if test -z "$query" + set query $r + # rest of lines are selected candidates + else + set result $result $r + end + end + + # exit if user canceled + if test -z "$query" ;and test -z "$result" + commandline -f repaint + return + end + + # if user accepted but no candidate matches, use the input as result + if test -z "$result" + set result $query + end + end + + set prefix (string sub -s 1 -l 1 -- (commandline -t)) + for i in (seq (count $result)) + set -l r $result[$i] + switch $prefix + case "'" + commandline -t -- (string escape -- $r) + case '"' + if string match '*"*' -- $r >/dev/null + commandline -t -- (string escape -- $r) + else + commandline -t -- '"'$r'"' + end + case '~' + commandline -t -- (string sub -s 2 (string escape -n -- $r)) + case '*' + commandline -t -- $r + end + [ $i -lt (count $result) ]; and commandline -i ' ' + end + + commandline -f repaint +end + +function __fzf_complete_opts + if set -q FZF_DEFAULT_OPTS + echo $FZF_DEFAULT_OPTS + end + echo --cycle --reverse --inline-info --no-multi --bind tab:down,btab:up +end