summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c40
1 files changed, 36 insertions, 4 deletions
diff --git a/main.c b/main.c
index 27c514e..31e10ce 100644
--- a/main.c
+++ b/main.c
@@ -72,6 +72,26 @@ delete_word(DynStr *s, int i)
}
int
+prev_word(DynStr *s, int i)
+{
+ while (i > 0 && is_space(s->v[i-1]))
+ i--;
+ while (i > 0 && !is_space(s->v[i-1]))
+ i--;
+ return i;
+}
+
+int
+next_word(DynStr *s, int i)
+{
+ while (i < s->n && is_space(s->v[i]))
+ i++;
+ while (i < s->n && !is_space(s->v[i]))
+ i++;
+ return i;
+}
+
+int
read_all(FILE *f, DynStr *out, Arena *a)
{
char buf[256];
@@ -143,16 +163,28 @@ main(int argc, char **argv)
if (seli < 0) seli = 0;
goto draw;
case UIK_LEFT:
- if (inpi > 0) inpi--;
+ if (ev.key.mod & UIM_CTRL)
+ inpi = prev_word(&input, inpi);
+ else if (inpi > 0)
+ inpi--;
goto draw;
case UIK_RIGHT:
- if (inpi < input.n) inpi++;
+ if (ev.key.mod & UIM_CTRL)
+ inpi = next_word(&input, inpi);
+ else if (inpi < input.n)
+ inpi++;
goto draw;
case UIK_HOME:
- inpi = 0;
+ if (ev.key.mod & UIM_CTRL)
+ seli = 0;
+ else
+ inpi = 0;
goto draw;
case UIK_END:
- inpi = input.n;
+ if (ev.key.mod & UIM_CTRL)
+ seli = opt.n - 1;
+ else
+ inpi = input.n;
goto draw;
default:
if (!ev.key.strn) break;