Given this setup:
% zmodload zsh/complist
% autoload compinit
% compinit
% bindkey '^I' tst-complete
% zle -C tst-complete menu-select tst-complete
% tst-complete() { compadd -Ssuffix -R tst-suffix -- a b }
% tst-suffix() { LBUFFER+="len=$1" }
% bindkey '^[i' tst-custom
% zle -N tst-custom
% tst-custom() { zle beginning-of-line }
Then the following is expected behavior:
# press `:`+Space+Tab
% : asuffix
a b# completion menu opened
# press Escape+`i`
% : asuffixlen=6
# tst-suffix was called and cursor was moved to beginning of line
However, if we do not call any built-in widget inside our custom widget,then tst-suffix does not get called:
% tst-custom() { CURSOR=0 }
# press `:`+Space+Tab
% : asuffix
a b# completion menu opened
# press Escape+`i`
% : asuffix
# cursor was moved to beginning of line, but tst-suffix was not called
Interestingly, if we then activate a built-in widget right after,
then tst-suffix gets called after all, but with the wrong value:
% len=0 : asuffix