This gets a little bit hairy. It's no small feat delegating everything
and also keeping track of exactly where the cursor is and where it's supposed
to end up. The alternatives mechanism is a little hacky: if there is an empty
string in the list of completions, that means we are expanding a unique
completion, so don't update the "last" buffer because it'll be wrong.
This gets a little bit hairy. It's no small feat delegating everything and also keeping track of exactly where the cursor is and where it's supposed to end up. The alternatives mechanism is a little hacky: if there is an empty string in the list of completions, that means we are expanding a unique completion, so don't update the "last" buffer because it'll be wrong.