Optimize editor's character-in-line insertion

This commit is contained in:
John Lorentzson 2025-07-18 17:53:47 +02:00
parent ea4b8c3d99
commit c6b9e2980a

View file

@ -315,7 +315,9 @@ serial connection the editor normally runs under.")
(incf (fill-pointer (line-content line))) (incf (fill-pointer (line-content line)))
(replace (line-content line) to-shove (replace (line-content line) to-shove
:start1 (1+ column)) :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) (defmethod delete-character-in-line ((line line) column)
(unless (< column (fill-pointer (line-content line))) (unless (< column (fill-pointer (line-content line)))
@ -365,23 +367,27 @@ serial connection the editor normally runs under.")
(cursor-column (cursor *editor*)) start) (cursor-column (cursor *editor*)) start)
(update-buffer-cursor (current-buffer *editor*)))))) (update-buffer-cursor (current-buffer *editor*))))))
(defmethod redisplay-line ((line line)) (defmethod redisplay-line ((line line) &key (start 0))
;; TODO: save the cursor position ;; TODO: save the cursor position
(with-editor-accessors *editor* (:current-line current (with-editor-accessors *editor* (:current-line current
:current-buffer buffer) :current-buffer buffer)
(move-cursor (view-line-number (buffer-view buffer) line) 0) (cond
(write-char #\Return *eio*) ((= 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-byte #x1B *eio*)
(write-char #\[ *eio*) (write-char #\[ *eio*)
(write-char #\K *eio*) (write-char #\K *eio*)
(write-string (line-content line) *eio*) (write-string (line-content line) *eio* :start start)
(update-buffer-cursor buffer)) (update-buffer-cursor buffer)
(show-cursor))))
(force-output *eio*)) (force-output *eio*))
(defun save-cursor ())
(defun restore-cursor ())
(defclass buffer () (defclass buffer ()
@ -485,6 +491,9 @@ Additionally ensures correct line numbers on the way, as a bonus."
:when (eql line view-line) :when (eql line view-line)
:return number)) :return number))
(defmethod line-in-view ((line line) (view buffer-view))
(not (null (view-line-number view line))))
(defmethod redisplay-view ((view buffer-view)) (defmethod redisplay-view ((view buffer-view))
(clear-screen) (clear-screen)
(do-view-lines (line number) view (do-view-lines (line number) view
@ -547,8 +556,7 @@ Additionally ensures correct line numbers on the way, as a bonus."
(progn (progn
(insert-character-into-line line column char) (insert-character-into-line line column char)
(incf column)) (incf column))
(feep)) (feep))))
(redisplay-line line)))
(defun com-forward-delete () (defun com-forward-delete ()
;; TODO: Check for end of line ;; TODO: Check for end of line