|
|
|
@ -287,6 +287,22 @@ nextrune(int inc) |
|
|
|
|
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 |
|
|
|
|
keypress(XKeyEvent *ev) |
|
|
|
|
{ |
|
|
|
@ -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; |
|
|
|
|