2 # bash completion support for tig
4 # Copyright (C) 2007-2009 Jonas fonseca
5 # Copyright (C) 2006,2007 Shawn Pearce
7 # Based git's git-completion.sh: http://repo.or.cz/w/git/fastimport.git
9 # The contained completion routines provide support for completing:
11 # *) local and remote branch names
12 # *) local and remote tag names
13 # *) tig 'subcommands'
14 # *) tree paths within 'ref:path/to/file' expressions
16 # To use these routines:
18 # 1) Copy this file to somewhere (e.g. ~/.tig-completion.sh).
19 # 2) Added the following line to your .bashrc:
20 # source ~/.tig-completion.sh
22 # 3) You may want to make sure the git executable is available
23 # in your PATH before this script is sourced, as some caching
24 # is performed while the script loads. If git isn't found
25 # at source time then all lookups will be done on demand,
26 # which may be slightly slower.
32 if [ -n "$__git_dir" ]; then
34 elif [ -d .git
]; then
37 git rev-parse
--git-dir 2>/dev
/null
39 elif [ -d "$1/.git" ]; then
48 local all c s
=$
'\n' IFS
=' '$
'\t'$
'\n'
49 local cur
="${COMP_WORDS[COMP_CWORD]}"
55 --*=*) all
="$all$c$4$s" ;;
56 *.
) all
="$all$c$4$s" ;;
57 *) all
="$all$c$4 $s" ;;
61 COMPREPLY
=($
(compgen
-P "$2" -W "$all" -- "$cur"))
67 local cmd i is_hash
=y dir
="$(__tigdir "$1")"
68 if [ -d "$dir" ]; then
69 if [ -e "$dir/HEAD" ]; then echo HEAD
; fi
70 for i
in $
(git
--git-dir="$dir" \
71 for-each-ref
--format='%(refname)' \
72 refs
/tags refs
/heads refs
/remotes
); do
74 refs
/tags
/*) echo "${i#refs/tags/}" ;;
75 refs
/heads
/*) echo "${i#refs/heads/}" ;;
76 refs
/remotes
/*) echo "${i#refs/remotes/}" ;;
82 for i
in $
(git-ls-remote
"$dir" 2>/dev
/null
); do
86 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
87 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
88 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
89 n
,*) is_hash
=y
; echo "$i" ;;
94 __tig_complete_file
()
96 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
112 COMPREPLY
=($
(compgen
-P "$pfx" \
113 -W "$(git --git-dir="$
(__tigdir
)" ls-tree "$ls" \
114 | sed '/^100... blob /s,^.* ,,
123 _tigcomp
"$(__tig_refs)"
128 __tig_complete_revlist
()
130 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
135 _tigcomp
"$(__tig_refs)" "$pfx" "$cur"
140 _tigcomp
"$(__tig_refs)" "$pfx" "$cur"
146 _tigcomp
"$(__tig_refs)"
153 local cur
="${COMP_WORDS[COMP_CWORD]}"
157 oneline short medium full fuller email raw
158 " "" "${cur##--pretty=}"
163 --max-count= --max-age= --since= --after=
164 --min-age= --before= --until=
165 --root --not --topo-order --date-order
167 --abbrev-commit --abbrev=
169 --author= --committer= --grep=
171 --pretty= --name-status --name-only
182 __tig_complete_revlist
187 local reply
="" ref
=HEAD cur
="${COMP_WORDS[COMP_CWORD]}"
189 if test "$COMP_CWORD" -lt 3; then
190 reply
="$(__tig_refs)"
192 ref
="${COMP_WORDS[2]}"
195 reply
="$reply $(git --git-dir="$
(__tigdir
)" ls-tree "$ref" \
196 | sed '/^100... blob /s,^.* ,,
207 local cur
="${COMP_WORDS[COMP_CWORD]}"
211 oneline short medium full fuller email raw
212 " "" "${cur##--pretty=}"
225 local i c
=1 command __tig_dir
227 while [ $c -lt $COMP_CWORD ]; do
230 --) command="log"; break;;
232 *) command="$i"; break ;;
237 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
238 case "${COMP_WORDS[COMP_CWORD]}" in
239 --*=*) COMPREPLY
=() ;;
241 *) _tigcomp
"blame status show $(__tig_refs)" ;;
251 $(__tig_complete_file)
257 complete
-o default
-o nospace
-F _tig tig
259 # The following are necessary only for Cygwin, and only are needed
260 # when the user has tab-completed the executable name and consequently
261 # included the '.exe' suffix.
262 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
263 complete
-o default
-o nospace
-F _tig tig.exe