Install the zoxide plugin

This commit is contained in:
2025-09-08 19:56:58 +02:00
parent 7dad183fbf
commit b161a45bfd
4 changed files with 150 additions and 1 deletions

41
completions/zoxide.fish Normal file
View File

@@ -0,0 +1,41 @@
set -l commands add help import init query remove
# disable normal all-files completion
complete -c zoxide -f
# onyl show base options if none was used already
complete -c zoxide -n __fish_use_subcommand -a add -d "Add a new directory or increment its rank"
complete -c zoxide -n __fish_use_subcommand -a help -d "Prints this message or the help of the given subcommand(s)"
complete -c zoxide -n __fish_use_subcommand -a import -d "Import from z database"
complete -c zoxide -n __fish_use_subcommand -a init -d "Generates shell configuration"
complete -c zoxide -n __fish_use_subcommand -a query -d "Search for a directory"
complete -c zoxide -n __fish_use_subcommand -a remove -d "Remove a directory"
# zoxide add
complete -c zoxide -n "_zoxide_equals_first_token add" -n "__fish_is_nth_token 2" -a "(__fish_complete_directories)"
# zoxide help
complete -c zoxide -n "_zoxide_equals_first_token help" -n "__fish_is_nth_token 2" -a "$commands"
# zoxide import
complete -c zoxide -r -F -n "_zoxide_equals_first_token import" -n "__fish_is_nth_token 2"
complete -c zoxide -r -n "_zoxide_equals_first_token import" -l merge -d "Merge entries into existing database"
# zoxide init
set -l initshells bash fish posix powershell zsh
complete -c zoxide -n "_zoxide_equals_first_token init" -n "__fish_is_nth_token 2" -a "$initshells"
complete -c zoxide -n "_zoxide_equals_first_token init" -l cmd -d "Renames the 'z' command and corresponding aliases [default: z]"
complete -c zoxide -n "_zoxide_equals_first_token init" -l hook -a "none prompt pwd" -d "Chooses event on which an entry is added to the database [default: pwd]"
complete -c zoxide -n "_zoxide_equals_first_token init" -l no-aliases -d "Prevents zoxide from defining any commands other than 'z'"
# zoxide query
complete -c zoxide -r -n "_zoxide_equals_first_token query" -s i -l interactive -d "Opens an interactive selection menu using fzf"
complete -c zoxide -r -n "_zoxide_equals_first_token query" -s l -l list -d "List all matching directories"
complete -c zoxide -r -n "_zoxide_equals_first_token query" -s s -l score -d "Display score along with result"
# zoxide remove
complete -c zoxide -n "_zoxide_equals_first_token remove" -n "__fish_is_nth_token 2" -a "(zoxide query -l)"
# Always possible
complete -c zoxide -x -s h -l help -d "Prints help information"
complete -c zoxide -x -s V -l version -d "Prints version information"

View File

@@ -1 +1,65 @@
zoxide init fish | source if status is-interactive
if type -q zoxide
# -------------
# 'zoxide init fish' is very different for different versions of zoxide
# to guarantee the same behavior we define these functions ourself,
# especially because the apt package is so old
# most of these functions were taken from https://github.com/ajeetdsouza/zoxide
# from version 0.8.1
if ! builtin functions -q _zoxide_cd
if builtin functions -q cd
builtin functions -c cd _zoxide_cd
else
alias _zoxide_cd='builtin cd'
end
end
function _zoxide_hook --on-variable PWD
test -z "$fish_private_mode"
and command zoxide add -- (builtin pwd -L)
end
function z
set argc (count $argv)
if test $argc -eq 0
_zoxide_cd $HOME
else if test "$argv" = -
_zoxide_cd -
else if test -d $argv[-1]
_zoxide_cd $argv[-1]
else
set -l result (command zoxide query $argv)
and _zoxide_cd $result
end
end
function zi
set -l result (command zoxide query -i -- $argv)
and _zoxide_cd $result
end
# -------------
alias cd=z
# use custom completion
complete -c z -f # disable files by default
complete -c z -x -a '(_zoxide_z_complete)'
else
echo "[plugin: zoxide] Command 'zoxide' cannot be found. Not installed or not in path"
end
end
function _zoxide_uninstall --on-event zoxide_uninstall
if alias | grep "alias cd z" >/dev/null
functions -e cd
end
if builtin functions -q _zoxide_cd && not functions -q cd
# restore old cd
builtin functions -c _zoxide_cd cd
end
end

View File

@@ -3,3 +3,4 @@ edc/bass
jorgebucaran/fisher jorgebucaran/fisher
shinriyo/breeze shinriyo/breeze
ilancosman/tide@v6 ilancosman/tide@v6
icezyclon/zoxide.fish

43
functions/zoxide.fish Normal file
View File

@@ -0,0 +1,43 @@
function _zoxide_z_complete -d "Complete directory first or zoxide queries otherwise" --argument-names comp desc
# most of this functions is compied from __fish_complete_directories with a small tweak
# comp is the currently completing token
if not set -q comp[1]
set comp (commandline -ct)
end
# cmd are all tokens including the current one except the command
set -l cmd (commandline -opc) $comp
set -e cmd[1]
if test "$comp" = "$cmd"
# if we are on our first token, then allow file complete
# otherwise use zoxide (for multi word zoxide query)
# HACK: We call into the file completions by using a non-existent command.
# If we used e.g. `ls`, we'd run the risk of completing its options or another kind of argument.
# But since we default to file completions, if something doesn't have another completion...
set -f dirs (complete -C"nonexistentcommandooheehoohaahaahdingdongwallawallabingbang $comp" | string match -r '.*/$')
end
# in the future: replace entire cmd with tab complete instead of only last token
# at the moment: is handled in z function to always enter last token if directory
if set -q dirs[1]
# if we find any files to complete use those
printf "%s\t$desc\n" $dirs
else
# otherwise use zoxide
zoxide query -l $cmd
end
end
function _zoxide_equals_first_token -a check -d "Test if first non-switch token equals given one"
set -l tokens (commandline -co)
set -e tokens[1]
set -l tokens (string replace -r --filter '^([^-].*)' '$1' -- $tokens)
if set -q tokens[1]
test $tokens[1] = $check
else
return 1
end
end