Add copy last url on Alt+L
This commit is contained in:
parent
b7726da6ef
commit
63d3bdd5ae
|
@ -219,6 +219,7 @@ static Shortcut shortcuts[] = {
|
||||||
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
|
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
|
||||||
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1} },
|
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1} },
|
||||||
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} },
|
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} },
|
||||||
|
{ MODKEY, XK_l, copyurl, {.i = 0} },
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
3
config.h
3
config.h
|
@ -98,7 +98,7 @@ char *termname = "st-256color";
|
||||||
*
|
*
|
||||||
* stty tabs
|
* stty tabs
|
||||||
*/
|
*/
|
||||||
unsigned int tabspaces = 8;
|
unsigned int tabspaces = 4;
|
||||||
|
|
||||||
/* Terminal colors (16 first used in escape sequence) */
|
/* Terminal colors (16 first used in escape sequence) */
|
||||||
static const char *colorname[] = {
|
static const char *colorname[] = {
|
||||||
|
@ -219,6 +219,7 @@ static Shortcut shortcuts[] = {
|
||||||
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
|
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
|
||||||
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1} },
|
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1} },
|
||||||
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} },
|
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} },
|
||||||
|
{ MODKEY, XK_l, copyurl, {.i = 0} },
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
85
st.c
85
st.c
|
@ -166,6 +166,11 @@ typedef struct {
|
||||||
int narg; /* nb of args */
|
int narg; /* nb of args */
|
||||||
} STREscape;
|
} STREscape;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int state;
|
||||||
|
size_t length;
|
||||||
|
} URLdfa;
|
||||||
|
|
||||||
static void execsh(char *, char **);
|
static void execsh(char *, char **);
|
||||||
static void stty(char **);
|
static void stty(char **);
|
||||||
static void sigchld(int);
|
static void sigchld(int);
|
||||||
|
@ -215,6 +220,7 @@ static void tdefutf8(char);
|
||||||
static int32_t tdefcolor(const int *, int *, int);
|
static int32_t tdefcolor(const int *, int *, int);
|
||||||
static void tdeftran(char);
|
static void tdeftran(char);
|
||||||
static void tstrsequence(uchar);
|
static void tstrsequence(uchar);
|
||||||
|
static int daddch(URLdfa *, char);
|
||||||
|
|
||||||
static void drawregion(int, int, int, int);
|
static void drawregion(int, int, int, int);
|
||||||
static void clearline(Line, Glyph, int, int);
|
static void clearline(Line, Glyph, int, int);
|
||||||
|
@ -2783,3 +2789,82 @@ redraw(void)
|
||||||
tfulldirt();
|
tfulldirt();
|
||||||
draw();
|
draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
daddch(URLdfa *dfa, char c)
|
||||||
|
{
|
||||||
|
/* () and [] can appear in urls, but excluding them here will reduce false
|
||||||
|
* positives when figuring out where a given url ends.
|
||||||
|
*/
|
||||||
|
static const char URLCHARS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
"0123456789-._~:/?#@!$&'*+,;=%";
|
||||||
|
static const char RPFX[] = "//:sptth";
|
||||||
|
|
||||||
|
if(!strchr(URLCHARS, c)) {
|
||||||
|
dfa->length = 0;
|
||||||
|
dfa->state = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dfa->length++;
|
||||||
|
|
||||||
|
if(dfa->state == 2 && c == '/') {
|
||||||
|
dfa->state = 0;
|
||||||
|
}
|
||||||
|
else if(dfa->state == 3 && c == 'p') {
|
||||||
|
dfa->state++;
|
||||||
|
}
|
||||||
|
else if(c != RPFX[dfa->state]) {
|
||||||
|
dfa->state = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dfa->state++ == 7) {
|
||||||
|
dfa->state = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
copyurl(const Arg *arg) {
|
||||||
|
int row = 0,
|
||||||
|
col = 0,
|
||||||
|
colend = 0,
|
||||||
|
passes = 0;
|
||||||
|
|
||||||
|
const char *c = NULL,
|
||||||
|
*match = NULL;
|
||||||
|
URLdfa dfa = { 0 };
|
||||||
|
|
||||||
|
row = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y : term.bot;
|
||||||
|
LIMIT(row, term.top, term.bot);
|
||||||
|
|
||||||
|
colend = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.x : term.col;
|
||||||
|
LIMIT(colend, 0, term.col);
|
||||||
|
|
||||||
|
for(passes = 0; passes < term.row; passes++) {
|
||||||
|
for(col = colend; col--;)
|
||||||
|
if(daddch(&dfa, term.screen[0].buffer[row][col].u < 128 ? term.screen[0].buffer[row][col].u : ' '))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(col >= 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(--row < 0)
|
||||||
|
row = term.row - 1;
|
||||||
|
|
||||||
|
colend = term.col;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(passes < term.row) {
|
||||||
|
selstart(col, row, 0);
|
||||||
|
selextend((col + dfa.length - 1) % term.col, row + (col + dfa.length - 1) / term.col, SEL_REGULAR, 0);
|
||||||
|
selextend((col + dfa.length - 1) % term.col, row + (col + dfa.length - 1) / term.col, SEL_REGULAR, 1);
|
||||||
|
xsetsel(getsel());
|
||||||
|
xclipcopy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
1
st.h
1
st.h
|
@ -86,6 +86,7 @@ void printscreen(const Arg *);
|
||||||
void printsel(const Arg *);
|
void printsel(const Arg *);
|
||||||
void sendbreak(const Arg *);
|
void sendbreak(const Arg *);
|
||||||
void toggleprinter(const Arg *);
|
void toggleprinter(const Arg *);
|
||||||
|
void copyurl(const Arg *);
|
||||||
|
|
||||||
int tattrset(int);
|
int tattrset(int);
|
||||||
void tnew(int, int);
|
void tnew(int, int);
|
||||||
|
|
Loading…
Reference in New Issue