diff options
| author | katalx | 2026-01-29 03:36:38 -0500 |
|---|---|---|
| committer | katalx | 2026-01-29 03:36:38 -0500 |
| commit | 2b980b3141f5672e37db651232bf59b589e4bb65 (patch) | |
| tree | 336c0d700235dc3e1ba47f4955610f1546242339 /main.c | |
| parent | 5b6383876581980c51515a3216c367b084dfc427 (diff) | |
better line editing
Diffstat (limited to 'main.c')
| -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; |
