aboutsummaryrefslogtreecommitdiff
path: root/dot_config/fish/functions/z.fish
diff options
context:
space:
mode:
Diffstat (limited to 'dot_config/fish/functions/z.fish')
-rw-r--r--dot_config/fish/functions/z.fish76
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)'