st-copyurl-20190202-0.8.1.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
st-copyurl-20190202-0.8.1.diff (3010B) | |
--- | |
1 From be408247f1c1ff8ccf7ab128b126f54d19bd4392 Mon Sep 17 00:00:00 2001 | |
2 From: Michael Buch <[email protected]> | |
3 Date: Sat, 2 Feb 2019 14:20:52 +0000 | |
4 Subject: [PATCH] Port the copyurl patch to the 0.8.1 st release. Mainly … | |
5 usage of depracted selcopy | |
6 | |
7 --- | |
8 config.def.h | 1 + | |
9 st.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
10 st.h | 1 + | |
11 3 files changed, 64 insertions(+) | |
12 | |
13 diff --git a/config.def.h b/config.def.h | |
14 index 82b1b09..cbe923e 100644 | |
15 --- a/config.def.h | |
16 +++ b/config.def.h | |
17 @@ -178,6 +178,7 @@ static Shortcut shortcuts[] = { | |
18 { TERMMOD, XK_Y, selpaste, {.i = … | |
19 { TERMMOD, XK_Num_Lock, numlock, {.i = … | |
20 { TERMMOD, XK_I, iso14755, {.i = … | |
21 + { MODKEY, XK_l, copyurl, {.i = … | |
22 }; | |
23 | |
24 /* | |
25 diff --git a/st.c b/st.c | |
26 index 46c954b..476eb31 100644 | |
27 --- a/st.c | |
28 +++ b/st.c | |
29 @@ -2616,3 +2616,65 @@ redraw(void) | |
30 tfulldirt(); | |
31 draw(); | |
32 } | |
33 + | |
34 +/* select and copy the previous url on screen (do nothing if there's no… | |
35 + * known bug: doesn't handle urls that span multiple lines (wontfix) | |
36 + * known bug: only finds first url on line (mightfix) | |
37 + */ | |
38 +void | |
39 +copyurl(const Arg *arg) { | |
40 + /* () and [] can appear in urls, but excluding them here will r… | |
41 + * positives when figuring out where a given url ends. | |
42 + */ | |
43 + static char URLCHARS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | |
44 + "abcdefghijklmnopqrstuvwxyz" | |
45 + "0123456789-._~:/?#@!$&'*+,;=%"; | |
46 + | |
47 + int i, row, startrow; | |
48 + char *linestr = calloc(sizeof(char), term.col+1); /* assume asc… | |
49 + char *c, *match = NULL; | |
50 + | |
51 + row = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y-1 : term.bot; | |
52 + LIMIT(row, term.top, term.bot); | |
53 + startrow = row; | |
54 + | |
55 + /* find the start of the last url before selection */ | |
56 + do { | |
57 + for (i = 0; i < term.col; ++i) { | |
58 + if (term.line[row][i].u > 127) /* assume ascii … | |
59 + continue; | |
60 + linestr[i] = term.line[row][i].u; | |
61 + } | |
62 + linestr[term.col] = '\0'; | |
63 + if ((match = strstr(linestr, "http://")) | |
64 + || (match = strstr(linestr, "https://")… | |
65 + break; | |
66 + if (--row < term.top) | |
67 + row = term.bot; | |
68 + } while (row != startrow); | |
69 + | |
70 + if (match) { | |
71 + /* must happen before trim */ | |
72 + selclear(); | |
73 + sel.ob.x = strlen(linestr) - strlen(match); | |
74 + | |
75 + /* trim the rest of the line from the url match */ | |
76 + for (c = match; *c != '\0'; ++c) | |
77 + if (!strchr(URLCHARS, *c)) { | |
78 + *c = '\0'; | |
79 + break; | |
80 + } | |
81 + | |
82 + /* select and copy */ | |
83 + sel.mode = 1; | |
84 + sel.type = SEL_REGULAR; | |
85 + sel.oe.x = sel.ob.x + strlen(match)-1; | |
86 + sel.ob.y = sel.oe.y = row; | |
87 + selnormalize(); | |
88 + tsetdirt(sel.nb.y, sel.ne.y); | |
89 + xsetsel(getsel()); | |
90 + xclipcopy(); | |
91 + } | |
92 + | |
93 + free(linestr); | |
94 +} | |
95 diff --git a/st.h b/st.h | |
96 index dac64d8..5a58f8f 100644 | |
97 --- a/st.h | |
98 +++ b/st.h | |
99 @@ -85,6 +85,7 @@ void printscreen(const Arg *); | |
100 void printsel(const Arg *); | |
101 void sendbreak(const Arg *); | |
102 void toggleprinter(const Arg *); | |
103 +void copyurl(const Arg *); | |
104 | |
105 int tattrset(int); | |
106 void tnew(int, int); | |
107 -- | |
108 2.20.1 | |
109 |