add key bindings for moving to the word start or end

Mod1+b/^Left and Mod1+f/^Right
This commit is contained in:
Quentin Rameau 2018-03-13 17:15:09 +01:00 committed by Hiltjo Posthuma
parent 889512811d
commit e2a280541e
2 changed files with 46 additions and 0 deletions

12
dmenu.1
View file

@ -100,6 +100,12 @@ Confirm input. Prints the input text to stdout and exits, returning success.
.B Escape .B Escape
Exit without selecting an item, returning failure. Exit without selecting an item, returning failure.
.TP .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 C\-a
Home Home
.TP .TP
@ -160,6 +166,12 @@ Paste from primary X selection
C\-Y C\-Y
Paste from X clipboard Paste from X clipboard
.TP .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 M\-g
Home Home
.TP .TP

34
dmenu.c
View file

@ -287,6 +287,22 @@ nextrune(int inc)
return n; return n;
} }
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 static void
keypress(XKeyEvent *ev) keypress(XKeyEvent *ev)
{ {
@ -334,6 +350,14 @@ keypress(XKeyEvent *ev)
XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
utf8, utf8, win, CurrentTime); utf8, utf8, win, CurrentTime);
return; return;
case XK_Left:
movewordedge(-1);
ksym = NoSymbol;
break;
case XK_Right:
movewordedge(+1);
ksym = NoSymbol;
break;
case XK_Return: case XK_Return:
case XK_KP_Enter: case XK_KP_Enter:
break; break;
@ -345,6 +369,14 @@ keypress(XKeyEvent *ev)
} }
else if (ev->state & Mod1Mask) else if (ev->state & Mod1Mask)
switch(ksym) { 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_Home; break;
case XK_G: ksym = XK_End; break; case XK_G: ksym = XK_End; break;
case XK_h: ksym = XK_Up; break; case XK_h: ksym = XK_Up; break;
@ -359,6 +391,8 @@ keypress(XKeyEvent *ev)
if (!iscntrl(*buf)) if (!iscntrl(*buf))
insert(buf, len); insert(buf, len);
break; break;
case NoSymbol:
break;
case XK_Delete: case XK_Delete:
if (text[cursor] == '\0') if (text[cursor] == '\0')
return; return;