This commit is contained in:
Joe Bloggs 2014-03-27 13:40:25 +00:00
parent 3b777e258a
commit b69f5b9d96
1 changed files with 15 additions and 19 deletions

View File

@ -127,7 +127,6 @@ _describe 'values' options
You can use several different lists separated by a double hyphen e.g. like this:
#+BEGIN_SRC sh
#compdef cmd
local -a options arguments
options=('-c:description for -c opt' '-d:description for -d opt')
arguments=('e:description for e arg' 'f:description for f arg')
@ -144,7 +143,6 @@ As arguments it takes a list of specifications each in the form 'TAG:DESCRIPTION
DESCRIPTION is a description, and ACTION is one of the action types listed previously (apart from the ->STRING and =ACTION forms).
For example:
#+BEGIN_SRC sh
#compdef cmd
_alternative 'args:custom args:(a b c)' 'files:filenames:_files'
#+END_SRC
The first specification adds completion candidates a, b & c, and the second specification calls the _files function
@ -152,14 +150,12 @@ for completing filepaths.
We could split the specifications over several lines with \ and add descriptions to each of the custom args like this:
#+BEGIN_SRC sh
#compdef cmd
_alternative 'args:custom args:((a\:"description a" b\:"description b" c\:"description c"))'\
'files:filenames:_files'
#+END_SRC
If we want to call _files with arguments we can put it in braces, like this:
#+BEGIN_SRC sh
#compdef cmd
_alternative 'args:custom args:((a\:"description a" b\:"description b" c\:"description c"))'\
'files:filenames:{_files -/}'
#+END_SRC
@ -167,7 +163,6 @@ _alternative 'args:custom args:((a\:"description a" b\:"description b" c\:"descr
To use parameter expansion to create our list of completions we must use double quotes to quote the specifications,
e.g:
#+BEGIN_SRC sh
#compdef cmd
_alternative "dirs:user directories:($userdirs)"\
"pids:process IDs:($(ps -A o pid=))"
#+END_SRC
@ -176,7 +171,6 @@ evaluates 'ps -A o pid=' to get a list of pids to use as completion candidates.
We can use other utility functions such as _values in the ACTION to perform more complex completions, e.g:
#+BEGIN_SRC sh
#compdef cmd
_alternative "dirs:user directories:($userdirs)"\
'opts:comma separated opts:{_values -s , a b c}'
#+END_SRC
@ -192,14 +186,12 @@ or command arguments.
Basic option specifications take the form '-OPT[DESCRIPTION]', e.g. like this:
#+BEGIN_SRC sh
#compdef cmd
_arguments '-s[sort output]' '--l[long output]' '-l[long output]'
#+END_SRC
Arguments for the option can be specified after the option description in this form '-OPT[DESCRIPTION]:MESSAGE:ACTION',
where MESSAGE is a message to display and ACTION can be any of the forms mentioned in the ACTIONS section above.
For example:
#+BEGIN_SRC sh
#compdef cmd
_arguments '-f[input file]:filename:_files'
#+END_SRC
@ -208,7 +200,6 @@ and MESSAGE & ACTION are as before. If the N is omitted then it just means the n
already been specified). If a double colon is used at the start (after N) then the argument is optional.
For example:
#+BEGIN_SRC sh
#compdef cmd
_arguments '-s[sort output]' '1:first arg:_net_interfaces' '::optional arg:_files' ':next arg:(a b c)'
#+END_SRC
here the first arg is a network interface, the next optional arg is a file name, the last arg can be either a, b or c,
@ -217,7 +208,6 @@ and the -s option may be completed at any position.
The _arguments function allows the full set of ACTION forms listed in the ACTION section above.
This means that you can use actions for selecting case statement branches like this:
#+BEGIN_SRC sh
#compdef cmd
_arguments '-m[music file]:filename:->files' '-f[flags]:flag:->flags'
case "$state" in
files)
@ -244,7 +234,6 @@ _regex_arguments creates a completion function whose name is given by the first
Hence you need to first call _regex_arguments to create the completion function, and then call that function,
e.g. like this:
#+BEGIN_SRC sh
#compdef cmd
_regex_arguments _cmd OTHER_ARGS..
_cmd "$@"
#+END_SRC
@ -254,7 +243,6 @@ These sequences can be separated by '|' to represent alternative sequences of wo
You can use bracketing to arbitrary depth to specify alternate subsequences.
For example:
#+BEGIN_SRC sh
#compdef cmd
_regex_arguments _cmd SEQ1 '|' SEQ2 \( SEQ2a '|' SEQ2b \)
_cmd "$@"
#+END_SRC
@ -267,19 +255,25 @@ for that word. Note that there needs to be a pattern to match the initial comman
Note that the ':TAG:DESCRIPTION:ACTION' part is interpreted in the same way as for the _alternative function specifications,
except that it has an extra : at the start, and now all of the possible ACTION formats listed previously are allowed.
Here is an example
Here is an example:
#+BEGIN_SRC sh
#compdef cmd
_regex_arguments _cmd /$'[^\0]##\0'/ /$'[^\0]##\0'/ 'file:filename:_files' '|' /$'word2\0'/ 'file:filename:_files' \
\( /$'word1\0'/ 'file:filename:_files' '|' /$'word1\0'/ 'file:filename:_files' \)
_regex_arguments _hello /$'[^\0]##\0'/ \( /$'word1(a|b|c)\0'/ ':word:first word:(word1a word1b word1c)' '|'\
/$'word11(a|b|c)\0'/ ':word:first word:(word11a word11b word11c)' \( /$'word2(a|b|c)\0'/ ':word:second word:(word2a word2b word2c)'\
'|' /$'word22(a|b|c)\0'/ ':word:second word:(word22a word22b word22c)' \) \)
_cmd "$@"
#+END_SRC
in this case the first word can be word1 or word11 followed by an a, b or c, and if the first word contains 11 then a second
word is allowed which can be word2 followed by and a, b, or c, or a filename.
If this sounds too complicated a simpler alternative is to use the _regex_words function for creating
If this sounds too complicated a much simpler alternative is to use the _regex_words function for creating
specifications for _regex_arguments.
*** _regex_words
*** Patterns
Note
Note * = wildcard, # = wildcard
* Testing & debugging
To reload a completion function:
#+BEGIN_SRC sh
@ -295,6 +289,8 @@ If the default keybindings don't work you can try pressing Alt+x and then enter
| _complete_help | Alt+2 Ctrl+x h | as above but displays even more information |
| _complete_debug | Ctrl+x ? | performs ordinary completion, but captures in a temporary file a trace of the shell commands executed by the completion system |
* Gotchas (things to watch out for)
Remember to include a #compdef line at the beginning of the file containing the completion function.
Take care to use the correct type of quoting for specifications to _arguments or _regex_arguments:
use double quotes if there is a parameter that needs to be expanded in the specification, single quotes otherwise,
and make sure to use different quotes around item descriptions.