commit 753c6ac75647edbcc6acc7c98cab4bce07b1636d from: Omar Polo date: Wed Jul 14 15:27:37 2021 UTC swiper & link-select using the minibuffer! commit - a671711020e5e6ebd5585a118a03801c79136a4d commit + 753c6ac75647edbcc6acc7c98cab4bce07b1636d blob - c0a8b754824c75529b5d2a17067a287754dde499 blob + 507a8c83952f012c75e524d3f698f5eb640130a5 --- ChangeLog +++ ChangeLog @@ -1,5 +1,11 @@ 2021-07-14 Omar Polo + * defaults.c (load_default_keys): bind M-L to link-select + (load_default_keys): bind M-/ to swiper + + * cmd.c (cmd_link_select): add link-select + (cmd_swiper): add swiper + * defaults.c (load_default_keys): bind M-t to tab-select * cmd.c (cmd_tab_select): add tab-select blob - cc749be2e22468a529dd2b9805bb7c52cd9d068f blob + 74b0f596b190da9014ca05d7eb6fe63bdd0aa8cb --- cmd.c +++ cmd.c @@ -550,6 +550,32 @@ void cmd_toggle_help(struct buffer *buffer) { ui_toggle_side_window(); +} + +void +cmd_link_select(struct buffer *buffer) +{ + if (in_minibuffer) { + message("We don't have enable-recursive-minibuffers"); + return; + } + + enter_minibuffer(minibuffer_self_insert, ls_select, exit_minibuffer, + NULL, compl_ls, TAILQ_FIRST(&buffer->page.head)); + strlcpy(ministate.prompt, "Select link: ", sizeof(ministate.prompt)); +} + +void +cmd_swiper(struct buffer *buffer) +{ + if (in_minibuffer) { + message("We don't have enable-recursive-minibuffers"); + return; + } + + enter_minibuffer(minibuffer_self_insert, swiper_select, exit_minibuffer, + NULL, compl_swiper, TAILQ_FIRST(&buffer->page.head)); + strlcpy(ministate.prompt, "Select line: ", sizeof(ministate.prompt)); } void blob - d917ae29efa1d6cb4ec883bc7610be7a008be618 blob + 227bf3ff7479cefd2f2b35611bb7c2b86ef2d988 --- cmd.h +++ cmd.h @@ -55,6 +55,9 @@ CMD(cmd_bookmark_page); CMD(cmd_list_bookmarks); CMD(cmd_toggle_help); +CMD(cmd_link_select); +CMD(cmd_swiper); + CMD(cmd_inc_fill_column); CMD(cmd_dec_fill_column); CMD(cmd_olivetti_mode); blob - f82f8aba82053b4344b19225585199aa6957a462 blob + ec2e3f4ea4ca9f6e63cc12bfba957ef7f74008fd --- compl.c +++ compl.c @@ -57,3 +57,48 @@ compl_ts(void **data, void **ret) return (*tab)->hist_cur->h; return (*tab)->buffer.page.title; } + +/* + * Provide completions for link-select. + */ +const char * +compl_ls(void **data, void **ret) +{ + struct line **line = (struct line **)data; + struct line *l; + const char *link; + + l = *line; + while (l != NULL && l->type != LINE_LINK) + l = TAILQ_NEXT(l, lines); + + /* end of buffer */ + if (l == NULL) + return NULL; + + link = l->line; + *ret = l; + *line = TAILQ_NEXT(l, lines); + return link; +} + +/* + * Provide completinos for swiper. + */ +const char * +compl_swiper(void **data, void **ret) +{ + struct line **line = (struct line **)data; + const char *text; + + while (*line != NULL && (*line)->line == NULL) + *line = TAILQ_NEXT(*line, lines); + + if (*line == NULL) + return NULL; + + text = (*line)->line; + *ret = *line; + *line = TAILQ_NEXT(*line, lines); + return text; +} blob - 6c7ce78052bff445bb26ee0c5faaa014df6e8fed blob + f1f98044e05a618124876db167f4fcaa1d4b9be3 --- compl.h +++ compl.h @@ -19,5 +19,7 @@ const char *compl_eecmd(void **, void **); const char *compl_ts(void **, void **); +const char *compl_ls(void **, void **); +const char *compl_swiper(void **, void **); #endif blob - 51ce6b015727274fc997c0e2c2a30f2a00e71aaf blob + d7e1a2c2a8db1d3e128d976ab9711158973cad84 --- defaults.c +++ defaults.c @@ -316,6 +316,8 @@ load_default_keys(void) global_set_key("backtab", cmd_previous_button); global_set_key("tab", cmd_next_button); global_set_key("M-t", cmd_tab_select); + global_set_key("M-L", cmd_link_select); + global_set_key("M-/", cmd_swiper); /* === minibuffer map === */ minibuffer_set_key("ret", cmd_mini_complete_and_exit); blob - 1efdef09ad6b3cb21f312d9b57a089af0e6e89e5 blob + 9a37ea02a70008c37bfeb713e675fa1aec01945d --- minibuffer.c +++ minibuffer.c @@ -235,6 +235,56 @@ ts_select(void) tab = vl->parent->meta.data; exit_minibuffer(); switch_to_tab(tab); +} + +void +ls_select(void) +{ + struct line *l; + struct vline *vl; + + vl = ministate.compl.buffer.current_line; + + if (vl == NULL || vl->parent->flags & L_HIDDEN) { + message("No link selected"); + return; + } + + l = vl->parent->meta.data; + exit_minibuffer(); + + load_url_in_tab(current_tab(), l->meta.alt); +} + +void +swiper_select(void) +{ + struct line *l; + struct vline *vl; + struct tab *tab; + + vl = ministate.compl.buffer.current_line; + + if (vl == NULL || vl->parent->flags & L_HIDDEN) { + message("No line selected"); + return; + } + + l = vl->parent->meta.data; + exit_minibuffer(); + + tab = current_tab(); + + TAILQ_FOREACH(vl, &tab->buffer.head, vlines) { + if (vl->parent == l) + break; + } + + if (vl == NULL) + message("Ops, swiper error! Please report to %s", + PACKAGE_BUGREPORT); + else + tab->buffer.current_line = vl; } static void blob - c4a89364a75b28d2f4da474c60c14165ac06b6df blob + 9981be0e6bae2d5217fb272827c5d7487ab95a38 --- minibuffer.h +++ minibuffer.h @@ -73,6 +73,8 @@ void lu_self_insert(void); void lu_select(void); void bp_select(void); void ts_select(void); +void ls_select(void); +void swiper_select(void); void enter_minibuffer(void(*)(void), void(*)(void), void(*)(void), struct histhead *, blob - b7261c32639b8a946027f1ba110168762a3bb20a blob + 19491e23511d5c22c06beeff079e586dc81b4682 --- telescope.1 +++ telescope.1 @@ -303,6 +303,10 @@ previous-button next-button .It M-t tab-select +.It M-L +link-select +.It M-/ +swiper .El .Ss Minibuffer-specific keys .Bl -tag -width xxxxxxxxxxxx -offset indent -compact @@ -435,6 +439,8 @@ Quit .Nm . .It Ic inc-fill-column Increments fill-column by two. +.It Ic link-select +Select and visit a link using the minibuffer. .It Ic load-current-url Prompts for an URL, the minibuffer is preloaded with the current one. @@ -466,6 +472,8 @@ Scroll down by one line. Scroll up by one line. .It Ic scroll-up Scroll up by one visual page. +.It Ic swiper +Jump to a line using the minibuffer. .It Ic toggle-help Toggle side window with help about available keys and their associated interactive command.