diff options
| -rw-r--r-- | main.c | 40 |
1 files changed, 36 insertions, 4 deletions
@@ -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; |
