diff options
| author | twells46 <173561638+twells46@users.noreply.github.com> | 2025-12-31 13:28:05 -0600 |
|---|---|---|
| committer | twells46 <173561638+twells46@users.noreply.github.com> | 2025-12-31 13:28:05 -0600 |
| commit | 2140ab51deed88e90eafebf9520fa5f9995dc7c9 (patch) | |
| tree | 03cf1dcd2900495c1efb79aaa85f3254ecd5fb87 /dot_config/fish/functions/z.fish | |
| parent | ff8f50638e4b17a9d7cc88d2f0d9560b7effce39 (diff) | |
Migrate from stow
Diffstat (limited to 'dot_config/fish/functions/z.fish')
| -rw-r--r-- | dot_config/fish/functions/z.fish | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/dot_config/fish/functions/z.fish b/dot_config/fish/functions/z.fish new file mode 100644 index 0000000..6b1d535 --- /dev/null +++ b/dot_config/fish/functions/z.fish @@ -0,0 +1,76 @@ +# ============================================================================= +# +# Utility functions for zoxide. +# + +# pwd based on the value of _ZO_RESOLVE_SYMLINKS. +function __zoxide_pwd + builtin pwd -L +end + +# A copy of fish's internal cd function. This makes it possible to use +# `alias cd=z` without causing an infinite loop. +if ! builtin functions --query __zoxide_cd_internal + string replace --regex -- '^function cd\s' 'function __zoxide_cd_internal ' <$__fish_data_dir/functions/cd.fish | source +end + +# cd + custom logic based on the value of _ZO_ECHO. +function __zoxide_cd + if set -q __zoxide_loop + builtin echo "zoxide: infinite loop detected" + builtin echo "Avoid aliasing `cd` to `z` directly, use `zoxide init --cmd=cd fish` instead" + return 1 + end + __zoxide_loop=1 __zoxide_cd_internal $argv +end + +# ============================================================================= +# +# Hook configuration for zoxide. +# + +# Initialize hook to add new entries to the database. +function __zoxide_hook --on-variable PWD + test -z "$fish_private_mode" + and command zoxide add -- (__zoxide_pwd) +end + +# ============================================================================= +# +# When using zoxide with --no-cmd, alias these internal functions as desired. +# + +# Jump to a directory using only keywords. +function z + set -l argc (builtin count $argv) + if test $argc -eq 0 + __zoxide_cd $HOME + else if test "$argv" = - + __zoxide_cd - + else if test $argc -eq 1 -a -d $argv[1] + __zoxide_cd $argv[1] + else if test $argc -eq 2 -a $argv[1] = -- + __zoxide_cd -- $argv[2] + else + set -l result (command zoxide query --exclude (__zoxide_pwd) -- $argv) + and __zoxide_cd $result + end +end + +# Completions. +function __zoxide_z_complete + set -l tokens (builtin commandline --current-process --tokenize) + set -l curr_tokens (builtin commandline --cut-at-cursor --current-process --tokenize) + + if test (builtin count $tokens) -le 2 -a (builtin count $curr_tokens) -eq 1 + # If there are < 2 arguments, use `cd` completions. + complete --do-complete "'' "(builtin commandline --cut-at-cursor --current-token) | string match --regex -- '.*/$' + else if test (builtin count $tokens) -eq (builtin count $curr_tokens) + # If the last argument is empty, use interactive selection. + set -l query $tokens[2..-1] + set -l result (command zoxide query --exclude (__zoxide_pwd) --interactive -- $query) + and __zoxide_cd $result + and builtin commandline --function cancel-commandline repaint + end +end +complete --command __zoxide_z --no-files --arguments '(__zoxide_z_complete)' |