This patch originated from a zsh-synatx-highlighting issue: https://github.com/zsh-users/zsh-syntax-highlighting/issues/375 I think redrawhook() should be called at the end of do_single() to make sure that zle-line-pre-redraw is run when cycling the results of a menu completion. By the way (unrelated): The hooks (which served me as entry point for finding the right spot for the path) #define INSERTMATCHHOOK (comphooks + 0) #define MENUSTARTHOOK (comphooks + 1) #define COMPCTLMAKEHOOK (comphooks + 2) #define COMPCTLCLEANUPHOOK (comphooks + 3) #define COMPLISTMATCHESHOOK (comphooks + 4) ... struct hookdef comphooks[] = { HOOKDEF("insert_match", NULL, HOOKF_ALL), HOOKDEF("menu_start", NULL, HOOKF_ALL), HOOKDEF("compctl_make", NULL, 0), HOOKDEF("compctl_cleanup", NULL, 0), HOOKDEF("comp_list_matches", ilistmatches, 0), }; seem to be undocumented.