add key bindings for moving to the word start or end
Mod1+b/^Left and Mod1+f/^Right
This commit is contained in:
parent
889512811d
commit
e2a280541e
2 changed files with 46 additions and 0 deletions
12
dmenu.1
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
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…
Reference in a new issue