function __fish_cdh_args set -l all_dirs $dirprev $dirnext set -l uniq_dirs # This next bit of code doesn't do anything useful at the moment since the fish pager always # sorts, and eliminates duplicate, entries. But we do this to mimic the modal behavor of `cdh` # and in hope that the fish pager behavior will be changed to preserve the order of entries. for dir in $all_dirs[-1..1] if not contains $dir $uniq_dirs set uniq_dirs $uniq_dirs $dir end end # Only shorten $HOME to "~" if the token starts with a "~", # otherwise fish will escape it. set -l shorten_tilde 0 string match -q '~*' -- (commandline -ct); and set shorten_tilde 1 for dir in $uniq_dirs if test $shorten_tilde -eq 1 set -l home_dir (string match -r "$HOME(/.*|\$)" "$dir") if set -q home_dir[2] set dir "~$home_dir[2]" end end echo $dir end end complete -c cdh -kxa '(__fish_cdh_args)'