From de99d797adc385f2870303431313bf236fed1b1f Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Mon, 22 Dec 2008 01:23:48 +0100 Subject: Added __git_files completion This adds the handling of ../, currently with at least these problems: - ../ only completes to ../.. if ../.git does not exist (until ..../.git does exist) - if etc/foo/bar was modified, and pwd is etc, git add will *only* complete to ../etc/foo/bar --- etc/completions/__git_files | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 etc/completions/__git_files (limited to 'etc') 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 -- cgit v1.2.3 From a008a5e057445c05709f827d7ee01ddccad24026 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Mon, 22 Dec 2008 12:24:17 +0100 Subject: __git_files: Return if gitdir is empty (->no git repo) --- etc/completions/__git_files | 2 ++ 1 file changed, 2 insertions(+) (limited to 'etc') diff --git a/etc/completions/__git_files b/etc/completions/__git_files index 6b8c1dd..ef14c31 100644 --- a/etc/completions/__git_files +++ b/etc/completions/__git_files @@ -12,6 +12,8 @@ ls_opts=("--exclude-per-directory=.gitignore") files=(${(ps:\0:)"$(cd $gitdir/..; _call_program files git ls-files -z $ls_opts $opts 2>/dev/null)"}) __git_command_successful || return +[[ -n $gitdir ]] || return + if [[ ! -d .git ]] { dirdiff=${PWD#${gitdir%/.git}} repeat ${#${(s:/:)dirdiff}}; do -- cgit v1.2.3 From b01d636d4e5ea11a15ebdbc6144a746a4ca80713 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 2 Jan 2009 21:34:53 +0100 Subject: __git_files: Another partially working, but more promising approach --- etc/completions/__git_files | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'etc') diff --git a/etc/completions/__git_files b/etc/completions/__git_files index ef14c31..808fe8e 100644 --- a/etc/completions/__git_files +++ b/etc/completions/__git_files @@ -1,5 +1,5 @@ #autoload +X -local expl files ls_opts opts gitdir dirdiff i tmp +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 @@ -12,21 +12,25 @@ ls_opts=("--exclude-per-directory=.gitignore") files=(${(ps:\0:)"$(cd $gitdir/..; _call_program files git ls-files -z $ls_opts $opts 2>/dev/null)"}) __git_command_successful || return -[[ -n $gitdir ]] || return +if [[ -z $gitdir ]] { + echo "wtf: $gitdir" + 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/} + 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 -- cgit v1.2.3 From e878c394b2f23b6559c2fa888deb7ae9ce73c4a4 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 30 Jan 2009 21:50:50 +0100 Subject: Almost finished __git_files Only remaining problem: If the current relative path is shorter than a file's relative path, some ../'s might be missed --- etc/completions/__git_files | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'etc') diff --git a/etc/completions/__git_files b/etc/completions/__git_files index 808fe8e..dd2040d 100644 --- a/etc/completions/__git_files +++ b/etc/completions/__git_files @@ -18,7 +18,7 @@ if [[ -z $gitdir ]] { } if [[ ! -d .git ]] { - dirdiff=${PWD#${gitdir%/.git}} + dirdiff=${PWD#${gitdir%/.git}/} for ((i = 1; i <= $#files; i++)) { prefix='' item=(${(s:/:)files[$i]}) @@ -30,7 +30,12 @@ if [[ ! -d .git ]] { prefix+='../' } } - files[$i]=${prefix}${(j:/:)item} + files[$i]=${prefix} + for j in $item; { + [[ -n $j ]] && files[$i]+="$j/" + } + files[$i]=${files[$i]%/} + echo $files[$i] >> /tmp/bar } } _wanted files expl 'index file' _multi_parts $@ - / files -- cgit v1.2.3 From c7ab8229523525dc101a8fb6619bae4f6fbd7896 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 1 Feb 2009 16:18:33 +0100 Subject: __git_files: Apparently everything works now --- etc/completions/__git_files | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'etc') diff --git a/etc/completions/__git_files b/etc/completions/__git_files index dd2040d..88e9d1b 100644 --- a/etc/completions/__git_files +++ b/etc/completions/__git_files @@ -23,7 +23,7 @@ if [[ ! -d .git ]] { prefix='' item=(${(s:/:)files[$i]}) self=(${(s:/:)dirdiff}) - for ((j = 1; j <= ${#item} && j <= ${#self}; j++)) { + for ((j = 1; j <= ${#self}; j++)) { if [[ $item[$j] == $self[$j] ]] { item[$j]='' } else { -- cgit v1.2.3