summaryrefslogtreecommitdiff
path: root/etc/completions
diff options
context:
space:
mode:
Diffstat (limited to 'etc/completions')
-rw-r--r--etc/completions/__git_files30
1 files changed, 30 insertions, 0 deletions
diff --git a/etc/completions/__git_files b/etc/completions/__git_files
new file mode 100644
index 0000000..6b8c1dd
--- /dev/null
+++ b/etc/completions/__git_files
@@ -0,0 +1,30 @@
+#autoload +X
+local expl files ls_opts opts gitdir dirdiff i tmp
+
+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 [[ ! -d .git ]] {
+ dirdiff=${PWD#${gitdir%/.git}}
+ repeat ${#${(s:/:)dirdiff}}; do
+ tmp+='../'
+ done
+ dirdiff=${dirdiff#/}
+ for (( i=1; i <= $#files; i++)) {
+ if [[ $files[$i] == $dirdiff/* ]] {
+ files[$i]=${files[$i]#$dirdiff/}
+ } else {
+ files[$i]=$tmp${files[$i]#$dirdiff/}
+ }
+ }
+}
+
+_wanted files expl 'index file' _multi_parts $@ - / files