• Marc Cornellà's avatar
    Fix pass zsh completion and autoloading · 142a6c7f
    Marc Cornellà authored
    When autocompleting from `pass <TAB>', sometimes the following errors
    appear:
    
      _values:compvalues:10: not enough arguments
      find: `/home/user/.password-store': No such file or directory
      _values:compvalues:10: not enough arguments
      find: `/home/user/.password-store': No such file or directory
    
    The `_values' error happens when there is no password-store folder *or*
    there are no passwords in pass; the `find' error only when there is no
    password-store folder.
    
    We can trace it back to line 108, which contains the only `_values'
    statement that is executed when we autocomplete from pass. We confirm
    this by following the trail of execution, which is
    
      _pass -> _pass_cmd_show -> _pass_complete_entries ->
            -> _pass_complete_entries_helper
    
    If we try running the command inside `$()' on line 104, we see that it
    returns nothing and the output is blank. This means that `_values' only
    receives 1 of its 2 mandatory parameters, therefore the above error is
    triggered (not enough arguments).
    
    That is unless we don't have a password-store folder, in which case the
    `find: [...] no such file or directory' error is *also* triggered.
    
    We solve the first error by supplying a default value of "" if the
    command outputs nothing, using the zsh construct ${var:-else}.
    
    We solve the second error by redirecting the find command's stderr output
    to /dev/null, so the error is effectively suppressed.
    
    * * * *
    
    This patch also fixes the first tab completion, which currently only
    loads the completion function definition.
    
    We do this by adding a `_pass' statement at the end of the file, which
    runs the `_pass' completion function after loading its definition.
    This is the standard way an autoloaded function works; for other examples
    look at zsh's official completion files.
    142a6c7f
_pass 3.73 KB