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

Re: detect if compinit was run and rerun

On Fri, Jun 1, 2018 at 4:58 PM, Paul Seyfert
<pseyfert.mathphys@xxxxxxxxx> wrote:
> Dear all,
> We are working on a small script that is supposed to be sourced to set
> up some environment for a user. I.e. it mostly prepends to PATH,
> For the additional commands, we would also like to provide tab
> completions. The plan is atm to have them all in one directory which
> would be prepended (appended?) to $fpath.
> As far as I see, manipulating $fpath doesn't change the completion
> behaviour until `compinit` is run. As far as I know it corresponds the
> zsh design to not force completion on the user unless they ask for it,
> therefore I don't want to blindly run compinit in the script (if a user
> does not call `compinit`, I don't do it for them). On the other hand I
> don't want to annoy users with "yes, you already called `compinit` in
> your .zshrc, but you need to do it again".
> I am therefore wondering if I can detect if `compinit` has already been
> called and rerun it if so.
> Do you have suggestions how to approach this?
> I drafted:
> ( compdef ) ; [ $? != 127 ] && compinit ;
> Ideally I would reuse its settings. I.e. if a user ran `compinit` with
> -i or -C originally, our script shouldn't run `compinit` w/o.

If you change fpath and then rerun compinit, you are going to cause
zcompdump to be regenerated, ie every startup will do two full
regenerations of the cache instead of 0. Instead, you should not do
that. Just make sure your code that changes fpath is run before the
user runs compinit (by asking the user to configure their shell
correctly). If you absolutely want to add a completer at runtime, it
is probably better to use only compdef+autoload and not compinit. I
don't see any reason why the user would want to avoid having these
completers always configured though.

Mikael Magnusson

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