summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2022-04-30 09:23:09 +0300
committerLars Wirzenius <liw@liw.fi>2022-04-30 09:23:09 +0300
commit4cdf2df9f0f592caed7abe6669b88d7599a1dc8b (patch)
treec2984c7f30055700c72fd83fc1a27c6974a13c7c
parentc86895637dee5a95be3509d4a2e87fa9c866946d (diff)
downloadliw-dot-files-4cdf2df9f0f592caed7abe6669b88d7599a1dc8b.tar.gz
bashrc-zoxide: add
Sponsored-by: author
-rw-r--r--bashrc-zoxide130
1 files changed, 130 insertions, 0 deletions
diff --git a/bashrc-zoxide b/bashrc-zoxide
new file mode 100644
index 0000000..c26c9a4
--- /dev/null
+++ b/bashrc-zoxide
@@ -0,0 +1,130 @@
+# =============================================================================
+#
+# Utility functions for zoxide.
+#
+
+# pwd based on the value of _ZO_RESOLVE_SYMLINKS.
+function __zoxide_pwd() {
+ \builtin pwd -L
+}
+
+# cd + custom logic based on the value of _ZO_ECHO.
+function __zoxide_cd() {
+ # shellcheck disable=SC2164
+ \builtin cd "$@"
+}
+
+# =============================================================================
+#
+# Hook configuration for zoxide.
+#
+
+# Hook to add new entries to the database.
+__zoxide_oldpwd="$(__zoxide_pwd)"
+
+function __zoxide_hook() {
+ \builtin local -r retval="$?"
+ \builtin local pwd_tmp
+ pwd_tmp="$(__zoxide_pwd)"
+ if [[ ${__zoxide_oldpwd} != "${pwd_tmp}" ]]; then
+ __zoxide_oldpwd="${pwd_tmp}"
+ \command zoxide add -- "${__zoxide_oldpwd}"
+ fi
+ return "${retval}"
+}
+
+# Initialize hook.
+if [[ ${PROMPT_COMMAND:=} != *'__zoxide_hook'* ]]; then
+ PROMPT_COMMAND="__zoxide_hook;${PROMPT_COMMAND#;}"
+fi
+
+# =============================================================================
+#
+# When using zoxide with --no-aliases, alias these internal functions as
+# desired.
+#
+
+__zoxide_z_prefix='z#'
+
+# Jump to a directory using only keywords.
+function __zoxide_z() {
+ # shellcheck disable=SC2199
+ if [[ $# -eq 0 ]]; then
+ __zoxide_cd ~
+ elif [[ $# -eq 1 && $1 == '-' ]]; then
+ __zoxide_cd "${OLDPWD}"
+ elif [[ $# -eq 1 && -d $1 ]]; then
+ __zoxide_cd "$1"
+ elif [[ ${@: -1} == "${__zoxide_z_prefix}"* ]]; then
+ # shellcheck disable=SC2124
+ \builtin local result="${@: -1}"
+ __zoxide_cd "${result:${#__zoxide_z_prefix}}"
+ else
+ \builtin local result
+ result="$(\command zoxide query --exclude "$(__zoxide_pwd || \builtin true)" -- "$@")" &&
+ __zoxide_cd "${result}"
+ fi
+}
+
+# Jump to a directory using interactive search.
+function __zoxide_zi() {
+ \builtin local result
+ result="$(\command zoxide query -i -- "$@")" && __zoxide_cd "${result}"
+}
+
+# =============================================================================
+#
+# Convenient aliases for zoxide. Disable these using --no-aliases.
+#
+
+# Remove definitions.
+function __zoxide_unset() {
+ \builtin unset -f "$@" &>/dev/null
+ \builtin unset -v "$@" &>/dev/null
+ \builtin unalias "$@" &>/dev/null || \builtin :
+}
+
+__zoxide_unset z
+function z() {
+ __zoxide_z "$@"
+}
+
+__zoxide_unset zi
+function zi() {
+ __zoxide_zi "$@"
+}
+
+# Load completions.
+# - Bash 4.0+ is needed to use `mapfile`.
+# - Completions require line editing. Since Bash supports only two modes of
+# line editing (`vim` and `emacs`), we check if either them is enabled.
+# - Completions don't work on `dumb` terminals.
+if [[ ${BASH_VERSINFO:-0} -ge 4 && :"${SHELLOPTS}": =~ :(vi|emacs): && ${TERM} != 'dumb' ]]; then
+ # Use `printf '\e[5n'` to redraw line after fzf closes.
+ \builtin bind '"\e[0n": redraw-current-line' &>/dev/null
+
+ function _z() {
+ # Only show completions when the cursor is at the end of the line.
+ [[ ${#COMP_WORDS[@]} -eq $((COMP_CWORD + 1)) ]] || return
+
+ # If there is only one argument, use `cd` completions.
+ if [[ ${#COMP_WORDS[@]} -eq 2 ]]; then
+ \builtin mapfile -t COMPREPLY < \
+ <(\builtin compgen -A directory -S / -- "${COMP_WORDS[-1]}" || \builtin true)
+ # If there is a space after the last word, use interactive selection.
+ elif [[ -z ${COMP_WORDS[-1]} ]]; then
+ \builtin local result
+ result="$(\command zoxide query -i -- "${COMP_WORDS[@]:1:${#COMP_WORDS[@]}-2}")" &&
+ COMPREPLY=("${__zoxide_z_prefix}${result@Q}")
+ \builtin printf '\e[5n'
+ fi
+ }
+
+ \builtin complete -F _z -o nospace -- z
+fi
+
+# =============================================================================
+#
+# To initialize zoxide, add this to your configuration (usually ~/.bashrc):
+#
+# eval "$(zoxide init bash)"