Commit Diff


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);