dmenu

my fork of dmenu
Index Commits Files Refs README LICENSE
commit e2a280541eab62717d6a9a72d047c832e5cb1edc
parent 889512811d7ae410eb4ab60be3568278b3e23f2e
Author: Quentin Rameau <quinq@fifth.space>
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:
Mdmenu.1 | 12++++++++++++
Mdmenu.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, 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
@@ -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 : 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;
@@ -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;