2 # bash completion support for tig
4 # Copyright (C) 2007 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)"
158 local cur="${COMP_WORDS[COMP_CWORD]}"
162 oneline short medium full fuller email raw
163 " "" "${cur##--pretty=}"
168 --max-count= --max-age= --since= --after=
169 --min-age= --before= --until=
170 --root --not --topo-order --date-order
172 --abbrev-commit --abbrev=
174 --author= --committer= --grep=
176 --pretty= --name-status --name-only
182 __tig_complete_revlist
187 local cur="${COMP_WORDS[COMP_CWORD]}"
191 oneline short medium full fuller email raw
192 " "" "${cur##--pretty=}"
205 local i c=1 command __tig_dir
207 while [ $c -lt $COMP_CWORD ]; do
210 --) command="log"; break;;
212 *) command="$i"; break ;;
217 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
218 case "${COMP_WORDS[COMP_CWORD]}" in
219 --*=*) COMPREPLY=() ;;
221 --line-number= --tab-size= --version --help
224 *) tigcomp "log diff show $(__tig_refs)" ;;
234 $(__tig_complete_file)
240 complete -o default -o nospace -F _tig tig
242 # The following are necessary only for Cygwin, and only are needed
243 # when the user has tab-completed the executable name and consequently
244 # included the '.exe' suffix.
245 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
246 complete -o default -o nospace -F _tig tig.exe