commit 27dbcaab4fac08fbb43df9eb5f10781ff7015bb6 from: Omar Polo date: Wed Apr 13 20:59:46 2022 UTC add must_select flag for enter_minibuffer it only makes sense when entering the minibuffer with completions. This flag is useful for functions like tag-select where the user types something but one of the completions *must* be selected. commit - 7bd3a14bde9bd349f4ac2fca9e7f3a1b56ea5d5a commit + 27dbcaab4fac08fbb43df9eb5f10781ff7015bb6 blob - ccb571e9dca92633ca0afe9be381a797156e874d blob + 92b8bcf4c2ea294db0ecd10eb10de790563f2c40 --- cmd.c +++ cmd.c @@ -434,7 +434,7 @@ cmd_execute_extended_command(struct buffer *buffer) GUARD_RECURSIVE_MINIBUFFER(); enter_minibuffer(sensible_self_insert, eecmd_select, exit_minibuffer, - &eecmd_history, compl_eecmd, NULL); + &eecmd_history, compl_eecmd, NULL, 1); len = sizeof(ministate.prompt); strlcpy(ministate.prompt, "", len); @@ -555,7 +555,7 @@ cmd_tab_select(struct buffer *buffer) GUARD_RECURSIVE_MINIBUFFER(); enter_minibuffer(sensible_self_insert, ts_select, exit_minibuffer, - NULL, compl_ts, NULL); + NULL, compl_ts, NULL, 1); strlcpy(ministate.prompt, "Select tab: ", sizeof(ministate.prompt)); } @@ -565,7 +565,7 @@ cmd_load_url(struct buffer *buffer) GUARD_RECURSIVE_MINIBUFFER(); enter_minibuffer(sensible_self_insert, lu_select, exit_minibuffer, - &lu_history, compl_lu, NULL); + &lu_history, compl_lu, NULL, 0); strlcpy(ministate.prompt, "Load URL: ", sizeof(ministate.prompt)); } @@ -575,7 +575,7 @@ cmd_load_current_url(struct buffer *buffer) GUARD_RECURSIVE_MINIBUFFER(); enter_minibuffer(sensible_self_insert, lu_select, exit_minibuffer, - &lu_history, compl_lu, NULL); + &lu_history, compl_lu, NULL, 0); strlcpy(ministate.prompt, "Load URL: ", sizeof(ministate.prompt)); strlcpy(ministate.buf, current_tab->hist_cur->h, sizeof(ministate.buf)); ministate.buffer.cpoff = utf8_cplen(ministate.buf); @@ -594,7 +594,7 @@ cmd_bookmark_page(struct buffer *buffer) GUARD_RECURSIVE_MINIBUFFER(); enter_minibuffer(sensible_self_insert, bp_select, exit_minibuffer, NULL, - NULL, NULL); + NULL, NULL, 0); strlcpy(ministate.prompt, "Bookmark URL: ", sizeof(ministate.prompt)); strlcpy(ministate.buf, current_tab->hist_cur->h, sizeof(ministate.buf)); ministate.buffer.cpoff = utf8_cplen(ministate.buf); @@ -629,7 +629,7 @@ cmd_link_select(struct buffer *buffer) } enter_minibuffer(sensible_self_insert, ls_select, exit_minibuffer, - NULL, compl_ls, l); + NULL, compl_ls, l, 1); strlcpy(ministate.prompt, "Select link: ", sizeof(ministate.prompt)); } @@ -639,7 +639,7 @@ cmd_swiper(struct buffer *buffer) GUARD_RECURSIVE_MINIBUFFER(); enter_minibuffer(sensible_self_insert, swiper_select, exit_minibuffer, - NULL, compl_swiper, TAILQ_FIRST(&buffer->page.head)); + NULL, compl_swiper, TAILQ_FIRST(&buffer->page.head), 1); strlcpy(ministate.prompt, "Select line: ", sizeof(ministate.prompt)); } @@ -663,7 +663,7 @@ cmd_toc(struct buffer *buffer) } enter_minibuffer(sensible_self_insert, toc_select, exit_minibuffer, - NULL, compl_toc, l); + NULL, compl_toc, l, 1); strlcpy(ministate.prompt, "Select heading: ", sizeof(ministate.prompt)); } @@ -770,9 +770,20 @@ cmd_mini_abort(struct buffer *buffer) void cmd_mini_complete_and_exit(struct buffer *buffer) { + struct vline *vl; + if (!in_minibuffer) return; + if (ministate.compl.must_select) { + vl = ministate.compl.buffer.current_line; + if (vl == NULL || vl->parent->flags & L_HIDDEN || + vl->parent->type == LINE_COMPL) { + message("no match"); + return; + } + } + minibuffer_taint_hist(); ministate.donefn(); } blob - 70795ac34c8058672ee0a2487c150076873f97b8 blob + e19d2936f5dbf647c825d2caa8bbb9d6cd7bd4ef --- include/minibuffer.h +++ include/minibuffer.h @@ -61,6 +61,7 @@ struct ministate { struct buffer buffer; complfn *fn; void *data; + int must_select; } compl; }; extern struct ministate ministate; @@ -85,7 +86,7 @@ void swiper_select(void); void toc_select(void); void enter_minibuffer(void(*)(void), void(*)(void), void(*)(void), - struct histhead *, complfn *, void *); + struct histhead *, complfn *, void *, int); void exit_minibuffer(void); void yornp(const char *, void (*)(int, struct tab *), struct tab *); blob - 76e6406808ee6c1de69463c742d60c8bf595a446 blob + a5f554244e55478d8f19d20432e2b29fce7e19e7 --- minibuffer.c +++ minibuffer.c @@ -485,7 +485,7 @@ populate_compl_buffer(complfn *fn, void *data) void enter_minibuffer(void (*self_insert_fn)(void), void (*donefn)(void), void (*abortfn)(void), struct histhead *hist, - complfn *complfn, void *compldata) + complfn *complfn, void *compldata, int must_select) { in_minibuffer = complfn == NULL ? MB_READ : MB_COMPREAD; if (in_minibuffer == MB_COMPREAD) { @@ -493,6 +493,7 @@ enter_minibuffer(void (*self_insert_fn)(void), void (* ministate.compl.fn = complfn; ministate.compl.data = compldata; + ministate.compl.must_select = must_select; populate_compl_buffer(complfn, compldata); } @@ -541,7 +542,7 @@ yornp(const char *prompt, void (*fn)(int, struct tab*) yornp_cb = fn; yornp_data = data; enter_minibuffer(yornp_self_insert, yornp_self_insert, - yornp_abort, NULL, NULL, NULL); + yornp_abort, NULL, NULL, NULL, 0); len = sizeof(ministate.prompt); strlcpy(ministate.prompt, prompt, len); @@ -560,7 +561,7 @@ minibuffer_read(const char *prompt, void (*fn)(const c read_cb = fn; read_data = data; enter_minibuffer(read_self_insert, read_select, read_abort, - &read_history, NULL, NULL); + &read_history, NULL, NULL, 0); len = sizeof(ministate.prompt); strlcpy(ministate.prompt, prompt, len); blob - a7af3cbb29c6bace3d7b3441edf2816dc9345e3c blob + fe12f904031d9c35398cc59c25425e3f231b0d08 --- ui.c +++ ui.c @@ -1301,7 +1301,7 @@ ui_require_input(struct tab *tab, int hide, void (*fn) switch_to_tab(tab); enter_minibuffer(sensible_self_insert, fn, exit_minibuffer, - &ir_history, NULL, NULL); + &ir_history, NULL, NULL, 0); strlcpy(ministate.prompt, "Input required: ", sizeof(ministate.prompt)); redraw_tab(tab);