[Surfraw-devel] Elvis-specific completions are done

Gabriel Lisaca gabriel.lisaca at gmail.com
Wed Jun 16 12:11:40 BST 2021

Hi all,

Just a warning, long mail ahead!

So I've finished (really) the elvis-specific completions support I 
talked about a while back.  It's at merge request !15 [0].

It would be appreciated if you had a play around with it.  If you want 
to read the changes, the most relevant files to see are surfraw.IN and 

Regarding the issues raised when I suggested elvis-specific completions:

* I don't think this is much more complicated than before and it's easy 
enough to use by example (copy-pasting is even encouraged by the HACKING 
* It also doesn't affect the current test approach at all.  Why would 
the completions be tested?

On the other hand, the benefits include a more comfortable command line, 
and easy consumption by tools that wrap surfraw to give a nicer 
interface.  As for the former, stuff like -co*=* are nice, but too 
imprecise for my tastes.  I do the latter in my dmenu script for surfraw 
[1], and it feels nice to use.

(To be honest, I want my elvi on my phone, which I have most of the 
time.  And since typing on a phone is a pain, a graphical interface that 
gives me full access to the functions of an elvis is important.  I plan 
to do this at some point.)

I've documented the changes in the HACKING file, but here's a summary:

 > Surfraw now supports elvis-specific tab-completions, eg:
       sr debpackages -<TAB>
       sr debpackages -release=<TAB>
       sr debpackages <TAB>
   can all be defined by an elvis.

The first one (option name completion) is done by the new function 
mkopts() whose arguments are the option names available to the current 
elvis.  Options that take arguments and those that don't are 
distinguished by an '=' suffix.  '=' for options that *do*, nothing for 
options that don't.
For example:
     mkopts optwithoutarg optwitharg=

The second one (option argument completion) is done by 
w3_complete_hook_opt().  It functions similarly to 
w3_parse_option_hook(), switching on its input (the option), but this 
time outputting its possible values, separated by whitespace, instead of 
setting variables.

The third one (elvis argument completion) is done by 
w3_complete_hook_arg().  The output is the possible values of the 
argument, separated by *newline* characters.  It defaults to using 
`look` on the system dictionary (like it did before), but some elvi 
override it for more useful completions, such as debpackages and other 
elvi that work with package names.

More elvi now complete package names too: archpkg, debpkghome, finkpkg, 
and genportage.  Package names are taken from one of: apt-cache, pacman, 
yum, and fink.  I use Debian so I used online references to help create 
completions from the other package managers.  Just FYI.

0: https://gitlab.com/surfraw/Surfraw/-/merge_requests/15


More information about the Surfraw-devel mailing list