summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorkatalx2026-01-29 03:36:38 -0500
committerkatalx2026-01-29 03:36:38 -0500
commit2b980b3141f5672e37db651232bf59b589e4bb65 (patch)
tree336c0d700235dc3e1ba47f4955610f1546242339 /main.c
parent5b6383876581980c51515a3216c367b084dfc427 (diff)
better line editing
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;