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 <michaelbuc...@gmail.com>:

> From: Michael Buch <michaelbuc...@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
> @@ -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
> @@ -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-._~:/?#@!$&'*+,;=%";
> +
> +       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
> @@ -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
>
>

Reply via email to