[hackers] [dmenu] add key bindings for moving to the word start or end || Quentin Rameau

From: <git_AT_suckless.org>
Date: Tue, 13 Mar 2018 20:11:52 +0100 (CET)

commit e2a280541eab62717d6a9a72d047c832e5cb1edc
Author: Quentin Rameau <quinq_AT_fifth.space>
AuthorDate: Tue Mar 13 17:15:09 2018 +0100
Commit: Hiltjo Posthuma <hiltjo_AT_codemadness.org>
CommitDate: Tue Mar 13 20:10:46 2018 +0100

    add key bindings for moving to the word start or end
    
    Mod1+b/^Left and Mod1+f/^Right

diff --git a/dmenu.1 b/dmenu.1
index 9eab758..fbb3f76 100644
--- a/dmenu.1
+++ b/dmenu.1
_AT_@ -100,6 +100,12 @@ Confirm input. Prints the input text to stdout and exits, returning success.
 .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
_AT_@ -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
index a246111..5e9c367 100644
--- a/dmenu.c
+++ b/dmenu.c
_AT_@ -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];
_AT_@ -334,6 +350,14 @@ keypress(XKeyEvent *ev)
                         XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
                                           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;
_AT_@ -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;
_AT_@ -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;
Received on Tue Mar 13 2018 - 20:11:52 CET

This archive was generated by hypermail 2.3.0 : Tue Mar 13 2018 - 20:12:25 CET