Browse Source

add key bindings for moving to the word start or end

Mod1+b/^Left and Mod1+f/^Right
master
Quentin Rameau 7 years ago committed by Hiltjo Posthuma
parent
commit
e2a280541e
  1. 12
      dmenu.1
  2. 34
      dmenu.c

12
dmenu.1

@ -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

@ -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;

Loading…
Cancel
Save