commit 65601367fceed001d065f7e8bbd8c87439d8fd60 from: Omar Polo date: Wed Jul 14 14:36:59 2021 UTC add M-t (tab-select); extend the completion API commit - e9beee55fac609bf1acc351cda8deeedceabc52a commit + 65601367fceed001d065f7e8bbd8c87439d8fd60 blob - d8df75d4f04bc1cd10bbcbd2ec0cfbcad6d8044e blob + c0a8b754824c75529b5d2a17067a287754dde499 --- ChangeLog +++ ChangeLog @@ -1,5 +1,9 @@ 2021-07-14 Omar Polo + * defaults.c (load_default_keys): bind M-t to tab-select + + * cmd.c (cmd_tab_select): add tab-select + * defaults.c (load_default_keys): bind f5 to reload-page (load_default_keys): bind r to reload-page blob - dda99c778de636e6699decfab50640386bda21a7 blob + cc749be2e22468a529dd2b9805bb7c52cd9d068f --- cmd.c +++ cmd.c @@ -475,6 +475,19 @@ cmd_tab_move_to(struct buffer *buffer) } void +cmd_tab_select(struct buffer *buffer) +{ + if (in_minibuffer) { + message("We don't have enable-recursive-minibuffers"); + return; + } + + enter_minibuffer(minibuffer_self_insert, ts_select, exit_minibuffer, + NULL, compl_ts, NULL); + strlcpy(ministate.prompt, "Select tab: ", sizeof(ministate.prompt)); +} + +void cmd_load_url(struct buffer *buffer) { if (in_minibuffer) { blob - 5014678193e118a6328f1ee8d1cfb78ef056bdc8 blob + d917ae29efa1d6cb4ec883bc7610be7a008be618 --- cmd.h +++ cmd.h @@ -47,6 +47,7 @@ DEFALIAS(tabp, cmd_tab_previous) CMD(cmd_tab_move); CMD(cmd_tab_move_to); +CMD(cmd_tab_select); CMD(cmd_load_url); CMD(cmd_load_current_url); CMD(cmd_reload_page); blob - 315c8b7babf7d2d7c78216c1e29018ee72ff9a85 blob + fc7484ba7bcc79961838ef5568f1d9e9a6226e43 --- compl.c +++ compl.c @@ -20,7 +20,7 @@ #include "telescope.h" const char * -compl_eecmd(void **data) +compl_eecmd(void **data, void **ret) { struct cmd **state = (struct cmd **)data; @@ -33,3 +33,21 @@ compl_eecmd(void **data) return (*state)++->cmd; } + +const char * +compl_ts(void **data, void **ret) +{ + struct tab **tab = (struct tab **)data; + + /* first time: init the state */ + if (*tab == NULL) + *tab = TAILQ_FIRST(&tabshead); + else if ((*tab = TAILQ_NEXT(*tab, tabs)) == NULL) + return NULL; + + *ret = *tab; + + if (*(*tab)->buffer.page.title == '\0') + return (*tab)->hist_cur->h; + return (*tab)->buffer.page.title; +} blob - 8bf04bcb4c4660854bfa2ed924c52f23eb9c1c0c blob + 6c7ce78052bff445bb26ee0c5faaa014df6e8fed --- compl.h +++ compl.h @@ -17,6 +17,7 @@ #ifndef COMPL_H #define COMPL_H -const char *compl_eecmd(void **); +const char *compl_eecmd(void **, void **); +const char *compl_ts(void **, void **); #endif blob - 145e8b461d949d4bdac18575810c4c80b0c9a7b2 blob + 51ce6b015727274fc997c0e2c2a30f2a00e71aaf --- defaults.c +++ defaults.c @@ -315,6 +315,7 @@ load_default_keys(void) global_set_key("M-tab", cmd_previous_button); global_set_key("backtab", cmd_previous_button); global_set_key("tab", cmd_next_button); + global_set_key("M-t", cmd_tab_select); /* === minibuffer map === */ minibuffer_set_key("ret", cmd_mini_complete_and_exit); blob - b48c7b920e5bc6656de8541757ee2a10396b029a blob + 1efdef09ad6b3cb21f312d9b57a089af0e6e89e5 --- minibuffer.c +++ minibuffer.c @@ -22,7 +22,6 @@ #include "utf8.h" static void minibuffer_hist_save_entry(void); -static void minibuffer_self_insert(void); static void yornp_self_insert(void); static void yornp_abort(void); static void read_self_insert(void); @@ -113,7 +112,7 @@ minibuffer_taint_hist(void) ministate.buffer.current_line->line = ministate.buf; } -static void +void minibuffer_self_insert(void) { char *c, tmp[5] = {0}; @@ -220,6 +219,24 @@ bp_select(void) message("Abort."); } +void +ts_select(void) +{ + struct vline *vl; + struct tab *tab; + + vl = ministate.compl.buffer.current_line; + + if (vl == NULL || vl->parent->flags & L_HIDDEN) { + message("No tab selected"); + return; + } + + tab = vl->parent->meta.data; + exit_minibuffer(); + switch_to_tab(tab); +} + static void yornp_self_insert(void) { @@ -275,15 +292,17 @@ populate_compl_buffer(complfn *fn, void *data) struct line *l; struct buffer *b; struct parser *p; + void *linedata = NULL; b = &ministate.compl.buffer; p = &b->page; - while ((s = fn(&data)) != NULL) { + while ((s = fn(&data, &linedata)) != NULL) { if ((l = calloc(1, sizeof(*l))) == NULL) abort(); l->type = LINE_COMPL; + l->meta.data = linedata; if ((l->line = strdup(s)) == NULL) abort(); @@ -291,6 +310,8 @@ populate_compl_buffer(complfn *fn, void *data) TAILQ_INSERT_HEAD(&p->head, l, lines); else TAILQ_INSERT_TAIL(&p->head, l, lines); + + linedata = NULL; } if ((l = TAILQ_FIRST(&p->head)) != NULL) blob - 73e4f9f746397c6856c0ce65b15083e15bd7380c blob + 52c1fa531c17aeab0cddfde3e01df89e770fd0d3 --- minibuffer.h +++ minibuffer.h @@ -29,9 +29,11 @@ * using the given parameter `state' and modify it eventually. To * signal the end of the completions, complfn should return NULL: the * value of state will then be discarded and the function never called - * again. + * again. The second parameter is some extra metadata per-line; it'll + * be available as line->meta.data on the selected line during the + * minibuffer lifecycle. */ -typedef const char *(complfn)(void **); +typedef const char *(complfn)(void **, void **); struct ministate { char *curmesg; blob - e93980071fcbb4244679e7aaf91b2010dd57f27d blob + 05adbf2643cd4f5857e78503b6962f6a4f9f3572 --- ui.h +++ ui.h @@ -101,6 +101,7 @@ void save_excursion(struct excursion *, struct buffe void restore_excursion(struct excursion *, struct buffer *); void global_key_unbound(void); void minibuffer_taint_hist(void); +void minibuffer_self_insert(void); void eecmd_self_insert(void); void eecmd_select(void); void ir_self_insert(void); @@ -108,6 +109,7 @@ void ir_select(void); void lu_self_insert(void); void lu_select(void); void bp_select(void); +void ts_select(void); struct vline *adjust_line(struct vline *, struct buffer *); void vmessage(const char *, va_list); void message(const char *, ...) __attribute__((format(printf, 1, 2)));