[Bash-completion-commits] [SCM] bash-completion branch, master, updated. 1.3-84-g4c97896
Ville Skyttä
ville.skytta at iki.fi
Wed Apr 20 11:42:47 UTC 2011
The following commit has been merged in the master branch:
commit 32dbe76784acc39b17ee9ca7bc21c28f4f2b23b5
Author: Ville Skyttä <ville.skytta at iki.fi>
Date: Wed Apr 20 13:11:09 2011 +0300
Add _init_completion() for common completion initialization and generic redirection handling.
diff --git a/CHANGES b/CHANGES
index 4dfb375..d106296 100644
--- a/CHANGES
+++ b/CHANGES
@@ -14,6 +14,8 @@ bash-completion (2.x)
* Don't install completions for init.d backup files.
* Support tildes when recursively sourcing muttrc files (Debian: #615134).
* Fix local variable leaks from bluez completions.
+ * Add _init_completion() for common completion initialization and generic
+ redirection handling.
[ Guillaume Rousse ]
* added puppet completion, using work from Mathieu Parent (sathieudebian.org)
diff --git a/bash_completion b/bash_completion
index 0062535..bddbff5 100644
--- a/bash_completion
+++ b/bash_completion
@@ -707,6 +707,81 @@ _split_longopt()
return 1
}
+# Initialize completion and deal with redirections: do file completion where
+# appropriate, and adjust prev, words, and cword as if no redirections exist
+# so that completions do not need to deal with them. Before calling this
+# function, make sure cur, prev, words, and cword are local.
+#
+# Options:
+# -n EXCLUDE Passed to _get_comp_words_by_ref -n with redirection chars
+# -e XSPEC Passed to _filedir as first arg for stderr redirections
+# -o XSPEC Passed to _filedir as first arg for other output redirections
+# -i XSPEC Passed to _filedir as first arg for stdin redirections
+# @return True (0) if completion needs further processing,
+# False (> 0) if tilde is followed by a valid username, completions
+# are put in COMPREPLY and no further processing is necessary.
+#
+_init_completion()
+{
+ local exclude flag outx errx inx OPTIND=1
+
+ while getopts "n:e:o:i:" flag "$@"; do
+ case $flag in
+ n) exclude=$OPTARG ;;
+ e) errx=$OPTARG ;;
+ o) outx=$OPTARG ;;
+ i) inx=$OPTARG ;;
+ esac
+ done
+
+ # For some reason completion functions are not invoked at all by
+ # bash (at least as of 4.1.7) after the command line contains an
+ # ampersand so we don't get a chance to deal with redirections
+ # containing them, but if we did, hopefully the below would also
+ # do the right thing with them...
+
+ COMPREPLY=()
+ local redir="@(?([0-9])<|?([0-9&])>?(>)|>&)"
+ _get_comp_words_by_ref -n "$exclude<>&" cur prev words cword
+
+ # Complete on files if current is a redirect possibly followed by a
+ # filename, e.g. ">foo", or previous is a "bare" redirect, e.g. ">".
+ if [[ $cur == $redir* || $prev == $redir ]]; then
+ local xspec
+ case $cur in
+ 2'>'*) xspec=$errx ;;
+ *'>'*) xspec=$outx ;;
+ *'<'*) xspec=$inx ;;
+ *)
+ case $prev in
+ 2'>'*) xspec=$errx ;;
+ *'>'*) xspec=$outx ;;
+ *'<'*) xspec=$inx ;;
+ esac
+ ;;
+ esac
+ cur="${cur##$redir}"
+ _filedir $xspec
+ return 1
+ fi
+
+ # Remove all redirections so completions don't have to deal with them.
+ local i skip
+ for (( i=1; i < ${#words[@]}; )); do
+ if [[ ${words[i]} == $redir* ]]; then
+ # If "bare" redirect, remove also the next word (skip=2).
+ [[ ${words[i]} == $redir ]] && skip=2 || skip=1
+ words=( "${words[@]:0:i}" "${words[@]:i+skip}" )
+ [[ $i -le $cword ]] && cword=$(( cword - skip ))
+ else
+ i=$(( ++i ))
+ fi
+ done
+ prev=${words[cword-1]}
+
+ return 0
+}
+
# This function tries to parse the help output of the given command.
# @param $1 command
# @param $2 command options (default: --help)
--
bash-completion
More information about the Bash-completion-commits
mailing list