From 6d0ba18003740656987e0556ecc43f35e2541929 Mon Sep 17 00:00:00 2001 From: Douglas Sellers Date: Wed, 18 Feb 2026 14:19:16 -0800 Subject: [PATCH] feat: add `z --` to jump to last rested directory Add a new `z --` command that jumps back to the last directory the user stayed in for at least 5 seconds. The threshold is configurable via the `_ZO_REST_THRESHOLD` environment variable (default: 5). This is implemented entirely in the shell templates with no Rust binary changes. Each shell hook now tracks dwell time per directory and records the last "rested" directory in a session-local variable. Supported across all 9 shells: bash, zsh, fish, posix, powershell, elvish, nushell, tcsh, and xonsh. Co-Authored-By: Claude Opus 4.6 --- README.md | 6 ++++++ templates/bash.txt | 35 +++++++++++++++++++++++++++++++-- templates/elvish.txt | 37 +++++++++++++++++++++++++++++++++-- templates/fish.txt | 42 ++++++++++++++++++++++++++++++++++++++-- templates/nushell.txt | 37 +++++++++++++++++++++++++++++++++-- templates/posix.txt | 25 +++++++++++++++++++++++- templates/powershell.txt | 30 ++++++++++++++++++++++++++++ templates/tcsh.txt | 37 +++++++++++++++++++++++++++++++++-- templates/xonsh.txt | 22 +++++++++++++++++++++ templates/zsh.txt | 26 ++++++++++++++++++++++++- 10 files changed, 285 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b397f82..1e1c1af 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ z ~/foo # z also works like a regular cd command z foo/ # cd into relative path z .. # cd one level up z - # cd into previous directory +z -- # cd into last directory you stayed in for 5+ seconds zi foo # cd with interactive selection (using fzf) @@ -452,6 +453,11 @@ Environment variables[^2] can be used for configuration. They must be set before - `_ZO_RESOLVE_SYMLINKS` - When set to 1, `z` will resolve symlinks before adding directories to the database. +- `_ZO_REST_THRESHOLD` + - Sets the minimum number of seconds you must stay in a directory before it is + saved as a "rested" directory. Running `z --` will jump back to the last + rested directory. + - By default, this is set to 5. ## Third-party integrations diff --git a/templates/bash.txt b/templates/bash.txt index 86a2884..6570feb 100644 --- a/templates/bash.txt +++ b/templates/bash.txt @@ -37,8 +37,19 @@ function __zoxide_cd() { {%- if hook == InitHook::Prompt %} function __zoxide_hook() { \builtin local -r retval="$?" + \builtin local __zoxide_pwd_tmp + __zoxide_pwd_tmp="$(__zoxide_pwd)" + if [[ ${__zoxide_current_dir:-} != "${__zoxide_pwd_tmp}" ]]; then + \builtin local __zoxide_now="${SECONDS}" + \builtin local __zoxide_elapsed=$(( __zoxide_now - ${__zoxide_entered_at:-0} )) + if [[ ${__zoxide_elapsed} -ge ${__zoxide_rest_threshold:-5} && -n ${__zoxide_current_dir:-} ]]; then + __zoxide_last_rested="${__zoxide_current_dir}" + fi + __zoxide_entered_at="${__zoxide_now}" + __zoxide_current_dir="${__zoxide_pwd_tmp}" + fi # shellcheck disable=SC2312 - \command zoxide add -- "$(__zoxide_pwd)" + \command zoxide add -- "${__zoxide_pwd_tmp}" return "${retval}" } @@ -50,13 +61,26 @@ function __zoxide_hook() { \builtin local pwd_tmp pwd_tmp="$(__zoxide_pwd)" if [[ ${__zoxide_oldpwd} != "${pwd_tmp}" ]]; then + \builtin local __zoxide_now="${SECONDS}" + \builtin local __zoxide_elapsed=$(( __zoxide_now - ${__zoxide_entered_at:-0} )) + if [[ ${__zoxide_elapsed} -ge ${__zoxide_rest_threshold:-5} && -n ${__zoxide_current_dir:-} ]]; then + __zoxide_last_rested="${__zoxide_current_dir}" + fi + __zoxide_entered_at="${__zoxide_now}" + __zoxide_current_dir="${pwd_tmp}" __zoxide_oldpwd="${pwd_tmp}" - \command zoxide add -- "${__zoxide_oldpwd}" + \command zoxide add -- "${pwd_tmp}" fi return "${retval}" } {%- endif %} +# Rest tracking for z --. +__zoxide_rest_threshold="${_ZO_REST_THRESHOLD:-5}" +__zoxide_entered_at="${SECONDS}" +__zoxide_current_dir="$(__zoxide_pwd)" +__zoxide_last_rested="" + # Initialize hook. if [[ ${PROMPT_COMMAND:=} != *'__zoxide_hook'* ]]; then if [[ "$(declare -p PROMPT_COMMAND 2>&1)" == "declare -a"* ]]; then @@ -113,6 +137,13 @@ function __zoxide_z() { __zoxide_cd "${OLDPWD}" elif [[ $# -eq 1 && -d $1 ]]; then __zoxide_cd "$1" + elif [[ $# -eq 1 && $1 == '--' ]]; then + if [[ -n ${__zoxide_last_rested:-} ]]; then + __zoxide_cd "${__zoxide_last_rested}" + else + \builtin printf 'zoxide: no rested directory found\n' >&2 + return 1 + fi elif [[ $# -eq 2 && $1 == '--' ]]; then __zoxide_cd "$2" elif [[ ${@: -1} == "${__zoxide_z_prefix}"?* ]]; then diff --git a/templates/elvish.txt b/templates/elvish.txt index 3de0e1d..7ce4ce9 100644 --- a/templates/elvish.txt +++ b/templates/elvish.txt @@ -3,6 +3,7 @@ use builtin use path +use time {{ section }} # Utility functions for zoxide. @@ -32,12 +33,38 @@ set builtin:before-chdir = [$@builtin:before-chdir {|_| set oldpwd = $builtin:pw if (builtin:not (builtin:eq $E:__zoxide_shlvl $E:SHLVL)) { set E:__zoxide_shlvl = $E:SHLVL {%- if hook == InitHook::Prompt %} - set edit:before-readline = [$@edit:before-readline {|| zoxide add -- $pwd }] + set edit:before-readline = [$@edit:before-readline {|| + if (builtin:not-eq $__zoxide_current_dir $pwd) { + var now = (num (time:now)[unix]) + var elapsed = (- $now $__zoxide_entered_at) + if (and (>= $elapsed $__zoxide_rest_threshold) (builtin:not-eq $__zoxide_current_dir '')) { + set __zoxide_last_rested = $__zoxide_current_dir + } + set __zoxide_entered_at = $now + set __zoxide_current_dir = $pwd + } + zoxide add -- $pwd + }] {%- else if hook == InitHook::Pwd %} - set builtin:after-chdir = [$@builtin:after-chdir {|_| zoxide add -- $pwd }] + set builtin:after-chdir = [$@builtin:after-chdir {|_| + var now = (num (time:now)[unix]) + var elapsed = (- $now $__zoxide_entered_at) + if (and (>= $elapsed $__zoxide_rest_threshold) (builtin:not-eq $__zoxide_current_dir '')) { + set __zoxide_last_rested = $__zoxide_current_dir + } + set __zoxide_entered_at = $now + set __zoxide_current_dir = $pwd + zoxide add -- $pwd + }] {%- endif %} } +# Rest tracking for z --. +var __zoxide_rest_threshold = (if (builtin:not-eq $E:_ZO_REST_THRESHOLD '') { num $E:_ZO_REST_THRESHOLD } else { num 5 }) +var __zoxide_entered_at = (num (time:now)[unix]) +var __zoxide_current_dir = $builtin:pwd +var __zoxide_last_rested = '' + {%- endif %} {{ section }} @@ -52,6 +79,12 @@ fn __zoxide_z {|@rest| __zoxide_cd $oldpwd } elif (and ('builtin:==' (builtin:count $rest) 1) (path:is-dir &follow-symlink=$true $rest[0])) { __zoxide_cd $rest[0] + } elif (builtin:eq [--] $rest) { + if (builtin:not-eq $__zoxide_last_rested '') { + __zoxide_cd $__zoxide_last_rested + } else { + fail "zoxide: no rested directory found" + } } else { var path try { diff --git a/templates/fish.txt b/templates/fish.txt index a13edc7..f51b6c7 100644 --- a/templates/fish.txt +++ b/templates/fish.txt @@ -59,12 +59,43 @@ end # Initialize hook to add new entries to the database. {%- if hook == InitHook::Prompt %} function __zoxide_hook --on-event fish_prompt + set -l __zoxide_pwd_tmp (__zoxide_pwd) + if test "$__zoxide_current_dir" != "$__zoxide_pwd_tmp" + set -l __zoxide_now (command date +%s) + set -l __zoxide_elapsed (math $__zoxide_now - $__zoxide_entered_at) + if test $__zoxide_elapsed -ge $__zoxide_rest_threshold -a -n "$__zoxide_current_dir" + set -g __zoxide_last_rested $__zoxide_current_dir + end + set -g __zoxide_entered_at $__zoxide_now + set -g __zoxide_current_dir $__zoxide_pwd_tmp + end + test -z "$fish_private_mode" + and command zoxide add -- $__zoxide_pwd_tmp +end {%- else if hook == InitHook::Pwd %} function __zoxide_hook --on-variable PWD -{%- endif %} + set -l __zoxide_now (command date +%s) + set -l __zoxide_elapsed (math $__zoxide_now - $__zoxide_entered_at) + set -l __zoxide_pwd_tmp (__zoxide_pwd) + if test $__zoxide_elapsed -ge $__zoxide_rest_threshold -a -n "$__zoxide_current_dir" + set -g __zoxide_last_rested $__zoxide_current_dir + end + set -g __zoxide_entered_at $__zoxide_now + set -g __zoxide_current_dir $__zoxide_pwd_tmp test -z "$fish_private_mode" - and command zoxide add -- (__zoxide_pwd) + and command zoxide add -- $__zoxide_pwd_tmp end +{%- endif %} + +# Rest tracking for z --. +if set -q _ZO_REST_THRESHOLD + set -g __zoxide_rest_threshold $_ZO_REST_THRESHOLD +else + set -g __zoxide_rest_threshold 5 +end +set -g __zoxide_entered_at (command date +%s) +set -g __zoxide_current_dir (__zoxide_pwd) +set -g __zoxide_last_rested "" {%- endif %} @@ -81,6 +112,13 @@ function __zoxide_z __zoxide_cd - else if test $argc -eq 1 -a -d $argv[1] __zoxide_cd $argv[1] + else if test $argc -eq 1 -a "$argv[1]" = -- + if test -n "$__zoxide_last_rested" + __zoxide_cd $__zoxide_last_rested + else + builtin echo "zoxide: no rested directory found" >&2 + return 1 + end else if test $argc -eq 2 -a $argv[1] = -- __zoxide_cd -- $argv[2] else diff --git a/templates/nushell.txt b/templates/nushell.txt index 4153b39..a54197a 100644 --- a/templates/nushell.txt +++ b/templates/nushell.txt @@ -26,7 +26,18 @@ export-env { if not $__zoxide_hooked { $env.config.hooks.pre_prompt = ($env.config.hooks.pre_prompt | append { __zoxide_hook: true, - code: {|| ^zoxide add -- $env.PWD} + code: {|| + if $env.__zoxide_current_dir != $env.PWD { + let now = (date now | format date '%s' | into int) + let elapsed = $now - $env.__zoxide_entered_at + if $elapsed >= $env.__zoxide_rest_threshold and ($env.__zoxide_current_dir | is-not-empty) { + $env.__zoxide_last_rested = $env.__zoxide_current_dir + } + $env.__zoxide_entered_at = $now + $env.__zoxide_current_dir = $env.PWD + } + ^zoxide add -- $env.PWD + } }) } {%- else if hook == InitHook::Pwd %} @@ -43,10 +54,25 @@ export-env { if not $__zoxide_hooked { $env.config.hooks.env_change.PWD = ($env.config.hooks.env_change.PWD | append { __zoxide_hook: true, - code: {|_, dir| ^zoxide add -- $dir} + code: {|_, dir| + let now = (date now | format date '%s' | into int) + let elapsed = $now - $env.__zoxide_entered_at + if $elapsed >= $env.__zoxide_rest_threshold and ($env.__zoxide_current_dir | is-not-empty) { + $env.__zoxide_last_rested = $env.__zoxide_current_dir + } + $env.__zoxide_entered_at = $now + $env.__zoxide_current_dir = $dir + ^zoxide add -- $dir + } }) } {%- endif %} + + # Rest tracking for z --. + $env.__zoxide_rest_threshold = (try { $env._ZO_REST_THRESHOLD | into int } catch { 5 }) + $env.__zoxide_entered_at = (date now | format date '%s' | into int) + $env.__zoxide_current_dir = $env.PWD + $env.__zoxide_last_rested = '' } {%- endif %} @@ -61,6 +87,13 @@ def --env --wrapped __zoxide_z [...rest: string] { [] => {'~'}, [ '-' ] => {'-'}, [ $arg ] if ($arg | path expand | path type) == 'dir' => {$arg} + [ '--' ] => { + if $env.__zoxide_last_rested != '' { + $env.__zoxide_last_rested + } else { + error make {msg: "zoxide: no rested directory found"} + } + } _ => { ^zoxide query --exclude $env.PWD -- ...$rest | str trim -r -c "\n" } diff --git a/templates/posix.txt b/templates/posix.txt index b3f660c..980cc7d 100644 --- a/templates/posix.txt +++ b/templates/posix.txt @@ -48,9 +48,25 @@ __zoxide_cd() { {%- when InitHook::Prompt -%} # Hook to add new entries to the database. __zoxide_hook() { - \command zoxide add -- "$(__zoxide_pwd || \command true)" + __zoxide_hook_pwd="$(__zoxide_pwd || \command true)" + if [ "${__zoxide_current_dir}" != "${__zoxide_hook_pwd}" ]; then + __zoxide_hook_now="$(\command date +%s)" + __zoxide_hook_elapsed=$(( __zoxide_hook_now - __zoxide_entered_at )) + if [ "${__zoxide_hook_elapsed}" -ge "${__zoxide_rest_threshold}" ] && [ -n "${__zoxide_current_dir}" ]; then + __zoxide_last_rested="${__zoxide_current_dir}" + fi + __zoxide_entered_at="${__zoxide_hook_now}" + __zoxide_current_dir="${__zoxide_hook_pwd}" + fi + \command zoxide add -- "${__zoxide_hook_pwd}" } +# Rest tracking for z --. +__zoxide_rest_threshold="${_ZO_REST_THRESHOLD:-5}" +__zoxide_entered_at="$(\command date +%s)" +__zoxide_current_dir="$(__zoxide_pwd || \command true)" +__zoxide_last_rested="" + # Initialize hook. if [ "${PS1:=}" = "${PS1#*\$(__zoxide_hook)}" ]; then PS1="${PS1}\$(__zoxide_hook)" @@ -107,6 +123,13 @@ __zoxide_z() { fi elif [ "$#" -eq 1 ] && [ -d "$1" ]; then __zoxide_cd "$1" + elif [ "$#" -eq 1 ] && [ "$1" = '--' ]; then + if [ -n "${__zoxide_last_rested}" ]; then + __zoxide_cd "${__zoxide_last_rested}" + else + \command printf 'zoxide: no rested directory found\n' >&2 + return 1 + fi else __zoxide_result="$(\command zoxide query --exclude "$(__zoxide_pwd || \command true)" -- "$@")" && __zoxide_cd "${__zoxide_result}" diff --git a/templates/powershell.txt b/templates/powershell.txt index 046061c..ba01e21 100644 --- a/templates/powershell.txt +++ b/templates/powershell.txt @@ -62,6 +62,15 @@ function global:__zoxide_cd($dir, $literal) { function global:__zoxide_hook { $result = __zoxide_pwd if ($null -ne $result) { + if ($global:__zoxide_current_dir -ne $result) { + $now = [DateTimeOffset]::Now.ToUnixTimeSeconds() + $elapsed = $now - $global:__zoxide_entered_at + if ($elapsed -ge $global:__zoxide_rest_threshold -and $null -ne $global:__zoxide_current_dir -and $global:__zoxide_current_dir -ne '') { + $global:__zoxide_last_rested = $global:__zoxide_current_dir + } + $global:__zoxide_entered_at = $now + $global:__zoxide_current_dir = $result + } zoxide add "--" $result } } @@ -71,6 +80,13 @@ $global:__zoxide_oldpwd = __zoxide_pwd function global:__zoxide_hook { $result = __zoxide_pwd if ($result -ne $global:__zoxide_oldpwd) { + $now = [DateTimeOffset]::Now.ToUnixTimeSeconds() + $elapsed = $now - $global:__zoxide_entered_at + if ($elapsed -ge $global:__zoxide_rest_threshold -and $null -ne $global:__zoxide_current_dir -and $global:__zoxide_current_dir -ne '') { + $global:__zoxide_last_rested = $global:__zoxide_current_dir + } + $global:__zoxide_entered_at = $now + $global:__zoxide_current_dir = $result if ($null -ne $result) { zoxide add "--" $result } @@ -79,6 +95,12 @@ function global:__zoxide_hook { } {%- endif %} +# Rest tracking for z --. +$global:__zoxide_rest_threshold = if ($null -ne $env:_ZO_REST_THRESHOLD) { [int]$env:_ZO_REST_THRESHOLD } else { 5 } +$global:__zoxide_entered_at = [DateTimeOffset]::Now.ToUnixTimeSeconds() +$global:__zoxide_current_dir = __zoxide_pwd +$global:__zoxide_last_rested = '' + # Initialize hook. $global:__zoxide_hooked = (Get-Variable __zoxide_hooked -ErrorAction Ignore -ValueOnly) if ($global:__zoxide_hooked -ne 1) { @@ -112,6 +134,14 @@ function global:__zoxide_z { elseif ($args.Length -eq 1 -and (Test-Path -PathType Container -Path $args[0] )) { __zoxide_cd $args[0] $false } + elseif ($args.Length -eq 1 -and $args[0] -eq '--') { + if ($null -ne $global:__zoxide_last_rested -and $global:__zoxide_last_rested -ne '') { + __zoxide_cd $global:__zoxide_last_rested $true + } + else { + Write-Error "zoxide: no rested directory found" + } + } else { $result = __zoxide_pwd if ($null -ne $result) { diff --git a/templates/tcsh.txt b/templates/tcsh.txt index b0559a0..a3ec449 100644 --- a/templates/tcsh.txt +++ b/templates/tcsh.txt @@ -15,13 +15,40 @@ # Hook to add new entries to the database. {%- if hook == InitHook::Prompt %} -alias __zoxide_hook 'zoxide add -- "`{{ pwd_cmd }}`"' +alias __zoxide_hook 'set __zoxide_hook_pwd = "`{{ pwd_cmd }}`"\ +; if ("$__zoxide_hook_pwd" != "$__zoxide_current_dir") then\ +; set __zoxide_hook_now = `date +%s`\ +; @ __zoxide_hook_elapsed = $__zoxide_hook_now - $__zoxide_entered_at\ +; if ($__zoxide_hook_elapsed >= $__zoxide_rest_threshold && "$__zoxide_current_dir" != "") set __zoxide_last_rested = "$__zoxide_current_dir"\ +; set __zoxide_entered_at = "$__zoxide_hook_now"\ +; set __zoxide_current_dir = "$__zoxide_hook_pwd"\ +; endif\ +; zoxide add -- "$__zoxide_hook_pwd"' {%- else if hook == InitHook::Pwd %} set __zoxide_pwd_old = `{{ pwd_cmd }}` -alias __zoxide_hook 'set __zoxide_pwd_tmp = "`{{ pwd_cmd }}`"; test "$__zoxide_pwd_tmp" != "$__zoxide_pwd_old" && zoxide add -- "$__zoxide_pwd_tmp"; set __zoxide_pwd_old = "$__zoxide_pwd_tmp"' +alias __zoxide_hook 'set __zoxide_pwd_tmp = "`{{ pwd_cmd }}`"\ +; if ("$__zoxide_pwd_tmp" != "$__zoxide_pwd_old") then\ +; set __zoxide_hook_now = `date +%s`\ +; @ __zoxide_hook_elapsed = $__zoxide_hook_now - $__zoxide_entered_at\ +; if ($__zoxide_hook_elapsed >= $__zoxide_rest_threshold && "$__zoxide_current_dir" != "") set __zoxide_last_rested = "$__zoxide_current_dir"\ +; set __zoxide_entered_at = "$__zoxide_hook_now"\ +; set __zoxide_current_dir = "$__zoxide_pwd_tmp"\ +; zoxide add -- "$__zoxide_pwd_tmp"\ +; endif\ +; set __zoxide_pwd_old = "$__zoxide_pwd_tmp"' {%- endif %} +# Rest tracking for z --. +if ($?_ZO_REST_THRESHOLD) then + set __zoxide_rest_threshold = "$_ZO_REST_THRESHOLD" +else + set __zoxide_rest_threshold = 5 +endif +set __zoxide_entered_at = `date +%s` +set __zoxide_current_dir = `{{ pwd_cmd }}` +set __zoxide_last_rested = "" + # Initialize hook. alias precmd ';__zoxide_hook' @@ -38,6 +65,12 @@ if ("$#__zoxide_args" == 0) then\ else\ if ("$#__zoxide_args" == 1 && "$__zoxide_args[1]" == "-") then\ cd -\ + else if ("$#__zoxide_args" == 1 && "$__zoxide_args[1]" == "--") then\ + if ("$__zoxide_last_rested" != "") then\ + cd "$__zoxide_last_rested"\ + else\ + echo "zoxide: no rested directory found"\ + endif\ else if ("$#__zoxide_args" == 1 && -d "$__zoxide_args[1]") then\ cd "$__zoxide_args[1]"\ else\ diff --git a/templates/xonsh.txt b/templates/xonsh.txt index f5c92f2..fd451e1 100644 --- a/templates/xonsh.txt +++ b/templates/xonsh.txt @@ -8,6 +8,7 @@ import os import os.path import subprocess import sys +import time import typing import xonsh.dirstack # type: ignore # pylint: disable=import-error @@ -98,13 +99,29 @@ if "__zoxide_hook" not in globals(): {%- endif %} def __zoxide_hook(**_kwargs: typing.Any) -> None: """Hook to add new entries to the database.""" + global __zoxide_entered_at, __zoxide_current_dir, __zoxide_last_rested # pylint: disable=global-statement pwd = __zoxide_pwd() + if __zoxide_current_dir != pwd: + now = time.time() + elapsed = now - __zoxide_entered_at + if elapsed >= __zoxide_rest_threshold and __zoxide_current_dir: + __zoxide_last_rested = __zoxide_current_dir + __zoxide_entered_at = now + __zoxide_current_dir = pwd zoxide = __zoxide_bin() subprocess.run( [zoxide, "add", "--", pwd], check=False, env=__zoxide_env(), ) + + +# Rest tracking for z --. +if "__zoxide_rest_threshold" not in globals(): + __zoxide_rest_threshold = int(os.environ.get("_ZO_REST_THRESHOLD", "5")) + __zoxide_entered_at: float = time.time() + __zoxide_current_dir: typing.Optional[str] = __zoxide_pwd() + __zoxide_last_rested: typing.Optional[str] = None {% endif %} {{ section }} @@ -121,6 +138,11 @@ def __zoxide_z(args: list[str]) -> None: __zoxide_cd("-") elif len(args) == 1 and os.path.isdir(args[0]): __zoxide_cd(args[0]) + elif args == ["--"]: + if __zoxide_last_rested is not None: + __zoxide_cd(__zoxide_last_rested) + else: + raise RuntimeError("no rested directory found") else: try: zoxide = __zoxide_bin() diff --git a/templates/zsh.txt b/templates/zsh.txt index a66f960..f232d48 100644 --- a/templates/zsh.txt +++ b/templates/zsh.txt @@ -34,10 +34,27 @@ function __zoxide_cd() { # Hook to add new entries to the database. function __zoxide_hook() { + \builtin local __zoxide_pwd_tmp + __zoxide_pwd_tmp="$(__zoxide_pwd)" + if [[ "${__zoxide_current_dir:-}" != "${__zoxide_pwd_tmp}" ]]; then + \builtin local __zoxide_now="${SECONDS%.*}" + \builtin local __zoxide_elapsed=$(( __zoxide_now - ${__zoxide_entered_at:-0} )) + if [[ ${__zoxide_elapsed} -ge ${__zoxide_rest_threshold:-5} ]] && [[ -n "${__zoxide_current_dir:-}" ]]; then + __zoxide_last_rested="${__zoxide_current_dir}" + fi + __zoxide_entered_at="${__zoxide_now}" + __zoxide_current_dir="${__zoxide_pwd_tmp}" + fi # shellcheck disable=SC2312 - \command zoxide add -- "$(__zoxide_pwd)" + \command zoxide add -- "${__zoxide_pwd_tmp}" } +# Rest tracking for z --. +__zoxide_rest_threshold="${_ZO_REST_THRESHOLD:-5}" +__zoxide_entered_at="${SECONDS%.*}" +__zoxide_current_dir="$(__zoxide_pwd)" +__zoxide_last_rested="" + # Initialize hook. \builtin typeset -ga precmd_functions \builtin typeset -ga chpwd_functions @@ -90,6 +107,13 @@ function __zoxide_z() { __zoxide_cd ~ elif [[ "$#" -eq 1 ]] && { [[ -d "$1" ]] || [[ "$1" = '-' ]] || [[ "$1" =~ ^[-+][0-9]+$ ]]; }; then __zoxide_cd "$1" + elif [[ "$#" -eq 1 ]] && [[ "$1" = "--" ]]; then + if [[ -n "${__zoxide_last_rested:-}" ]]; then + __zoxide_cd "${__zoxide_last_rested}" + else + \builtin printf 'zoxide: no rested directory found\n' >&2 + return 1 + fi elif [[ "$#" -eq 2 ]] && [[ "$1" = "--" ]]; then __zoxide_cd "$2" else