Hello all,

I’ve recently written a few Bash functions to help me define completions for some personal scripts and commands, and I would appreciate your opinion and suggestions for improvements. As no explanation beats a good example, here is a small example of a completion description with these functions (they all start with ‘C.’ to facilitate reading and to avoid name clashes) :

|source /usr/share/bash/bashcomps.shl # I had some qualms about putting a shell 
script in /usr/lib

function C.example() {
    C.alt C.describing "a color" C.wordOf 5 red green blue black white \
            C.describing "a file" C.fileIn -f . \
            C.normal "$@"
    C.alt C.describing "invert colors" C.flagOf 2 -I --invert \
            C.normal "$@"
 }
C.defcomp 'C.repeat C.example' example
|

These few lines define a completion function that completes a color then a file, or a single flag, repeated ad infinitum. This is of course a contrived example, but the approach can trivially be extended to more useful completions.

The library predefines a small number of combinators, that can then be used to construct all sorts of complex structures within the arguments. For example, you can complete a URL by simply combining a protocol, a |://|, a hostname, a |/| and a path. In other words :

|function C.url() {
    local prevSuf="$COMP_SUFFIX"
    C.suffixed '://' C.wordOf 3 http https ftp \
       C.suffixed '/' C.hostname \
       C.suffixed "$prevSuf" C.any "$@"
}
|

After that, completing a URL as part of an option becomes a piece of cake :

|function C.urlOpt() {
    C.optOf 2 --url -U C.url "$@"
}
|

Of course, it is still possible to write your own generation functions and plug them into a parsing chain using a function called |C.argument| (in fact, all other helpers are defined in terms of |C.argument|) but I won’t bore you with the details here, that’s what the man page is for ;-)

If you want to test it for yourself, you can download it here <https://pool.coiffier.net/packages/bashcomps.tgz> (for a distribution-independent .tar.gz version), or directly as a .deb <https://pool.coiffier.net/packages/bashcomps.deb> or .tar.xz <https://pool.coiffier.net/packages/bashcomps.tar.xz> if your distro supports it.

Anyway, thank you for reading this far, and for any feedback or opinion you might have :-)

Yours indubitably,
Marc Coiffier

​
_______________________________________________
Bash-completion-devel mailing list
Bash-completion-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/bash-completion-devel

Reply via email to