diff --git a/wip-duuqnd/editor/editor.lisp b/wip-duuqnd/editor/editor.lisp index 60f6d01..0f426ff 100644 --- a/wip-duuqnd/editor/editor.lisp +++ b/wip-duuqnd/editor/editor.lisp @@ -683,6 +683,52 @@ Additionally ensures correct line numbers on the way, as a bonus." (com-end-of-line)))) (update-buffer-cursor buffer))) +(defun com-forward-word () + (with-editor-accessors *editor* (:current-buffer buffer + :current-line line + :current-column column) + (loop :for char := (char (line-content line) column) + :do (incf column) + :when (>= column (line-length line)) + :do (if (null (next-line line)) + (progn + (feep) + (return)) + (setf column 0 + line (next-line line))) + :until (or (zerop column) + (null line) + (char= char #\Space))) + (update-buffer-cursor buffer))) + +(defun com-backward-word () + (with-editor-accessors *editor* (:current-buffer buffer + :current-line line + :current-column column) + (when (zerop column) + (if (null (prev-line line)) + (progn + (feep) + (return-from com-backward-word)) + (setf line (prev-line line) + column (line-length line)))) + (loop :with donep := nil + :do (decf column) + :when (minusp column) + :do (if (null (prev-line line)) + (progn + (feep) + (setf column 0) + (return)) + (setf column (1- (line-length line)) + line (prev-line line) + donep t)) + :until (or donep + (zerop column) + (null line) + (char= (char (line-content line) (1- column)) #\Space))) + (update-buffer-cursor buffer))) + (defun com-new-buffer () (setf (current-buffer *editor*) (make-instance 'buffer)) @@ -768,7 +814,9 @@ Additionally ensures correct line numbers on the way, as a bonus." ((:c . #\d) com-forward-delete) ((:c . #\j) com-newline) ((:c . #\n) com-new-buffer) - ((:c . #\l) com-refresh-screen))) + ((:c . #\l) com-refresh-screen) + ((:m . #\f) com-forward-word) + ((:m . #\b) com-backward-word))) (defun key-command-dispatch (key) (when (numberp key)