#autoload +X local expl files ls_opts opts gitdir dirdiff i j prefix item self zparseopts -D -E -a opts -- -cached -deleted -modified -others -ignored -unmerged -killed gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null) __git_command_successful || return ls_opts=("--exclude-per-directory=.gitignore") [[ -f "$gitdir/info/exclude" ]] && ls_opts+="--exclude-from=$gitdir/info/exclude" files=(${(ps:\0:)"$(cd $gitdir/..; _call_program files git ls-files -z $ls_opts $opts 2>/dev/null)"}) __git_command_successful || return if [[ -z $gitdir ]] { echo "wtf: $gitdir" return } if [[ ! -d .git ]] { dirdiff=${PWD#${gitdir%/.git}} for ((i = 1; i <= $#files; i++)) { prefix='' item=(${(s:/:)files[$i]}) self=(${(s:/:)dirdiff}) for ((j = 1; j <= ${#item} && j <= ${#self}; j++)) { if [[ $item[$j] == $self[$j] ]] { item[$j]='' } else { prefix+='../' } } files[$i]=${prefix}${(j:/:)item} } } _wanted files expl 'index file' _multi_parts $@ - / files