Optimize editor's character-in-line insertion
This commit is contained in:
parent
ea4b8c3d99
commit
c6b9e2980a
1 changed files with 23 additions and 15 deletions
|
@ -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)))
|
||||||
(write-byte #x1B *eio*)
|
(let ((char-pos (1- (fill-pointer (line-content line)))))
|
||||||
(write-char #\[ *eio*)
|
(move-cursor (view-line-number (buffer-view buffer) line) char-pos)
|
||||||
(write-char #\K *eio*)
|
(write-char (aref (line-content line) char-pos) *eio*)
|
||||||
(write-string (line-content line) *eio*)
|
(update-buffer-cursor buffer)))
|
||||||
(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*))
|
(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
|
||||||
|
|
Loading…
Add table
Reference in a new issue