add key bindings for moving to the word start or end - dmenu - dynamic menu
 (HTM) git clone git://git.suckless.org/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit e2a280541eab62717d6a9a72d047c832e5cb1edc
 (DIR) parent 889512811d7ae410eb4ab60be3568278b3e23f2e
 (HTM) 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:
         M dmenu.1                             |      12 ++++++++++++
         M dmenu.c                             |      34 +++++++++++++++++++++++++++++++
       
       2 files changed, 46 insertions(+), 0 deletions(-)
       ---
 (DIR) 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
 (DIR) 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;