mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-08 09:41:14 +02:00
22752: improved introduction to completion
This commit is contained in:
parent
d09274dcd8
commit
4fdf7ec7b7
4 changed files with 125 additions and 26 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2006-09-21 Peter Stephenson <p.w.stephenson@ntlworld.com>
|
||||||
|
|
||||||
|
* 22752: + Roman Neuhauser: Doc/Zsh/compsys.yo,
|
||||||
|
Doc/Zsh/compwid.yo, Doc/Zsh/roadmap.yo: improved introduction
|
||||||
|
to completion.
|
||||||
|
|
||||||
2006-09-21 Peter Stephenson <pws@csr.com>
|
2006-09-21 Peter Stephenson <pws@csr.com>
|
||||||
|
|
||||||
* 22739: arno: Functions/Prompt/promptinit: change test
|
* 22739: arno: Functions/Prompt/promptinit: change test
|
||||||
|
|
|
@ -5,12 +5,84 @@ cindex(completion, programmable)
|
||||||
cindex(completion, controlling)
|
cindex(completion, controlling)
|
||||||
sect(Description)
|
sect(Description)
|
||||||
|
|
||||||
This describes the shell code for the new completion system. It consists
|
This describes the shell code for the `new' completion system, referred
|
||||||
of various shell functions; those beginning `tt(comp)' are to be called
|
to as tt(compsys). It is written in shell functions based on the
|
||||||
directly, while those beginning `tt(_)' are called by the
|
features described in
|
||||||
completion code. The shell functions of the second set, which implement
|
ifzman(zmanref(zshcompwid))\
|
||||||
|
ifnzman(the previous chapter, noderef(Completion Widgets)).
|
||||||
|
|
||||||
|
The features are contextual, sensitive to the point at which completion is
|
||||||
|
started. Many completions are already provided.
|
||||||
|
For this reason, a user can perform a great many tasks without
|
||||||
|
knowing any details beyond how to initialize the system, which is
|
||||||
|
described
|
||||||
|
ifzman(below in INITIALIZATION)\
|
||||||
|
ifnzman(in noderef(Initialization)).
|
||||||
|
|
||||||
|
The context that decides what completion is to be performed may be
|
||||||
|
startitemize()
|
||||||
|
itemiz(\
|
||||||
|
an argument or option position: these describe the position on the
|
||||||
|
command line at which completion is requested. For example `first argument
|
||||||
|
to rmdir, the word being completed names a directory';
|
||||||
|
)
|
||||||
|
itemiz(\
|
||||||
|
a special context, denoting an element in the shell's syntax. For example
|
||||||
|
`a word in command position' or `an array subscript'.
|
||||||
|
)
|
||||||
|
enditemize()
|
||||||
|
|
||||||
|
A full context specification contains other elements, as we shall describe.
|
||||||
|
|
||||||
|
Besides commands names and contexts, the system employs two more
|
||||||
|
concepts, em(styles) and em(tags). These provide ways for the user
|
||||||
|
to configure the system's behaviour.
|
||||||
|
|
||||||
|
Tags play a dual role. They serve as a classification system for
|
||||||
|
the matches, typically indicating a class of object that the user
|
||||||
|
may need to distinguish. For example, when completing arguments of the
|
||||||
|
tt(ls) command the user may prefer to try tt(files) before tt(directories),
|
||||||
|
so both of these are tags. They also appear as the rightmost
|
||||||
|
element in a context specification.
|
||||||
|
|
||||||
|
Styles modify various operations of the completion system, such as
|
||||||
|
output formatting, but also what kinds of completers are used (and in
|
||||||
|
what order), or which tags are examined. Styles may accept arguments
|
||||||
|
and are manipulated using the tt(zstyle) command described in
|
||||||
|
ifzman(see zmanref(zshmodules))\
|
||||||
|
ifnzman(noderef(The zsh/zutil Module)).
|
||||||
|
|
||||||
|
In summary, tags describe em(what) the completion objects are, and style
|
||||||
|
tt(how) they are to be completed. At various points of execution, the
|
||||||
|
completion system checks what styles and/or tags are defined for the
|
||||||
|
current context, and uses that to modify its behavior. The full
|
||||||
|
description of context handling, which determines how tags and other
|
||||||
|
elements of the context influence the behaviour of styles, is described
|
||||||
|
ifzman(below in COMPLETION SYSTEM CONFIGURATION)\
|
||||||
|
ifnzman(in noderef(Completion System Configuration)).
|
||||||
|
|
||||||
|
When a completion is requested, a dispatcher function is called;
|
||||||
|
see the description of tt(_main_complete) in the list of control functions
|
||||||
|
below. This dispatcher decides which function should
|
||||||
|
be called to produce the completions, and calls it. The result is
|
||||||
|
passed to one or more em(completers), functions that implement
|
||||||
|
individual completion strategies: simple completion, error correction,
|
||||||
|
completion with error correction, menu selection, etc.
|
||||||
|
|
||||||
|
More generally, the shell functions contained in the completion system are
|
||||||
|
of two types:
|
||||||
|
startitemize()
|
||||||
|
itemiz(\
|
||||||
|
those beginning `tt(comp)' are to be called directly; there are only
|
||||||
|
a few of these;
|
||||||
|
)
|
||||||
|
itemiz(\
|
||||||
|
those beginning `tt(_)' are called by the
|
||||||
|
completion code. The shell functions of this set, which implement
|
||||||
completion behaviour and may be bound to keystrokes, are referred to
|
completion behaviour and may be bound to keystrokes, are referred to
|
||||||
as `widgets'.
|
as `widgets'. These proliferate as new completions are required.
|
||||||
|
)
|
||||||
|
enditemize()
|
||||||
|
|
||||||
startmenu()
|
startmenu()
|
||||||
menu(Initialization)
|
menu(Initialization)
|
||||||
|
@ -464,8 +536,9 @@ em(styles), context-sensitive options that can be used to configure the
|
||||||
completion system. The context used for lookup may vary during the same
|
completion system. The context used for lookup may vary during the same
|
||||||
call to the completion system.
|
call to the completion system.
|
||||||
|
|
||||||
The context string always consists of the following fields, separated
|
The context string always consists of a fixed set of fields, separated
|
||||||
by colons and with a leading colon before the first:
|
by colons and with a leading colon before the first, in the form
|
||||||
|
tt(:completion:)var(function)tt(:)var(completer)tt(:)var(command)tt(:)var(argument)tt(:)tt(tag). These have the following meaning:
|
||||||
|
|
||||||
startitemize()
|
startitemize()
|
||||||
itemiz(\
|
itemiz(\
|
||||||
|
@ -510,13 +583,19 @@ this is only the case if the command line is parsed with standard
|
||||||
UNIX-style options and arguments, so many completions do not set this.
|
UNIX-style options and arguments, so many completions do not set this.
|
||||||
)
|
)
|
||||||
itemiz(\
|
itemiz(\
|
||||||
The var(tag). Tags are used to discriminate between the types
|
The var(tag). As described previously, tags are used to discriminate between
|
||||||
of matches a completion function can generate in a certain context and
|
the types of matches a completion function can generate in a certain context.
|
||||||
are described further below.
|
Any completion function may use any tag name it likes, but a list of the
|
||||||
|
more common ones is given below.
|
||||||
)
|
)
|
||||||
enditemize()
|
enditemize()
|
||||||
|
|
||||||
As an example, the context name
|
The context is gradually put together as the functions are executed, starting
|
||||||
|
with the main entry point, which adds tt(:completion:) and the var(function)
|
||||||
|
element if necessary. The completer then adds the var(completer) element.
|
||||||
|
The contextual completion adds the var(command) and var(argument) options.
|
||||||
|
Finally, the var(tag) is added when the types of completion are known.
|
||||||
|
For example, the context name
|
||||||
|
|
||||||
example(tt(:completion::complete:dvips:option-o-1:files))
|
example(tt(:completion::complete:dvips:option-o-1:files))
|
||||||
|
|
||||||
|
@ -527,12 +606,7 @@ example(tt(dvips -o ...))
|
||||||
|
|
||||||
and the completion function will generate filenames.
|
and the completion function will generate filenames.
|
||||||
|
|
||||||
Each type of completion the system can perform in a given context is
|
Usually completion will be tried for all possible tags in an order given
|
||||||
described by a `tag', a short descriptive string such as tt(files) in
|
|
||||||
the example above. Any completion function may use any tag name it
|
|
||||||
likes, but a list of the more common ones is given below.
|
|
||||||
|
|
||||||
Usually completion will be tried by all possible tags in an order given
|
|
||||||
by the completion function. However, this can be altered by using the
|
by the completion function. However, this can be altered by using the
|
||||||
tt(tag-order) style. Completion is then restricted to the list of given
|
tt(tag-order) style. Completion is then restricted to the list of given
|
||||||
tags in the given order.
|
tags in the given order.
|
||||||
|
@ -591,7 +665,7 @@ ifzman(see zmanref(zshcompwid))\
|
||||||
ifnzman(noderef(Completion Widgets)))\
|
ifnzman(noderef(Completion Widgets)))\
|
||||||
). For example,
|
). For example,
|
||||||
|
|
||||||
example(tt(ztyle -e ':completion:*' hosts 'reply=($myhosts)'))
|
example(tt(zstyle -e ':completion:*' hosts 'reply=($myhosts)'))
|
||||||
|
|
||||||
This forces the value of the tt(hosts) style to be read from the
|
This forces the value of the tt(hosts) style to be read from the
|
||||||
variable tt(myhosts) each time a host name is needed; this is useful
|
variable tt(myhosts) each time a host name is needed; this is useful
|
||||||
|
|
|
@ -11,9 +11,9 @@ features is described in
|
||||||
ifzman(zmanref(zshcompsys))\
|
ifzman(zmanref(zshcompsys))\
|
||||||
ifnzman(the next chapter, noderef(Completion System)),
|
ifnzman(the next chapter, noderef(Completion System)),
|
||||||
and users with no interest in adding to that system (or, potentially,
|
and users with no interest in adding to that system (or, potentially,
|
||||||
writing their own DASH()- see dictionary entry for `hubris') should skip this
|
writing their own DASH()- see dictionary entry for `hubris') should skip
|
||||||
section. The older system based on the tt(compctl) builtin command is
|
the current section. The older system based on the tt(compctl) builtin
|
||||||
described in
|
command is described in
|
||||||
ifzman(zmanref(zshcompctl))\
|
ifzman(zmanref(zshcompctl))\
|
||||||
ifnzman(noderef(Completion Using compctl)).
|
ifnzman(noderef(Completion Using compctl)).
|
||||||
|
|
||||||
|
|
|
@ -40,14 +40,33 @@ variables (referred to in the documentation as parameters) tt(HISTFILE),
|
||||||
tt(HISTSIZE) and tt(SAVEHIST) in ifzman(zmanref(zshparam))\
|
tt(HISTSIZE) and tt(SAVEHIST) in ifzman(zmanref(zshparam))\
|
||||||
ifnzman(noderef(Parameters Used By The Shell)).
|
ifnzman(noderef(Parameters Used By The Shell)).
|
||||||
|
|
||||||
The line editor provides an extensive completion system and the shell
|
subsect(Completion)
|
||||||
is supplied with completions for many commonly used commands. Note
|
|
||||||
that the new completion system referred to as tt(compsys) is preferred
|
Completion is a feature present in many shells. It allows the user to
|
||||||
over the older tt(compctl) system. The completion system must be enabled
|
type only a part (usually the prefix) of a word and have the shell fill
|
||||||
explicitly when the shell starts. For more information see
|
in the rest. The completion system in zsh is programmable. For
|
||||||
|
example, the shell can be set to complete email addresses in
|
||||||
|
arguments to the mail command from your tt(~/.abook/addressbook);
|
||||||
|
usernames, hostnames, and even remote paths in arguments to scp, and so
|
||||||
|
on. Anything that can be written in or glued together with zsh can be
|
||||||
|
the source of what the line editor offers as possible completions.
|
||||||
|
|
||||||
|
Zsh has two completion systems, an old, so called tt(compctl) completion
|
||||||
|
(named after the builtin command that serves as its complete and only
|
||||||
|
user interface), and a new one, referred to as tt(compsys),
|
||||||
|
organized as library of builtin and user-defined functions.
|
||||||
|
The two systems differ in their interface for specifying the completion
|
||||||
|
behavior. The new system is more customizable and is supplied with
|
||||||
|
completions for many commonly used commands; it is therefore to be
|
||||||
|
preferred.
|
||||||
|
|
||||||
|
The completion system must be enabled explicitly when the shell starts.
|
||||||
|
For more information see
|
||||||
ifzman(zmanref(zshcompsys))\
|
ifzman(zmanref(zshcompsys))\
|
||||||
ifnzman(noderef(Completion System)).
|
ifnzman(noderef(Completion System)).
|
||||||
|
|
||||||
|
subsect(Extending the line editor)
|
||||||
|
|
||||||
Apart from completion, the line editor is highly extensible by means of
|
Apart from completion, the line editor is highly extensible by means of
|
||||||
shell functions. Some useful functions are provided with the shell; they
|
shell functions. Some useful functions are provided with the shell; they
|
||||||
provide facilities such as:
|
provide facilities such as:
|
||||||
|
|
Loading…
Reference in a new issue