sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit 7d1fc6427a03be35a1b41ead06b435f240535df2
parent 1f59f37076c88427cbcf2a16f8b700e38767f834
Author: Brandon Mulcahy <brandon@jangler.info>
Date:   Fri, 17 Oct 2014 01:01:11 -0400

Add copyurl patch for st

Diffstat:
Ast.suckless.org/patches/copyurl.md | 18++++++++++++++++++
Ast.suckless.org/patches/st-git-copyurl.diff | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+), 0 deletions(-)

diff --git a/st.suckless.org/patches/copyurl.md b/st.suckless.org/patches/copyurl.md @@ -0,0 +1,18 @@ +copyurl +======= + +Description +----------- + +Select and copy the last URL in the display. Multiple invocations cycle through +the available URLs. + +Download +-------- + +* [st-git-copyurl.diff](st-git-copyurl.diff) + +Author +------ + + * Brandon Mulcahy - brandon @ jangler . info diff --git a/st.suckless.org/patches/st-git-copyurl.diff b/st.suckless.org/patches/st-git-copyurl.diff @@ -0,0 +1,98 @@ +From 3aa97780747496b08ec2057266a0a030737cf153 Mon Sep 17 00:00:00 2001 +From: Brandon Mulcahy <brandon@jangler.info> +Date: Fri, 17 Oct 2014 00:27:46 -0400 +Subject: [PATCH] copyurl patch + +Select and copy the last URL in the display. Multiple invocations cycle through +the available URLs. +--- + config.def.h | 1 + + st.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 57 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 1667ed6..be25f2a 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -120,6 +120,7 @@ static Shortcut shortcuts[] = { + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { MODKEY|ShiftMask, XK_Insert, clippaste, {.i = 0} }, + { MODKEY, XK_Num_Lock, numlock, {.i = 0} }, ++ { MODKEY, XK_l, copyurl, {.i = 0} }, + }; + + /* +diff --git a/st.c b/st.c +index bcf96e9..50065e9 100644 +--- a/st.c ++++ b/st.c +@@ -323,6 +323,7 @@ static void xzoomreset(const Arg *); + static void printsel(const Arg *); + static void printscreen(const Arg *) ; + static void toggleprinter(const Arg *); ++static void copyurl(const Arg *); + + /* Config.h for applying patches and the configuration. */ + #include "config.h" +@@ -3989,3 +3990,58 @@ run: + return 0; + } + ++/* 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 = startrow = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y-1 : term.row-1; ++ ++ /* find the start of the last url before selection */ ++ do { ++ for (i = 0; i < term.col; ++i) ++ linestr[i] = term.line[row][i].c[0]; ++ linestr[term.col] = '\0'; ++ if ((match = strstr(linestr, "http://")) ++ || (match = strstr(linestr, "https://"))) ++ break; ++ if (--row < 0) ++ row = term.row-1; ++ } while (row != startrow); ++ ++ if (match) { ++ /* must happen before trim */ ++ selclear(NULL); ++ 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); ++ selcopy(); ++ } ++ ++ free(linestr); ++} +-- +2.1.2 +