Make zsh complete arguments from a file

后端 未结 2 532
醉话见心
醉话见心 2021-02-03 12:33

zsh is great but its completion system is very diverse. And the documentation lacks good examples. Is there a template for completing for a specific application. Th

2条回答
  •  别跟我提以往
    2021-02-03 13:18

    Simple completion needs are better addressed with _describe, it pairs an array holding completion options and a description for them (you can use multiple array/description pairs, check the manual).

    (_arguments is great but too complex.)

    [...]

    First create a file

    echo "foo\nbar\nbaz\nwith spac e s\noh:noes\noh\:yes" >! ~/simple-complete
    

    Then create a file _simple somewhere in your $fpath:

    #compdef simple
    
    # you may wish to modify the expansion options here
    # PS: 'f' is the flag making one entry per line
    cmds=( ${(uf)"$(< ~/simple-complete)"} ) 
    
    # main advantage here is that it is easy to understand, see alternative below
    _describe 'a description of the completion options' cmds
    
    # this is the equivalent _arguments command... too complex for what it does
    ## _arguments '*:foo:(${cmds})'
    

    then

    function simple() { echo $* }
    autoload _simple # do not forget BEFORE the next cmd! 
    compdef _simple simple # binds the completion function to a command
    
    simple [TAB]
    

    it works. Just make sure the completion file _simple is placed somewhere in your fpath.

    Notice that : in the option list is supposed to be used for separating an option from their (individual) description (oh:noes). So that won't work with _describe unless you quote it (oh\:yes). The commented out _arguments example will not use the : as a separator.

提交回复
热议问题