Next: Programmable Completion Builtins, Previous: Readline vi Mode, Up: Command Line Editing [Contents][Index]
When word completion is attempted for an argument to a command for
which a completion specification (a compspec) has been defined
using the complete
builtin (see Programmable Completion Builtins),
the programmable completion facilities are invoked.
First, the command name is identified.
If a compspec has been defined for that command, the
compspec is used to generate the list of possible completions for the word.
If the command word is the empty string (completion attempted at the
beginning of an empty line), any compspec defined with
the -E option to complete
is used.
If the command word is a full pathname, a compspec for the full
pathname is searched for first.
If no compspec is found for the full pathname, an attempt is made to
find a compspec for the portion following the final slash.
If those searches do not result in a compspec, any compspec defined with
the -D option to complete
is used as the default.
If there is no default compspec, Bash attempts alias expansion
on the command word as a final resort, and attempts to find a compspec
for the command word from any successful expansion
Once a compspec has been found, it is used to generate the list of matching words. If a compspec is not found, the default Bash completion described above (see Letting Readline Type For You) is performed.
First, the actions specified by the compspec are used.
Only matches which are prefixed by the word being completed are
returned.
When the -f or -d option is used for filename or
directory name completion, the shell variable FIGNORE
is
used to filter the matches.
See Bash Variables, for a description of FIGNORE
.
Any completions specified by a filename expansion pattern to the
-G option are generated next.
The words generated by the pattern need not match the word being completed.
The GLOBIGNORE
shell variable is not used to filter the matches,
but the FIGNORE
shell variable is used.
Next, the string specified as the argument to the -W option
is considered.
The string is first split using the characters in the IFS
special variable as delimiters.
Shell quoting is honored within the string, in order to provide a
mechanism for the words to contain shell metacharacters or characters
in the value of IFS
.
Each word is then expanded using
brace expansion, tilde expansion, parameter and variable expansion,
command substitution, and arithmetic expansion,
as described above (see Shell Expansions).
The results are split using the rules described above
(see Word Splitting).
The results of the expansion are prefix-matched against the word being
completed, and the matching words become the possible completions.
After these matches have been generated, any shell function or command
specified with the -F and -C options is invoked.
When the command or function is invoked, the COMP_LINE
,
COMP_POINT
, COMP_KEY
, and COMP_TYPE
variables are
assigned values as described above (see Bash Variables).
If a shell function is being invoked, the COMP_WORDS
and
COMP_CWORD
variables are also set.
When the function or command is invoked, the first argument ($1) is the
name of the command whose arguments are being completed, the
second argument ($2) is the word being completed, and the third argument
($3) is the word preceding the word being completed on the current command
line.
No filtering of the generated completions against the word being completed
is performed; the function or command has complete freedom in generating
the matches.
Any function specified with -F is invoked first.
The function may use any of the shell facilities, including the
compgen
and compopt
builtins described below
(see Programmable Completion Builtins), to generate the matches.
It must put the possible completions in the COMPREPLY
array
variable, one per array element.
Next, any command specified with the -C option is invoked in an environment equivalent to command substitution. It should print a list of completions, one per line, to the standard output. Backslash may be used to escape a newline, if necessary.
After all of the possible completions are generated, any filter
specified with the -X option is applied to the list.
The filter is a pattern as used for pathname expansion; a ‘&’
in the pattern is replaced with the text of the word being completed.
A literal ‘&’ may be escaped with a backslash; the backslash
is removed before attempting a match.
Any completion that matches the pattern will be removed from the list.
A leading ‘!’ negates the pattern; in this case any completion
not matching the pattern will be removed.
If the nocasematch
shell option
(see the description of shopt
in The Shopt Builtin)
is enabled, the match is performed without regard to the case
of alphabetic characters.
Finally, any prefix and suffix specified with the -P and -S options are added to each member of the completion list, and the result is returned to the Readline completion code as the list of possible completions.
If the previously-applied actions do not generate any matches, and the
-o dirnames option was supplied to complete
when the
compspec was defined, directory name completion is attempted.
If the -o plusdirs option was supplied to complete
when
the compspec was defined, directory name completion is attempted and any
matches are added to the results of the other actions.
By default, if a compspec is found, whatever it generates is returned to
the completion code as the full set of possible completions.
The default Bash completions are not attempted, and the Readline default
of filename completion is disabled.
If the -o bashdefault option was supplied to complete
when
the compspec was defined, the default Bash completions are attempted
if the compspec generates no matches.
If the -o default option was supplied to complete
when the
compspec was defined, Readline’s default completion will be performed
if the compspec (and, if attempted, the default Bash completions)
generate no matches.
When a compspec indicates that directory name completion is desired, the programmable completion functions force Readline to append a slash to completed names which are symbolic links to directories, subject to the value of the mark-directories Readline variable, regardless of the setting of the mark-symlinked-directories Readline variable.
There is some support for dynamically modifying completions. This is most useful when used in combination with a default completion specified with -D. It’s possible for shell functions executed as completion handlers to indicate that completion should be retried by returning an exit status of 124. If a shell function returns 124, and changes the compspec associated with the command on which completion is being attempted (supplied as the first argument when the function is executed), programmable completion restarts from the beginning, with an attempt to find a new compspec for that command. This allows a set of completions to be built dynamically as completion is attempted, rather than being loaded all at once.
For instance, assuming that there is a library of compspecs, each kept in a file corresponding to the name of the command, the following default completion function would load completions dynamically:
_completion_loader() { . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124 } complete -D -F _completion_loader -o bashdefault -o default
Next: Programmable Completion Builtins, Previous: Readline vi Mode, Up: Command Line Editing [Contents][Index]