Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: help for writing GNU stow completion

On 6 Aug 2019, at 12:04, Aurélien <orel_jf@xxxxxxxx> wrote:
> From the command line, when I try to complete something like this:
>    % stow --dir=$HOME/.dotfiles/
> I get: 'no packages found in $HOME/.dotfiles/'
> It seems that "$HOME" is not evaluated, and it is the same with "~". Is
> there a way to evaluate these elements?

Sorry for the late reply (haven't been paying attention to the ML much
recently), but if you still need help with this:

Completion functions get arguments on the command line in a 'raw' form,
exactly as they're given, including unexpanded parameters, leading tildes,
quotes, &c. That's why you get a literal $HOME instead of its value.

You can use the (Q) expansion flag to strip quotes, which is a semi-common
thing in completion functions when they need to take user input from the
command line, but there's no flag for anything fancier, and most functions
don't seem to bother with it. But if you wanted to, something like this is
probably the best way...?

  local -a stow_pkg_list
  eval set -A stow_pkg_list $1
  [[ -n $stow_pkg_list ]] && stow_pkg_list=( $stow_pkg_list/*(-/N:t) )

It's not perfectly accurate, though; for example, because of how _arguments
breaks up optargs, this would treat `--dir=~/foo` and `--dir ~/foo` the same,
even though the tilde would not actually be expanded before passing it to stow
in the former case (unless magic_equal_subst was enabled)


Messages sorted by: Reverse Date, Date, Thread, Author