52 lines
1.2 KiB
Bash
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
|