Mercurial > hg > mercurial-crew-with-dirclash
comparison contrib/bash_completion @ 1641:1ef060ae7966
bash_completion: be more careful about whitespaces
- use awk to parse the output of hg help.
- print one completion candidate per line
- print the debug commands after regular commands
(this eases the shell side of the parsing)
- don't print aliases that are simple abbreviations
(e.g. up/update, id/identify)
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Fri, 27 Jan 2006 12:10:35 +0100 |
parents | dbfc04a55607 |
children | b8d792057e5b |
comparison
equal
deleted
inserted
replaced
1640:9a5b778f7e2d | 1641:1ef060ae7966 |
---|---|
1 shopt -s extglob | 1 shopt -s extglob |
2 | 2 |
3 _hg_command_list() | |
4 { | |
5 hg --debug help 2>/dev/null | \ | |
6 awk 'function command_line(line) { | |
7 gsub(/,/, "", line) | |
8 gsub(/:.*/, "", line) | |
9 split(line, aliases) | |
10 command = aliases[1] | |
11 delete aliases[1] | |
12 print command | |
13 for (i in aliases) | |
14 if (index(command, aliases[i]) != 1) | |
15 print aliases[i] | |
16 } | |
17 /^list of commands:/ {commands=1} | |
18 commands && /^ debug/ {a[i++] = $0; next;} | |
19 commands && /^ [^ ]/ {command_line($0)} | |
20 /^global options:/ {exit 0} | |
21 END {for (i in a) command_line(a[i])}' | |
22 | |
23 } | |
24 | |
25 _hg_option_list() | |
26 { | |
27 hg -v help $1 2> /dev/null | \ | |
28 awk '/^ *-/ { | |
29 for (i = 1; i <= NF; i ++) { | |
30 if (index($i, "-") != 1) | |
31 break; | |
32 print $i; | |
33 } | |
34 }' | |
35 } | |
36 | |
37 | |
3 _hg_commands() | 38 _hg_commands() |
4 { | 39 { |
5 local all commands result | 40 local all commands result |
6 | 41 |
7 all=($(hg --debug help | sed -e '1,/^list of commands:/d' \ | 42 all=$(_hg_command_list) |
8 -e '/^global options:/,$d' \ | 43 commands=${all%%$'\n'debug*} |
9 -e '/^ [^ ]/!d; s/^ //; s/[,:]//g;')) | |
10 | |
11 commands="${all[*]##debug*}" | |
12 result=$(compgen -W "$commands" -- "$cur") | 44 result=$(compgen -W "$commands" -- "$cur") |
13 | 45 |
14 # hide debug commands from users, but complete them if | 46 # hide debug commands from users, but complete them if |
15 # there is no other possible command | 47 # there is no other possible command |
16 if [ "$result" = "" ]; then | 48 if [ "$result" = "" ]; then |
17 local debug | 49 local debug |
18 debug=(${all[*]##!(debug*)}) | 50 debug=debug${all#*$'\n'debug} |
19 debug="${debug[*]/g/debug}" | |
20 result=$(compgen -W "$debug" -- "$cur") | 51 result=$(compgen -W "$debug" -- "$cur") |
21 fi | 52 fi |
22 | 53 |
23 COMPREPLY=(${COMPREPLY[@]:-} $result) | 54 COMPREPLY=(${COMPREPLY[@]:-} $result) |
24 } | 55 } |
88 fi | 119 fi |
89 fi | 120 fi |
90 done | 121 done |
91 | 122 |
92 if [[ "$cur" == -* ]]; then | 123 if [[ "$cur" == -* ]]; then |
93 # this assumes that there are no commands with spaces in the name | 124 opts=$(_hg_option_list $cmd) |
94 opts=$(hg -v help $cmd | sed -e '/^ *-/!d; s/ [^- ].*//') | |
95 | 125 |
96 COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$opts" -- "$cur") ) | 126 COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$opts" -- "$cur") ) |
97 return | 127 return |
98 fi | 128 fi |
99 | 129 |