45 lines
1.6 KiB
Plaintext
45 lines
1.6 KiB
Plaintext
# Save the current directory in the stack of most recently used directories.
|
|
|
|
emulate -L zsh
|
|
setopt extendedglob
|
|
|
|
local -aU reply
|
|
integer changed
|
|
|
|
autoload -Uz chpwd_recent_filehandler chpwd_recent_add
|
|
|
|
# Don't save if this is not interactive, or is in a subshell.
|
|
# Don't save if this is not being called directly from the top level
|
|
# of the shell via a straightforward sequence of shell functions.
|
|
# So this is called
|
|
# - on any straightforward cd or pushd (including AUTO_CD)
|
|
# - any time cd or pushd is called from a function invoked directly
|
|
# or indirectly from the command line, e.g. if pushd is a function
|
|
# fixing the order of directories that got broken years ago
|
|
# but it is not called any time
|
|
# - the shell is not interactive
|
|
# - we forked
|
|
# - we are being eval'd, including for some special purpose such
|
|
# as a style
|
|
# - we are not called from the top-level command loop, for example
|
|
# we are in a completion function (which is called from zle
|
|
# when the main top-level command interpreter isn't running)
|
|
# - obviously, when cd -q is in use (that's what the option is for).
|
|
#
|
|
# For compatibility with older shells, skip this test if $ZSH_EVAL_CONTEXT
|
|
# isn't set. This will never be the case inside a shell function when
|
|
# the variable is implemented.
|
|
if [[ ! -o interactive || $ZSH_SUBSHELL -ne 0 || \
|
|
( -n $ZSH_EVAL_CONTEXT && \
|
|
$ZSH_EVAL_CONTEXT != toplevel(:[a-z]#func|)# ) ]]; then
|
|
return
|
|
fi
|
|
|
|
chpwd_recent_filehandler
|
|
|
|
if [[ $reply[1] != $PWD ]]; then
|
|
chpwd_recent_add $PWD && changed=1
|
|
|
|
(( changed )) && chpwd_recent_filehandler $reply
|
|
fi
|