foxshell/fn/-z4h-update-dir-history
2025-07-04 11:48:40 -05:00

52 lines
1.2 KiB
Bash

#!/usr/bin/env zsh
if (( ${+_z4h_dir_hist_fd} )); then
zle -F "$_z4h_dir_hist_fd"
exec {_z4h_dir_hist_fd}>&-
unset _z4h_dir_hist_fd
fi
local dir
zstyle -s :z4h:dir-history: cwd dir || dir=${(%):-%~}
[[ -z $dir || $dir == ${_z4h_last_dir-} ]] && return
eval "$_z4h_opt"
typeset -g _z4h_last_dir=$dir
[[ $dir != ('~'|/)* ]] && return
-z4h-read-dir-history || return
if (( ! $#dirstack && (DIRSTACKSIZE || ! $+DIRSTACKSIZE) )); then
local d stack=()
for d in $_z4h_dir_history; do
{
if [[ ($#stack -ne 0 || $d != $dir) ]]; then
d=${~d}
if [[ -d ${d::=${(g:oce:)d}} ]]; then
stack+=($d)
(( $+DIRSTACKSIZE && $#stack >= DIRSTACKSIZE - 1 )) && break
fi
fi
} always {
TRY_BLOCK_ERROR=0
}
done 2>/dev/null
dirstack=($stack)
fi
local -i pos=$_z4h_dir_history[(ie)$dir]
_z4h_dir_history[pos]=()
_z4h_dir_history[1,0]=($dir)
local max_size
zstyle -s :z4h:dir-history: max-size max_size
if [[ $max_size != -<-> ]]; then
[[ $max_size == <-> ]] || max_size=10000
local -i drop=$(($#_z4h_dir_history - max_size))
if (( drop > 0 )); then
_z4h_dir_history[-drop,-1]=()
fi
fi
-z4h-write-dir-history