add key bindings for moving to the word start or end - dmenu - dynamic menu | |
git clone git://git.suckless.org/dmenu | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e2a280541eab62717d6a9a72d047c832e5cb1edc | |
parent 889512811d7ae410eb4ab60be3568278b3e23f2e | |
Author: Quentin Rameau <[email protected]> | |
Date: Tue, 13 Mar 2018 17:15:09 +0100 | |
add key bindings for moving to the word start or end | |
Mod1+b/^Left and Mod1+f/^Right | |
Diffstat: | |
M dmenu.1 | 12 ++++++++++++ | |
M dmenu.c | 34 +++++++++++++++++++++++++++++… | |
2 files changed, 46 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/dmenu.1 b/dmenu.1 | |
@@ -100,6 +100,12 @@ Confirm input. Prints the input text to stdout and exits,… | |
.B Escape | |
Exit without selecting an item, returning failure. | |
.TP | |
+.B Ctrl-Left | |
+Move cursor to the start of the current word | |
+.TP | |
+.B Ctrl-Right | |
+Move cursor to the end of the current word | |
+.TP | |
C\-a | |
Home | |
.TP | |
@@ -160,6 +166,12 @@ Paste from primary X selection | |
C\-Y | |
Paste from X clipboard | |
.TP | |
+M\-b | |
+Move cursor to the start of the current word | |
+.TP | |
+M\-f | |
+Move cursor to the end of the current word | |
+.TP | |
M\-g | |
Home | |
.TP | |
diff --git a/dmenu.c b/dmenu.c | |
@@ -288,6 +288,22 @@ nextrune(int inc) | |
} | |
static void | |
+movewordedge(int dir) | |
+{ | |
+ if (dir < 0) { /* move cursor to the start of the word*/ | |
+ while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]… | |
+ cursor = nextrune(-1); | |
+ while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)… | |
+ cursor = nextrune(-1); | |
+ } else { /* move cursor to the end of the word */ | |
+ while (text[cursor] && strchr(worddelimiters, text[cursor])) | |
+ cursor = nextrune(+1); | |
+ while (text[cursor] && !strchr(worddelimiters, text[cursor])) | |
+ cursor = nextrune(+1); | |
+ } | |
+} | |
+ | |
+static void | |
keypress(XKeyEvent *ev) | |
{ | |
char buf[32]; | |
@@ -334,6 +350,14 @@ keypress(XKeyEvent *ev) | |
XConvertSelection(dpy, (ev->state & ShiftMask) ? clip … | |
utf8, utf8, win, CurrentTime); | |
return; | |
+ case XK_Left: | |
+ movewordedge(-1); | |
+ ksym = NoSymbol; | |
+ break; | |
+ case XK_Right: | |
+ movewordedge(+1); | |
+ ksym = NoSymbol; | |
+ break; | |
case XK_Return: | |
case XK_KP_Enter: | |
break; | |
@@ -345,6 +369,14 @@ keypress(XKeyEvent *ev) | |
} | |
else if (ev->state & Mod1Mask) | |
switch(ksym) { | |
+ case XK_b: | |
+ movewordedge(-1); | |
+ ksym = NoSymbol; | |
+ break; | |
+ case XK_f: | |
+ movewordedge(+1); | |
+ ksym = NoSymbol; | |
+ break; | |
case XK_g: ksym = XK_Home; break; | |
case XK_G: ksym = XK_End; break; | |
case XK_h: ksym = XK_Up; break; | |
@@ -359,6 +391,8 @@ keypress(XKeyEvent *ev) | |
if (!iscntrl(*buf)) | |
insert(buf, len); | |
break; | |
+ case NoSymbol: | |
+ break; | |
case XK_Delete: | |
if (text[cursor] == '\0') | |
return; |