Marlon Richert wrote:
> Shouldn't _complete do `PREFIX+=$SUFFIX; SUFFIX=` before calling completion
> functions, since, otherwise, there is no meaningful difference between it and
> _prefix?
Definitely not. Given a<cursor>c and candidate matches abc and acd,
_complete should complete to abc with complete_in_word set, offer both with
_prefix and complete to acd if complete_in_word is unset.
I did some testing and it actually works slightly differently.
Given candidate matches abc, abcd and acd,
  * when given a<cursor>c,
    * if complete_in_word is set, then
      * _complete completes to abc and
      * _prefix is never called.
    * if complete_in_word is unset, then
      * _complete completes to acd and
      * _prefix is never called.
  * when given a<cursor>e,
    * if complete_in_word is set, then
      * _complete fails and
      * _prefix offers abc, abcd acd.
    * if complete_in_word is unset, then
      * _complete fails and
      * _prefix fails, too.
In other words, given a command line <prefix><cursor><suffix>,
* if complete_in_word is set, then
  * _complete offers completions matching <prefix><anything><suffix>
  * _prefix offers completions matching <prefix><anything>
* if complete_in_word is unset, then
  * _complete offers completions matching <prefix><suffix><anything>
  * _prefix also offers completions matching <prefix><suffix><anything>
I suppose that's actually what it says on the tin, but it sure didn't come to me intuitively.
I'm also still not sure whether all completion functions are using $PREFIX and $SUFFIX correctly, but I'll leave it at that.