[hackers] Re: [st][PATCH] Port the copyurl patch to the 0.8.1 st release. Mainly fix usage of depracted selcopy

From: Michael Buch <michaelbuch12_AT_gmail.com>
Date: Wed, 18 Apr 2018 02:04:29 +0100

Apologies, just realized I should've added it to the Wiki patches section
instead of sending it here.

2018-04-18 1:44 GMT+01:00 <michaelbuch12_AT_gmail.com>:

> From: Michael Buch <michaelbuch12_AT_gmail.com>
>
> ---
> config.def.h | 1 +
> st.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> st.h | 1 +
> 3 files changed, 64 insertions(+)
>
> diff --git a/config.def.h b/config.def.h
> index 82b1b09..cbe923e 100644
> --- a/config.def.h
> +++ b/config.def.h
> _AT__AT_ -178,6 +178,7 @@ static Shortcut shortcuts[] = {
> { TERMMOD, XK_Y, selpaste, {.i = 0}
> },
> { TERMMOD, XK_Num_Lock, numlock, {.i = 0}
> },
> { TERMMOD, XK_I, iso14755, {.i = 0}
> },
> + { MODKEY, XK_l, copyurl, {.i = 0}
> },
> };
>
> /*
> diff --git a/st.c b/st.c
> index 0628707..3df99d9 100644
> --- a/st.c
> +++ b/st.c
> _AT__AT_ -2617,3 +2617,65 @@ redraw(void)
> tfulldirt();
> draw();
> }
> +
> +/* select and copy the previous url on screen (do nothing if there's no
> url).
> + * known bug: doesn't handle urls that span multiple lines (wontfix)
> + * known bug: only finds first url on line (mightfix)
> + */
> +void
> +copyurl(const Arg *arg) {
> + /* () and [] can appear in urls, but excluding them here will
> reduce false
> + * positives when figuring out where a given url ends.
> + */
> + static char URLCHARS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
> + "abcdefghijklmnopqrstuvwxyz"
> + "0123456789-._~:/?#_AT_!$&'*+,;=%";
> +
> + int i, row, startrow;
> + char *linestr = calloc(sizeof(char), term.col+1); /* assume ascii
> */
> + char *c, *match = NULL;
> +
> + row = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y-1 : term.bot;
> + LIMIT(row, term.top, term.bot);
> + startrow = row;
> +
> + /* find the start of the last url before selection */
> + do {
> + for (i = 0; i < term.col; ++i) {
> + if (term.line[row][i].u > 127) /* assume ascii */
> + continue;
> + linestr[i] = term.line[row][i].u;
> + }
> + linestr[term.col] = '\0';
> + if ((match = strstr(linestr, "http://"))
> + || (match = strstr(linestr, "https://")))
> + break;
> + if (--row < term.top)
> + row = term.bot;
> + } while (row != startrow);
> +
> + if (match) {
> + /* must happen before trim */
> + selclear();
> + sel.ob.x = strlen(linestr) - strlen(match);
> +
> + /* trim the rest of the line from the url match */
> + for (c = match; *c != '\0'; ++c)
> + if (!strchr(URLCHARS, *c)) {
> + *c = '\0';
> + break;
> + }
> +
> + /* select and copy */
> + sel.mode = 1;
> + sel.type = SEL_REGULAR;
> + sel.oe.x = sel.ob.x + strlen(match)-1;
> + sel.ob.y = sel.oe.y = row;
> + selnormalize();
> + tsetdirt(sel.nb.y, sel.ne.y);
> + xsetsel(getsel());
> + xclipcopy();
> + }
> +
> + free(linestr);
> +}
> diff --git a/st.h b/st.h
> index dac64d8..5a58f8f 100644
> --- a/st.h
> +++ b/st.h
> _AT__AT_ -85,6 +85,7 @@ void printscreen(const Arg *);
> void printsel(const Arg *);
> void sendbreak(const Arg *);
> void toggleprinter(const Arg *);
> +void copyurl(const Arg *);
>
> int tattrset(int);
> void tnew(int, int);
> --
> 2.17.0
>
>
Received on Wed Apr 18 2018 - 03:04:29 CEST

This archive was generated by hypermail 2.3.0 : Wed Apr 18 2018 - 03:12:23 CEST