Mercurial > hg > mercurial-crew-with-dirclash
view contrib/bash_completion @ 1705:4b5725a4a0a6
add changenav at bottom of page
if one reads through the changelog and wants to go to the
previous or next page one needs the navigation links at
the bottom, not at the top of the page
author | Johannes Stezenbach <js@linuxtv.org> |
---|---|
date | Tue, 07 Feb 2006 23:01:11 -0600 |
parents | cf930b2452d3 |
children | 2af98c4b2587 |
line wrap: on
line source
shopt -s extglob _hg_command_list() { "$hg" --debug help 2>/dev/null | \ awk 'function command_line(line) { gsub(/,/, "", line) gsub(/:.*/, "", line) split(line, aliases) command = aliases[1] delete aliases[1] print command for (i in aliases) if (index(command, aliases[i]) != 1) print aliases[i] } /^list of commands:/ {commands=1} commands && /^ debug/ {a[i++] = $0; next;} commands && /^ [^ ]/ {command_line($0)} /^global options:/ {exit 0} END {for (i in a) command_line(a[i])}' } _hg_option_list() { "$hg" -v help $1 2>/dev/null | \ awk '/^ *-/ { for (i = 1; i <= NF; i ++) { if (index($i, "-") != 1) break; print $i; } }' } _hg_commands() { local all commands result all=$(_hg_command_list) commands=${all%%$'\n'debug*} result=$(compgen -W '$commands' -- "$cur") # hide debug commands from users, but complete them if # there is no other possible command if [ "$result" = "" ]; then local debug debug=debug${all#*$'\n'debug} result=$(compgen -W '$debug' -- "$cur") fi COMPREPLY=(${COMPREPLY[@]:-} $result) } _hg_paths() { local paths="$("$hg" paths 2>/dev/null | sed -e 's/ = .*$//')" COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$paths' -- "$cur")) } _hg_repos() { local i for i in $(compgen -d -- "$cur"); do test ! -d "$i"/.hg || COMPREPLY=(${COMPREPLY[@]:-} "$i") done } _hg_status() { local files="$("$hg" status -n$1 . 2>/dev/null)" COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$files' -- "$cur")) } _hg_tags() { local tags="$("$hg" tags 2>/dev/null | sed -e 's/[0-9]*:[a-f0-9]\{40\}$//; s/ *$//')" COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$tags' -- "$cur")) } # this is "kind of" ugly... _hg_count_non_option() { local i count=0 local filters="$1" for ((i=1; $i<=$COMP_CWORD; i++)); do if [[ "${COMP_WORDS[i]}" != -* ]]; then if [[ ${COMP_WORDS[i-1]} == @($filters|$global_args) ]]; then continue fi count=$(($count + 1)) fi done echo $(($count - 1)) } _hg() { local cur prev cmd opts i # global options that receive an argument local global_args='--cwd|-R|--repository' local hg="$1" COMPREPLY=() cur="$2" prev="$3" # searching for the command # (first non-option argument that doesn't follow a global option that # receives an argument) for ((i=1; $i<=$COMP_CWORD; i++)); do if [[ ${COMP_WORDS[i]} != -* ]]; then if [[ ${COMP_WORDS[i-1]} != @($global_args) ]]; then cmd="${COMP_WORDS[i]}" break fi fi done if [[ "$cur" == -* ]]; then opts=$(_hg_option_list $cmd) COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$opts' -- "$cur")) return fi # global options case "$prev" in -R|--repository) _hg_repos return ;; --cwd) # Stick with default bash completion return ;; esac if [ -z "$cmd" ] || [ $COMP_CWORD -eq $i ]; then _hg_commands return fi # canonicalize command name cmd=$("$hg" -q help "$cmd" 2>/dev/null | sed -e 's/^hg //; s/ .*//; 1q') if [ "$cmd" != status ] && [ "$prev" = -r ] || [ "$prev" = --rev ]; then _hg_tags return fi case "$cmd" in help) _hg_commands ;; export|manifest|update) _hg_tags ;; pull|push|outgoing|incoming) _hg_paths _hg_repos ;; paths) _hg_paths ;; add) _hg_status "u" ;; commit) _hg_status "mar" ;; remove) _hg_status "d" ;; forget) _hg_status "a" ;; diff) _hg_status "mar" ;; revert) _hg_status "mard" ;; clone) local count=$(_hg_count_non_option) if [ $count = 1 ]; then _hg_paths fi _hg_repos ;; debugindex|debugindexdot) COMPREPLY=(${COMPREPLY[@]:-} $(compgen -f -X "!*.i" -- "$cur")) ;; debugdata) COMPREPLY=(${COMPREPLY[@]:-} $(compgen -f -X "!*.d" -- "$cur")) ;; esac } complete -o bashdefault -o default -F _hg hg 2>/dev/null \ || complete -o default -F _hg hg