From f51617f7740e79d82dfc0dd061324e0a6d0ac46b Mon Sep 17 00:00:00 2001 From: Skylar Hill Date: Wed, 8 Nov 2023 09:52:45 -0600 Subject: [PATCH] Clamp cursor to within the actual text --- sloth/editor.scm | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/sloth/editor.scm b/sloth/editor.scm index e6444de..f18b1d9 100644 --- a/sloth/editor.scm +++ b/sloth/editor.scm @@ -114,15 +114,27 @@ (list-set! buf y (string-delete-kth (list-ref buf y) x))) +(define (clamp n lowest highest) + (if (< n lowest) + lowest + (if (> n highest) + highest + n))) + (define* (move-cursor state #:key x y relative?) - (if x (set! (curx state) - (if relative? - (+ x (curx state)) - x))) - (if y (set! (cury state) - (if relative? - (+ y (cury state)) - y))) + (define newx (if x + (if relative? + (+ x (curx state)) + x) + (curx state))) + (define newy (if y + (if relative? + (+ y (cury state)) + y) + (cury state))) + (set! (cury state) (clamp newy 0 (1- (length (buffer state))))) + (set! (curx state) (clamp newx 0 (string-length + (list-ref (buffer state) (cury state))))) (define scroll (lines-scrolled state)) (define screen-height (height (get-frontend state))) (define relative-y (- (cury state) scroll))