st-copyurl-20190202-0.8.1.diff (3010B)
1 From be408247f1c1ff8ccf7ab128b126f54d19bd4392 Mon Sep 17 00:00:00 2001 2 From: Michael Buch <michaelbuch12@gmail.com> 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 fix 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 = 0} }, 19 { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, 20 { TERMMOD, XK_I, iso14755, {.i = 0} }, 21 + { MODKEY, XK_l, copyurl, {.i = 0} }, 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 url). 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 reduce false 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 ascii */ 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