summaryrefslogtreecommitdiff
path: root/Completion/Base
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Base')
-rw-r--r--Completion/Base/.distfiles6
-rw-r--r--Completion/Base/_brace_parameter5
-rw-r--r--Completion/Base/_command_names3
-rw-r--r--Completion/Base/_condition10
-rw-r--r--Completion/Base/_default13
-rw-r--r--Completion/Base/_equal3
-rw-r--r--Completion/Base/_long_options309
-rw-r--r--Completion/Base/_match_pattern31
-rw-r--r--Completion/Base/_match_test15
-rw-r--r--Completion/Base/_math18
-rw-r--r--Completion/Base/_parameter3
-rw-r--r--Completion/Base/_precommand5
-rw-r--r--Completion/Base/_redirect3
-rw-r--r--Completion/Base/_subscript4
-rw-r--r--Completion/Base/_tilde10
-rw-r--r--Completion/Base/_vars3
16 files changed, 441 insertions, 0 deletions
diff --git a/Completion/Base/.distfiles b/Completion/Base/.distfiles
new file mode 100644
index 000000000..7e7635fa6
--- /dev/null
+++ b/Completion/Base/.distfiles
@@ -0,0 +1,6 @@
+DISTFILES_SRC='
+ .distfiles
+ _brace_parameter _command_names _condition _default _equal
+ _long_options _match_pattern _match_pattern.orig _match_test _parameter
+ _precommand _redirect _subscript _tilde _vars
+'
diff --git a/Completion/Base/_brace_parameter b/Completion/Base/_brace_parameter
new file mode 100644
index 000000000..092376e78
--- /dev/null
+++ b/Completion/Base/_brace_parameter
@@ -0,0 +1,5 @@
+#defcomp -brace-parameter-
+
+# Simple but without spiffy suffix handling: compgen -v -S '} '
+
+compadd -S '} ' -r '-:?#%+=[/' - "${(@)${${${(f)$(typeset)}%%\=*}##* }:gs/'//}"
diff --git a/Completion/Base/_command_names b/Completion/Base/_command_names
new file mode 100644
index 000000000..d3b8a109a
--- /dev/null
+++ b/Completion/Base/_command_names
@@ -0,0 +1,3 @@
+#defcomp -command-
+
+complist -c
diff --git a/Completion/Base/_condition b/Completion/Base/_condition
new file mode 100644
index 000000000..3e45e1b8f
--- /dev/null
+++ b/Completion/Base/_condition
@@ -0,0 +1,10 @@
+#defcomp -condition-
+
+if [[ -current -1 -o ]]; then
+ complist -o -M 'L:|[nN][oO]= M:_= M:{A-Z}={a-z}'
+elif [[ -current -1 -nt || -current -1 -ot || -current -1 -ef ]]; then
+ _files
+else
+ _files
+ complist -v
+fi
diff --git a/Completion/Base/_default b/Completion/Base/_default
new file mode 100644
index 000000000..8bcf14f6a
--- /dev/null
+++ b/Completion/Base/_default
@@ -0,0 +1,13 @@
+#defcomp -default-
+
+# We first try the `compctl's. This is without first (-T) and default (-D)
+# completion. If you want them add `-T' and/or `-D' to this command.
+# If there is a `compctl' for the command we are working on, we return
+# immediatly. If you want to use new style completion anyway, remove the
+# `|| return'. Also, you may want to use new style completion if the
+# `compctl' didn't produce any matches. In that case remove the `|| return'
+# and at the line `[[ -nmatches 0 ]] || return' after `compcall'.
+
+compcall || return
+
+_files
diff --git a/Completion/Base/_equal b/Completion/Base/_equal
new file mode 100644
index 000000000..f407014fe
--- /dev/null
+++ b/Completion/Base/_equal
@@ -0,0 +1,3 @@
+#defcomp -equal-
+
+compgen -am
diff --git a/Completion/Base/_long_options b/Completion/Base/_long_options
new file mode 100644
index 000000000..a5d92632c
--- /dev/null
+++ b/Completion/Base/_long_options
@@ -0,0 +1,309 @@
+#autoload
+
+# This function tries to automatically complete long option names. For
+# this it invokes the command from the line with the `--help' option
+# and then parses the output to find possible option names. For
+# options that get an argument after a `=', the function also tries to
+# automatically find out what should be complete as the argument.
+# The possible completions for option-arguments can be described with
+# the arguments to this function. This is done by giving pairs of
+# patterns and actions as consecutive arguments. The actions specify
+# what should be done to complete arguemts of those options that match
+# the pattern. The action may be a list of words in brackets or in
+# parentheses, separated by spaces. A list in brackets denotes
+# possible values for an optional argument, a list in parentheses
+# gives words to complete for mandatory arguments. If the action does
+# not start with a bracket or parentheses, it should be the name of a
+# command (probably with arguments) that should be invoked to complete
+# after the equal sign. E.g.:
+#
+# _long_options '*\*' '(yes no)' \
+# '*=FILE*' '_files' \
+# '*=DIR*' '_files -/'
+#
+# This makes `yes' and `no' be completed as the argument of options
+# whose description ends in a star, file names for options that
+# contain the substring `=FILE' in the description, and paths for
+# options whose description contains `=DIR'. Note the last two
+# patterns are not needed since this function always completes files
+# for option descriptions containing `=FILE' and paths for option
+# descriptions that contain `=DIR' or `=PATH'. These builtin patterns
+# can be overridden by patterns given as arguments, though.
+#
+# This function also accepts the `-X', `-J', and `-V' options which
+# are given to `compadd'. Finally, it accepts the option `-t'. If this
+# is given, completion is only done on words starting with two hyphens.
+
+local opt expl group test i name action ret=1 tmp suffix
+
+setopt extendedglob
+
+# Get the options.
+
+group=()
+expl=()
+if [[ $1 = -*~--* ]]; then
+ while getopts "J:V:X:t" opt; do
+ case "$opt" in
+ [JV]) group=("-$opt" "$OPTARG");;
+ X) expl=(-X "$OPTARG");;
+ t) test=yes;;
+ esac
+ done
+ shift OPTIND-1
+fi
+
+# Test if we are completing after `--' if we were asked to do so.
+
+[[ -n "$test" && "$PREFIX" != --* ]] && return 1
+
+# We cache the information about options and the command name, see if
+# we can use the cache.
+
+if [[ "$words[1]" = (.|..)/* ]]; then
+ tmp="$PWD/$words[1]"
+else
+ tmp="$words[1]"
+fi
+
+if [[ "$tmp" != $_lo_cache_cmd ]]; then
+
+ # No, store the new command name and clear the old parameters.
+
+ _lo_cache_cmd="$tmp"
+ (( $+_lo_cache_actions )) && unset "$_lo_cache_names[@]" _lo_cache_actions _lo_cache_names
+
+ local opts pattern anum=1 tmpo str
+
+ # Now get the long option names by calling the command with `--help'.
+ # The parameter expansion trickery first gets the lines as separate
+ # array elements. Then we select all lines whose first non-blank
+ # character is a hyphen. Since some commands document more than one
+ # option per line, separated by commas, we convert commas int
+ # newlines and then split the result again at newlines after joining
+ # the old array elements with newlines between them. Then we select
+ # those elements that start with two hyphens, remove anything up to
+ # those hyphens and anything from the space or comma after the
+ # option up to the end. Finally all elements with option strings
+ # that contain uppercase letters are removed.
+
+ opts=("--${(@)^${(@)${(@)${(@M)${(@ps:\n:j:\n:)${(@)${(@M)${(@f)$("$words[1]" --help)}:#[ ]#-*}//,/
+}}:#[ ]#--*}#*--}%%[, ]*}:#(*-[A-Z]*|)}")
+
+ # The interpretation of the options is completely table driven. We
+ # use the positional parameters we were given and a few standard
+ # ones. Then we loop through this table.
+
+ set -- "$@" '*=FILE*' '_files' '*=(DIR|PATH)*' '_files -/' '*' ''
+
+ while [[ $# -gt 1 ]]; do
+
+ # First, we get the pattern and the action to use and take them
+ # from the positional parameters.
+
+ pattern="$1"
+ action="$2"
+ shift 2
+
+ # We get all options matching the pattern and take them from the
+ # list we have built. If no option matches the pattern, we
+ # continue with the next.
+
+ tmp=("${(@M)opts:##$~pattern}")
+ opts=("${(@)opts:##$~pattern}")
+
+ (( $#tmp )) || continue
+
+ # Now we collect the options for the pattern in an array. We also
+ # check if the options take an argument after a `=', and if this
+ # argument is optional. The name of the array built contains
+ # `_arg_' for mandatory arguments, `_optarg_' for optional
+ # arguments, and `_simple_' for options that don't get an
+ # argument. In `_lo_cache_names' we save the names of these
+ # arrays and in `_lo_cache_actions' the associated actions.
+
+ # If the action is a list of words in brackets, this denotes
+ # options that get an optional argument. If the action is a list
+ # of words in parentheses, the option has to get an argument.
+ # In both cases we just build the array name to use.
+
+ if [[ "$action[1]" = '[' ]]; then
+ name="_lo_cache_optarg_$anum"
+ elif [[ "$action[1]" = '(' ]]; then
+ name="_lo_cache_arg_$anum"
+ else
+
+ # If there are option strings with a `[=', we take make these
+ # get an optional argument...
+
+ tmpo=("${(@M)tmp:#*\[\=*}")
+ if (( $#tmpo )); then
+
+ # ...by removing them from the option list and storing them in
+ # an array.
+
+ tmp=("${(@)tmp:#*\[\=*}")
+ tmpo=("${(@)${(@)tmpo%%\=*}//[^a-z0-9-]}")
+ _lo_cache_names[anum]="_lo_cache_optarg_$anum"
+ _lo_cache_actions[anum]="$action"
+ eval "_lo_cache_optarg_${anum}=(\"\$tmpo[@]\")"
+ (( anum++ ))
+ fi
+
+ # Now we do the same for option strings containing `=', these
+ # are options getting an argument.
+
+ tmpo=("${(@M)tmp:#*\=*}")
+ if (( $#tmpo )); then
+ tmp=("${(@)tmp:#*\=*}")
+ tmpo=("${(@)${(@)tmpo%%\=*}//[^a-z0-9-]}")
+ _lo_cache_names[anum]="_lo_cache_arg_$anum"
+ _lo_cache_actions[anum]="$action"
+ eval "_lo_cache_arg_${anum}=(\"\$tmpo[@]\")"
+ (( anum++ ))
+ fi
+
+ # The name for the options without arguments, if any.
+
+ name="_lo_cache_simple_$anum"
+ fi
+ # Now filter out any option strings we don't like and stuff them
+ # in an array, if there are still some.
+
+ tmp=("${(@)${(@)tmp%%\=*}//[^a-z0-9-]}")
+ if (( $#tmp )); then
+ _lo_cache_names[anum]="$name"
+ _lo_cache_actions[anum]="$action"
+ eval "${name}=(\"\$tmp[@]\")"
+ (( anum++ ))
+ fi
+ done
+fi
+
+# We get the string from the line and and see if it already contains a
+# equal sign.
+
+str="$PREFIX$SUFFIX"
+
+if [[ "$str" = *\=* ]]; then
+
+ # It contains a `=', now we ignore anything up to it, but first save
+ # the old contents of the special parameters we change.
+
+ local oipre opre osuf pre parto parta pat patflags anum=1
+
+ oipre="$IPREFIX"
+ opre="$PREFIX"
+ osuf="$SUFFIX"
+
+ pre="${str%%\=*}"
+ IPREFIX="${IPREFIX}${pre}="
+ PREFIX="${str#*\=}"
+ SUFFIX=""
+
+ # We will check if the arrays contain an option matching what's on
+ # the line. To do this good, we build a pattern.
+
+ [[ -n "$_comp_correct" && $#pre -le _comp_correct ]] && return 1
+
+ pat="${pre}*"
+ patflags=''
+ _match_pattern _long_options pat patflags
+ [[ -n "$_comp_correct" ]] && patflags="$patflags(#a$_comp_correct)"
+
+ # Then we walk through the array names. For each array we test if it
+ # contains the option string. If so, we `invoke' the action stored
+ # with the name. If the action is a list of words, we just add them,
+ # otherwise we invoke the command or function named.
+
+ for name in "$_lo_cache_names[@]"; do
+ action="$_lo_cache_actions[anum]"
+ if (( ${(@)${(@P)name}[(I)$pre]} )); then
+ if [[ "$action[1]" = (\[|\() ]]; then
+ compadd - ${=action[2,-2]}
+ elif (( $#action )); then
+ $=action
+ fi
+
+ # We found the option string, return.
+
+ return
+ fi
+
+ # The array did not contain the full option string, see if it
+ # contains a string matching the string from the line.
+ # If there is one, we store the option string in `parto' and the
+ # element from `_lo_actions' in `parta'. If we find more than one
+ # such option or if we already had one, we set `parto' to `-'.
+
+ tmp=("${(@M)${(@P)name}:#${~pat}}")
+ if [[ $#tmp -eq 1 ]]; then
+ if [[ -z "$parto" ]]; then
+ parto="$tmp[1]"
+ parta="$action"
+ else
+ parto=-
+ fi
+ elif (( $#tmp )); then
+ parto=-
+ fi
+ (( anum++ ))
+ done
+
+ # If we found only one matching option, we accept it and immediatly
+ # try to complete the string after the `='.
+
+ if [[ -n "$parto" && "$parto" != - ]]; then
+ IPREFIX="${parto}="
+
+ if (( $#parta )); then
+ if [[ "$parta[1]" = (\[|\() ]]; then
+ compadd - ${=parta[2,-2]}
+ else
+ $=parta
+ fi
+ else
+ compadd -S '' - "$PREFIX"
+ fi
+ return
+ fi
+
+ # The option string was not found, restore the special parameters.
+
+ IPREFIX="$oipre"
+ PREFIX="$opre"
+ SUFFIX="$osuf"
+fi
+
+# The string on the line did not contain a `=', or we couldn't
+# complete the option string since there were more than one matching
+# what's on the line. So we just ad the option string as possible
+# matches, giving the string from the `=' on as a suffix.
+
+if [[ "$str" = *\=* ]]; then
+ str="=${str#*\=}"
+ PREFIX="${PREFIX%%\=*}"
+ suffix=()
+else
+ str=""
+ suffix=('-S=')
+fi
+
+anum=1
+for name in "$_lo_cache_names[@]"; do
+ action="$_lo_cache_actions[anum]"
+
+ if [[ "$name" = *_optarg_* ]]; then
+ compadd -M 'r:|-=* r:|=*' -Qq "$suffix[@]" -s "$str" - \
+ "${(@P)name}" && ret=0
+ elif [[ "$name" = *_arg_* ]]; then
+ compadd -M 'r:|-=* r:|=*' -Q "$suffix[@]" -s "$str" - \
+ "${(@P)name}" && ret=0
+ elif [[ -z "$str" ]]; then
+ compadd -M 'r:|-=* r:|=*' -Q - \
+ "${(@P)name}" && ret=0
+ fi
+ (( anum++ ))
+done
+
+return ret
diff --git a/Completion/Base/_match_pattern b/Completion/Base/_match_pattern
new file mode 100644
index 000000000..c5debc0b9
--- /dev/null
+++ b/Completion/Base/_match_pattern
@@ -0,0 +1,31 @@
+#autoload
+
+# This function is called from functions that do matching whenever they
+# need to build a pattern that is used to match possible completions.
+# It gets the name of the calling function and two names of parameters
+# as arguments. The first one is used in the calling function to build
+# the pattern used for matching possible completions. The content of this
+# parameter on entry to this function is the string taken from the line.
+# Here it parameter should be changed to a pattern that matches words as
+# the match specs currently in use do.
+# In the calling function this pattern may be changed again or used only
+# in parts. The second parameter whose name is given as the third argument
+# allows to give pattern flags liek `(#l)' that are to be used whenever
+# matching is done.
+#
+# As an example, if you have global match specifications like:
+#
+# compctl -M 'm:{a-z}={A-Z}' 'm:{a-z}={A-Z} r:|[.-]=* r:|=*'
+#
+# This function would look like:
+#
+# eval "${3}='(#l)'"
+# [[ MATCHER -eq 2 ]] && eval "$1='${(P)2:gs/./*./:gs/-/*-/}'"
+#
+# The first line makes sure that matching is done case-insensitive as
+# specified by `m:{a-z}={A-Z}'. The second line replaces dots and hyphens
+# in the given string by patterns matching any characters before them,
+# like the `r:|[.-]=* r:|=*'. To make this work, the function `_match_test'
+# would have to be changed to `(( MATCHERS <= 2 ))'
+#
+# The default implementation of this function is empty.
diff --git a/Completion/Base/_match_test b/Completion/Base/_match_test
new file mode 100644
index 000000000..e8b6e6424
--- /dev/null
+++ b/Completion/Base/_match_test
@@ -0,0 +1,15 @@
+#autoload
+
+# This function is called at the beginning of functions that do matching in
+# shell code. It should test the value of the `MATCHER' special parameter
+# and return non-zero if the calling function should try to generate matches
+# for the global match specification in use.
+#
+# This function gets one argument, the name of the function calling it.
+#
+# If you have a global match specification with more than one set of patterns
+# you may want to modify this function to return non-zero for all of your
+# match specifications and modify the function `_match_pattern' to build the
+# pattern to use in the calling function.
+
+(( MATCHER == 1 ))
diff --git a/Completion/Base/_math b/Completion/Base/_math
new file mode 100644
index 000000000..f7f4c360f
--- /dev/null
+++ b/Completion/Base/_math
@@ -0,0 +1,18 @@
+#defcomp -math-
+
+if [[ "$PREFIX" = *[^a-zA-Z0-9_]* ]]; then
+ IPREFIX="$IPREFIX${PREFIX%%[a-zA-Z0-9_]#}"
+ PREFIX="${PREFIX##*[^a-zA-Z0-9_]}"
+fi
+if [[ "$SUFFIX" = *[^a-zA-Z0-9_]* ]]; then
+ ISUFFIX="${SUFFIX##[a-zA-Z0-9_]#}$ISUFFIX"
+ SUFFIX="${SUFFIX%%[^a-zA-Z0-9_]*}"
+fi
+
+compgen -v
+#defcomp -math-
+
+IPREFIX="$IPREFIX${PREFIX%[a-zA-Z0-9_]*}"
+PREFIX="${PREFIX##*[^a-zA-Z0-9_]}"
+
+compgen -v
diff --git a/Completion/Base/_parameter b/Completion/Base/_parameter
new file mode 100644
index 000000000..2bd66ec93
--- /dev/null
+++ b/Completion/Base/_parameter
@@ -0,0 +1,3 @@
+#defcomp -parameter-
+
+compgen -v
diff --git a/Completion/Base/_precommand b/Completion/Base/_precommand
new file mode 100644
index 000000000..2cf661147
--- /dev/null
+++ b/Completion/Base/_precommand
@@ -0,0 +1,5 @@
+#defcomp - nohup nice eval time rusage noglob nocorrect exec
+
+[[ -position 1 -1 ]]
+
+_normal "$@"
diff --git a/Completion/Base/_redirect b/Completion/Base/_redirect
new file mode 100644
index 000000000..32113ad7c
--- /dev/null
+++ b/Completion/Base/_redirect
@@ -0,0 +1,3 @@
+#defcomp -redirect-
+
+_files
diff --git a/Completion/Base/_subscript b/Completion/Base/_subscript
new file mode 100644
index 000000000..2b827a117
--- /dev/null
+++ b/Completion/Base/_subscript
@@ -0,0 +1,4 @@
+#defcomp -subscript-
+
+_compalso -math- "$@"
+[[ ${(Pt)${COMMAND}} = assoc* ]] && complist -k "( ${(kP)${COMMAND}} )"
diff --git a/Completion/Base/_tilde b/Completion/Base/_tilde
new file mode 100644
index 000000000..aef575e19
--- /dev/null
+++ b/Completion/Base/_tilde
@@ -0,0 +1,10 @@
+#defcomp -tilde-
+
+# We use all named directories and user names here. If this is too slow
+# for you or if there are too many of them, you may want to use
+# `compgen -k friends -qS/' or something like that. To get all user names
+# if there are no matches in the `friends' array, add
+# `(( compstate[nmatches] )) || compgen -nu -qS/'
+# below that.
+
+compgen -nu -qS/
diff --git a/Completion/Base/_vars b/Completion/Base/_vars
new file mode 100644
index 000000000..7153b6f38
--- /dev/null
+++ b/Completion/Base/_vars
@@ -0,0 +1,3 @@
+#defcomp -math- getopts read unset vared
+
+complist -v