From c6b9e2980aedb8b629ea111c1fa5b2409787fdf4 Mon Sep 17 00:00:00 2001 From: John Lorentzson Date: Fri, 18 Jul 2025 17:53:47 +0200 Subject: [PATCH] Optimize editor's character-in-line insertion --- wip-duuqnd/editor/editor.lisp | 38 +++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/wip-duuqnd/editor/editor.lisp b/wip-duuqnd/editor/editor.lisp index 58b65b4..c5426de 100644 --- a/wip-duuqnd/editor/editor.lisp +++ b/wip-duuqnd/editor/editor.lisp @@ -315,7 +315,9 @@ serial connection the editor normally runs under.") (incf (fill-pointer (line-content line))) (replace (line-content line) to-shove :start1 (1+ column)) - (setf (char (line-content line) column) character))))) + (setf (char (line-content line) column) character)))) + (when (line-in-view line (current-view *editor*)) + (redisplay-line line :start column))) (defmethod delete-character-in-line ((line line) column) (unless (< column (fill-pointer (line-content line))) @@ -365,23 +367,27 @@ serial connection the editor normally runs under.") (cursor-column (cursor *editor*)) start) (update-buffer-cursor (current-buffer *editor*)))))) -(defmethod redisplay-line ((line line)) +(defmethod redisplay-line ((line line) &key (start 0)) ;; TODO: save the cursor position (with-editor-accessors *editor* (:current-line current :current-buffer buffer) - (move-cursor (view-line-number (buffer-view buffer) line) 0) - (write-char #\Return *eio*) - (write-byte #x1B *eio*) - (write-char #\[ *eio*) - (write-char #\K *eio*) - (write-string (line-content line) *eio*) - (update-buffer-cursor buffer)) + (cond + ((= start (1- (line-length line))) + (let ((char-pos (1- (fill-pointer (line-content line))))) + (move-cursor (view-line-number (buffer-view buffer) line) char-pos) + (write-char (aref (line-content line) char-pos) *eio*) + (update-buffer-cursor buffer))) + (t + (hide-cursor) + (move-cursor (view-line-number (buffer-view buffer) line) start) + (write-byte #x1B *eio*) + (write-char #\[ *eio*) + (write-char #\K *eio*) + (write-string (line-content line) *eio* :start start) + (update-buffer-cursor buffer) + (show-cursor)))) (force-output *eio*)) -(defun save-cursor ()) - -(defun restore-cursor ()) - (defclass buffer () @@ -485,6 +491,9 @@ Additionally ensures correct line numbers on the way, as a bonus." :when (eql line view-line) :return number)) +(defmethod line-in-view ((line line) (view buffer-view)) + (not (null (view-line-number view line)))) + (defmethod redisplay-view ((view buffer-view)) (clear-screen) (do-view-lines (line number) view @@ -547,8 +556,7 @@ Additionally ensures correct line numbers on the way, as a bonus." (progn (insert-character-into-line line column char) (incf column)) - (feep)) - (redisplay-line line))) + (feep)))) (defun com-forward-delete () ;; TODO: Check for end of line