function enhancd
set -l arg
set -l args
set -l opts
set -l code 0
if not _enhancd_cd_ready
if not set -q argv[1]
_enhancd_cd_builtin "$HOME"
else
_enhancd_cd_builtin "$argv"
end
return $status
end
# set indice to the first element
set -l i 1
while [ $i -le (count $argv) ]
switch $argv[$i]
case "--help"
_enhancd_ltsv_open \
| _enhancd_command_awk -f "$ENHANCD_ROOT/lib/help.awk"
case "$ENHANCD_ARG_HYPHEN"
# If a hyphen is passed as the argument,
# searchs from the last 10 directory items in the log
set -a args (_enhancd_source_mru | _enhancd_filter_interactive)
set code $status
case '-'
set -a args "$OLDPWD"
case "$ENHANCD_ARG_DOUBLE_DOT"
set -a args (_enhancd_source_parent_dirs | _enhancd_filter_interactive)
set code $status
case '..'
set -a args ".."
case "$ENHANCD_ARG_SINGLE_DOT"
set -a args (_enhancd_sources_current_dirs | _enhancd_filter_interactive)
set code $status
case '.'
set -a args "."
case "$ENHANCED_HOME_ARG"
set -a args (_enhancd_source_home | _enhancd_filter_interactive)
set code $status
case '--'
set -a opts "$argv[1]"
set -a args (_enhancd_source_history "$argv[2]" | _enhancd_filter_interactive)
set code $status
case '-*' '--*'
if _enhancd_helper_is_default_flag "$argv[1]"
set -a opts "$argv[1]"
else
set -l opt "$argv[1]"
set -l func cond format
set cond (_enhancd_ltsv_get "$opt" "condition")
set func (_enhancd_ltsv_get "$opt" "func")
set format (_enhancd_ltsv_get "$opt" "format")
if not _enhancd_command_run "$cond"
echo "$opt: defined but require '$cond'" >&2
return 1
end
if test -z $func
echo "$opt: 'func' label is required" >&2
return 1
end
if test -n $format; and not string match --quiet '*%*' $format
echo "$opt: 'format' label needs to include '%' (selected line)" >&2
return 1
end
_enhancd_command_run "$func" "$arg" | _enhancd_filter_interactive
set -l selected
if test -z $format
set selected (_enhancd_command_run "$func" | _enhancd_filter_interactive)
else
# format is maybe including $HOME etc. need magic line of 'eval printf' to expand that.
set selected (_enhancd_command_run "$func" | _enhancd_filter_interactive | xargs -I% echo (eval printf "%s" "$format"))
end
set code $status
set -a args $selected
break
end
case '*'
# FIX: Short-circuit for existing directories.
# When an explicit, valid directory path is given (absolute or relative),
# go directly without invoking the interactive filter.
# This restores the expected behavior: cd /tmp, cd ~, cd /foo/bar
# all navigate immediately, matching bash/zsh behavior.
if test -d "$argv[$i]"
set -a args "$argv[$i]"
else
set -a args (_enhancd_source_history "$argv[$i]" | _enhancd_filter_interactive)
set code $status
end
end
set i (math "$i + 1")
end
switch (count $argv)
case '0'
set -a args (_enhancd_source_home | _enhancd_filter_interactive)
set code $status
end
switch "$code"
case '0'
_enhancd_cd_builtin $opts $args
return $status
case '*'
return 1
end
end