From 799ba067bc06707bec8fd64fe2280778e83fb689 Mon Sep 17 00:00:00 2001 From: sasanidas Date: Wed, 6 Dec 2023 19:24:40 +0100 Subject: [PATCH 1/9] Add region comment support for vi-mode - Change `set-region-point` to a generic to facilitate extension - Add help function `current-global-mode-keyword-name` on lem-core - Add implementations of `set-region-point` for emacs and vi-mode global mode --- extensions/vi-mode/visual.lisp | 7 +++++++ src/ext/language-mode.lisp | 19 +++++++++++++------ src/mode.lisp | 4 ++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/extensions/vi-mode/visual.lisp b/extensions/vi-mode/visual.lisp index 24e64aac5..b61df2f4e 100644 --- a/extensions/vi-mode/visual.lisp +++ b/extensions/vi-mode/visual.lisp @@ -248,3 +248,10 @@ (move-to-column *start-point* end-col) (move-to-column (current-point) start-col)) (vi-visual-swap-points))) + +(defmethod lem/language-mode:set-region-point ((start point) (end point) &key (global-mode (eql :|vi|))) + (declare (ignore global-mode)) + (when (visual-p) + (let ((v-range (visual-range))) + (move-point start (car v-range)) + (move-point end (cadr v-range))))) diff --git a/src/ext/language-mode.lisp b/src/ext/language-mode.lisp index e6fdefacd..237bb2f17 100644 --- a/src/ext/language-mode.lisp +++ b/src/ext/language-mode.lisp @@ -38,7 +38,8 @@ :display-xref-locations :display-xref-references :find-root-directory - :buffer-root-directory) + :buffer-root-directory + :set-region-point) #+sbcl (:lock t)) (in-package :lem/language-mode) @@ -153,8 +154,11 @@ (uncomment-region) (comment-region))) -(defun set-region-point (start end) - (cond +(defgeneric set-region-point (start end &key global-mode)) + +(defmethod set-region-point ((start point) (end point) &key (global-mode (eql :|emacs|))) + (declare (ignore global-mode)) + (cond ((buffer-mark-p (current-buffer)) (move-point start (cursor-region-beginning (current-point))) (move-point end (cursor-region-end (current-point)))) @@ -166,7 +170,8 @@ (alexandria:when-let ((line-comment (variable-value 'line-comment :buffer))) (with-point ((start (current-point)) (end (current-point))) - (set-region-point start end) + (set-region-point start end + :global-mode (lem-core::current-global-mode-keyword-name)) (loop (skip-whitespace-forward start) (when (point>= start end) @@ -183,7 +188,8 @@ (when line-comment (with-point ((start (current-point) :right-inserting) (end (current-point) :left-inserting)) - (set-region-point start end) + (set-region-point start end + :global-mode (lem-core::current-global-mode-keyword-name)) (skip-whitespace-forward start) (when (point>= start end) (insert-string (current-point) line-comment) @@ -210,7 +216,8 @@ (when line-comment (with-point ((start (current-point) :right-inserting) (end (current-point) :right-inserting)) - (set-region-point start end) + (set-region-point start end + :global-mode (lem-core::current-global-mode-keyword-name)) (let ((p start)) (loop (parse-partial-sexp p end nil t) diff --git a/src/mode.lisp b/src/mode.lisp index 4bade0e57..02d3863f0 100644 --- a/src/mode.lisp +++ b/src/mode.lisp @@ -104,6 +104,10 @@ (defun current-global-mode () *current-global-mode*) +(defun current-global-mode-keyword-name () + (alexandria:make-keyword + (mode-name (current-global-mode)))) + (defun all-active-modes (buffer) (mapcar #'ensure-mode-object (append (buffer-minor-modes buffer) From 4908b542256679d7d498ff56d2ac4a07df0d4b14 Mon Sep 17 00:00:00 2001 From: sasanidas Date: Wed, 6 Dec 2023 21:01:29 +0100 Subject: [PATCH 2/9] Remove key from generic --- extensions/vi-mode/visual.lisp | 9 ++++++++- src/ext/language-mode.lisp | 13 +++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/extensions/vi-mode/visual.lisp b/extensions/vi-mode/visual.lisp index b61df2f4e..aca40823c 100644 --- a/extensions/vi-mode/visual.lisp +++ b/extensions/vi-mode/visual.lisp @@ -249,9 +249,16 @@ (move-to-column (current-point) start-col)) (vi-visual-swap-points))) -(defmethod lem/language-mode:set-region-point ((start point) (end point) &key (global-mode (eql :|vi|))) +(defmethod lem/language-mode:set-region-point ((start point) (end point) (global-mode (eql :|vi|))) (declare (ignore global-mode)) (when (visual-p) (let ((v-range (visual-range))) (move-point start (car v-range)) (move-point end (cadr v-range))))) + +(defmethod lem-core::operate-region ((global-mode (eql :|vi|))) + (if (lem-vi-mode/visual:visual-p) + (let ((v-range (lem-vi-mode/visual:visual-range))) + `(list + ,(car v-range) + ,(cadr v-range))))) diff --git a/src/ext/language-mode.lisp b/src/ext/language-mode.lisp index 237bb2f17..cab98253a 100644 --- a/src/ext/language-mode.lisp +++ b/src/ext/language-mode.lisp @@ -154,9 +154,9 @@ (uncomment-region) (comment-region))) -(defgeneric set-region-point (start end &key global-mode)) +(defgeneric set-region-point (start end global-mode)) -(defmethod set-region-point ((start point) (end point) &key (global-mode (eql :|emacs|))) +(defmethod set-region-point ((start point) (end point) (global-mode (eql :|emacs|))) (declare (ignore global-mode)) (cond ((buffer-mark-p (current-buffer)) @@ -170,8 +170,7 @@ (alexandria:when-let ((line-comment (variable-value 'line-comment :buffer))) (with-point ((start (current-point)) (end (current-point))) - (set-region-point start end - :global-mode (lem-core::current-global-mode-keyword-name)) + (set-region-point start end (lem-core::current-global-mode-keyword-name)) (loop (skip-whitespace-forward start) (when (point>= start end) @@ -188,8 +187,7 @@ (when line-comment (with-point ((start (current-point) :right-inserting) (end (current-point) :left-inserting)) - (set-region-point start end - :global-mode (lem-core::current-global-mode-keyword-name)) + (set-region-point start end (lem-core::current-global-mode-keyword-name)) (skip-whitespace-forward start) (when (point>= start end) (insert-string (current-point) line-comment) @@ -216,8 +214,7 @@ (when line-comment (with-point ((start (current-point) :right-inserting) (end (current-point) :right-inserting)) - (set-region-point start end - :global-mode (lem-core::current-global-mode-keyword-name)) + (set-region-point start end (lem-core::current-global-mode-keyword-name)) (let ((p start)) (loop (parse-partial-sexp p end nil t) From 0373861fa9ea8fc3e9f7f4b7893b421921783b01 Mon Sep 17 00:00:00 2001 From: sasanidas Date: Wed, 6 Dec 2023 21:06:17 +0100 Subject: [PATCH 3/9] Fix typo --- extensions/vi-mode/visual.lisp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/extensions/vi-mode/visual.lisp b/extensions/vi-mode/visual.lisp index aca40823c..42e2bf48b 100644 --- a/extensions/vi-mode/visual.lisp +++ b/extensions/vi-mode/visual.lisp @@ -255,10 +255,3 @@ (let ((v-range (visual-range))) (move-point start (car v-range)) (move-point end (cadr v-range))))) - -(defmethod lem-core::operate-region ((global-mode (eql :|vi|))) - (if (lem-vi-mode/visual:visual-p) - (let ((v-range (lem-vi-mode/visual:visual-range))) - `(list - ,(car v-range) - ,(cadr v-range))))) From 3adc0194d117c19b07ec95c04a1381c603c0bad8 Mon Sep 17 00:00:00 2001 From: sasanidas Date: Wed, 6 Dec 2023 22:07:15 +0100 Subject: [PATCH 4/9] Add vi-mode support for region commands like --- extensions/vi-mode/visual.lisp | 18 ++++++++++++++++++ lem.asd | 2 +- src/base/basic.lisp | 10 ++++++++++ src/base/package.lisp | 2 ++ src/defcommand.lisp | 14 ++++++++++---- 5 files changed, 41 insertions(+), 5 deletions(-) diff --git a/extensions/vi-mode/visual.lisp b/extensions/vi-mode/visual.lisp index 42e2bf48b..4fc682b8a 100644 --- a/extensions/vi-mode/visual.lisp +++ b/extensions/vi-mode/visual.lisp @@ -255,3 +255,21 @@ (let ((v-range (visual-range))) (move-point start (car v-range)) (move-point end (cadr v-range))))) + + +(eval-when (:compile-toplevel :load-toplevel) + (sb-ext:unlock-package :lem-base) + + (defmethod lem-base::global-mode-region-beginning ((global-mode (eql :|vi|)) &optional (buffer (current-buffer))) + (declare (ignore buffer)) + (if (visual-p) + (car (visual-range)) + (editor-error "Not in visual mode"))) + + (defmethod lem-base::global-mode-region-end ((global-mode (eql :|vi|)) &optional (buffer (current-buffer))) + (declare (ignore buffer)) + (if (visual-p) + (cadr (visual-range)) + (editor-error "Not in visual mode"))) + + (sb-ext:lock-package :lem-base)) diff --git a/lem.asd b/lem.asd index c8215404b..a435d719c 100644 --- a/lem.asd +++ b/lem.asd @@ -63,8 +63,8 @@ (:file "popup") (:file "modeline") (:file "command") - (:file "defcommand") (:file "mode") + (:file "defcommand") (:file "keymap") (:file "event-queue") (:file "interp") diff --git a/src/base/basic.lisp b/src/base/basic.lisp index 81dd09336..06139b518 100644 --- a/src/base/basic.lisp +++ b/src/base/basic.lisp @@ -257,11 +257,21 @@ The thrid argument PROP is a property to remove." (count-characters (buffer-start-point buffer) (buffer-end-point buffer)))) +(defgeneric global-mode-region-beginning (global-mode &optional buffer)) + +(defmethod global-mode-region-beginning ((global-mode (eql :|emacs|)) &optional (buffer (current-buffer))) + (region-beginning buffer)) + (defun region-beginning (&optional (buffer (current-buffer))) "Return the integer value of point or mark, whichever is smaller." (point-min (buffer-point buffer) (buffer-mark buffer))) +(defgeneric global-mode-region-end (global-mode &optional buffer)) + +(defmethod global-mode-region-end ((global-mode (eql :|emacs|)) &optional (buffer (current-buffer))) + (region-end buffer)) + (defun region-end (&optional (buffer (current-buffer))) "Return the integer value of point or mark, whichever is larger." (point-max (buffer-point buffer) diff --git a/src/base/package.lisp b/src/base/package.lisp index 8cdf1e74e..e20ab6f2f 100644 --- a/src/base/package.lisp +++ b/src/base/package.lisp @@ -189,7 +189,9 @@ :insert-string :delete-character :erase-buffer + :global-mode-region-beginning :region-beginning + :global-mode-region-end :region-end :map-region :points-to-string diff --git a/src/defcommand.lisp b/src/defcommand.lisp index cd53efc53..46be71714 100644 --- a/src/defcommand.lisp +++ b/src/defcommand.lisp @@ -1,5 +1,10 @@ (in-package :lem-core) + +(defun maybe-marked () + (when (eql (current-global-mode-keyword-name) :|emacs|) + (check-marked))) + (eval-when (:compile-toplevel :load-toplevel) (defun parse-arg-descriptors (arg-descriptors universal-argument) "Parse arg descriptors given to define-command. @@ -50,10 +55,11 @@ :default nil :existing nil))) (#\r - (push '(check-marked) pre-forms) - '(list - (region-beginning) - (region-end))))) + (push '(maybe-marked) pre-forms) + '(list (global-mode-region-beginning + (current-global-mode-keyword-name)) + (global-mode-region-end + (current-global-mode-keyword-name)))))) ((and (consp arg-descriptor) (eq :splice (first arg-descriptor))) (assert (alexandria:length= arg-descriptor 2)) From 24701af6019ba5fd26eb06274a482b9973ae3af7 Mon Sep 17 00:00:00 2001 From: sasanidas Date: Wed, 3 Jan 2024 18:31:40 +0100 Subject: [PATCH 5/9] Add sbcl flag to lock package functionality --- extensions/vi-mode/visual.lisp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/vi-mode/visual.lisp b/extensions/vi-mode/visual.lisp index 4fc682b8a..9132d8ef9 100644 --- a/extensions/vi-mode/visual.lisp +++ b/extensions/vi-mode/visual.lisp @@ -258,6 +258,7 @@ (eval-when (:compile-toplevel :load-toplevel) + #+sbcl (sb-ext:unlock-package :lem-base) (defmethod lem-base::global-mode-region-beginning ((global-mode (eql :|vi|)) &optional (buffer (current-buffer))) @@ -272,4 +273,5 @@ (cadr (visual-range)) (editor-error "Not in visual mode"))) + #+sbcl (sb-ext:lock-package :lem-base)) From 47092a21d2205e6e54c7f52ef4fede55d9acef39 Mon Sep 17 00:00:00 2001 From: sasanidas Date: Wed, 10 Jan 2024 16:09:02 +0100 Subject: [PATCH 6/9] Add new package `lem-generics` --- lem.asd | 5 +++-- src/export-generics.lisp | 14 ++++++++++++++ src/internal-packages.lisp | 6 ++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/export-generics.lisp diff --git a/lem.asd b/lem.asd index a435d719c..24977611b 100644 --- a/lem.asd +++ b/lem.asd @@ -64,8 +64,10 @@ (:file "modeline") (:file "command") (:file "mode") - (:file "defcommand") (:file "keymap") + (:file "defcommand") + (:file "fundamental-mode") + (:file "export-generics") (:file "event-queue") (:file "interp") (:file "mouse") @@ -73,7 +75,6 @@ (:file "input") (:file "overlay") (:file "streams") - (:file "fundamental-mode") (:file "completion") (:file "typeout") (:file "cursors") diff --git a/src/export-generics.lisp b/src/export-generics.lisp new file mode 100644 index 000000000..0ddd5ed63 --- /dev/null +++ b/src/export-generics.lisp @@ -0,0 +1,14 @@ +(in-package :lem-generics) + +(defgeneric global-mode-region-beginning (global-mode &optional buffer)) + +(defmethod global-mode-region-beginning ((global-mode lem-core::emacs-mode) + &optional (buffer (current-buffer))) + (region-beginning buffer)) + + +(defgeneric global-mode-region-end (global-mode &optional buffer)) + +(defmethod global-mode-region-end ((global-mode lem-core::emacs-mode) + &optional (buffer (current-buffer))) + (region-end buffer)) diff --git a/src/internal-packages.lisp b/src/internal-packages.lisp index e7000295d..24b477ccb 100644 --- a/src/internal-packages.lisp +++ b/src/internal-packages.lisp @@ -23,6 +23,12 @@ :void-object :text-object)) +(defpackage :lem-generics + (:use :cl :lem-base) + (:export + :global-mode-region-beginning + :global-mode-region-end)) + (uiop:define-package :lem-core (:use :cl :lem/common/killring From 91ed9989f9e103ab0d5f5ae8f72223fea0306bee Mon Sep 17 00:00:00 2001 From: sasanidas Date: Wed, 10 Jan 2024 16:09:33 +0100 Subject: [PATCH 7/9] Remove lem-base region functions --- src/base/basic.lisp | 9 --------- src/base/package.lisp | 2 -- 2 files changed, 11 deletions(-) diff --git a/src/base/basic.lisp b/src/base/basic.lisp index 06139b518..0d3e6ad8e 100644 --- a/src/base/basic.lisp +++ b/src/base/basic.lisp @@ -257,21 +257,12 @@ The thrid argument PROP is a property to remove." (count-characters (buffer-start-point buffer) (buffer-end-point buffer)))) -(defgeneric global-mode-region-beginning (global-mode &optional buffer)) - -(defmethod global-mode-region-beginning ((global-mode (eql :|emacs|)) &optional (buffer (current-buffer))) - (region-beginning buffer)) (defun region-beginning (&optional (buffer (current-buffer))) "Return the integer value of point or mark, whichever is smaller." (point-min (buffer-point buffer) (buffer-mark buffer))) -(defgeneric global-mode-region-end (global-mode &optional buffer)) - -(defmethod global-mode-region-end ((global-mode (eql :|emacs|)) &optional (buffer (current-buffer))) - (region-end buffer)) - (defun region-end (&optional (buffer (current-buffer))) "Return the integer value of point or mark, whichever is larger." (point-max (buffer-point buffer) diff --git a/src/base/package.lisp b/src/base/package.lisp index e20ab6f2f..8cdf1e74e 100644 --- a/src/base/package.lisp +++ b/src/base/package.lisp @@ -189,9 +189,7 @@ :insert-string :delete-character :erase-buffer - :global-mode-region-beginning :region-beginning - :global-mode-region-end :region-end :map-region :points-to-string From 8be7571876d19c6020491666fe6e2e4cf81286b6 Mon Sep 17 00:00:00 2001 From: sasanidas Date: Wed, 10 Jan 2024 16:09:58 +0100 Subject: [PATCH 8/9] Add new versions to visual and defcommand --- extensions/vi-mode/visual.lisp | 40 +++++++++++++++++----------------- src/defcommand.lisp | 9 +++----- src/ext/language-mode.lisp | 15 +++++++------ 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/extensions/vi-mode/visual.lisp b/extensions/vi-mode/visual.lisp index 9132d8ef9..6564b4a94 100644 --- a/extensions/vi-mode/visual.lisp +++ b/extensions/vi-mode/visual.lisp @@ -10,6 +10,11 @@ :normal) (:import-from :lem-vi-mode/modeline :state-modeline-orange) + (:import-from :lem/language-mode + :set-region-point-global) + (:import-from :lem-generics + :global-mode-region-beginning + :global-mode-region-end) (:import-from :lem-base :alive-point-p) (:import-from :alexandria @@ -249,29 +254,24 @@ (move-to-column (current-point) start-col)) (vi-visual-swap-points))) -(defmethod lem/language-mode:set-region-point ((start point) (end point) (global-mode (eql :|vi|))) +(defmethod set-region-point-global ((start point) (end point) + (global-mode vi-mode)) (declare (ignore global-mode)) (when (visual-p) (let ((v-range (visual-range))) (move-point start (car v-range)) (move-point end (cadr v-range))))) - -(eval-when (:compile-toplevel :load-toplevel) - #+sbcl - (sb-ext:unlock-package :lem-base) - - (defmethod lem-base::global-mode-region-beginning ((global-mode (eql :|vi|)) &optional (buffer (current-buffer))) - (declare (ignore buffer)) - (if (visual-p) - (car (visual-range)) - (editor-error "Not in visual mode"))) - - (defmethod lem-base::global-mode-region-end ((global-mode (eql :|vi|)) &optional (buffer (current-buffer))) - (declare (ignore buffer)) - (if (visual-p) - (cadr (visual-range)) - (editor-error "Not in visual mode"))) - - #+sbcl - (sb-ext:lock-package :lem-base)) +(defmethod global-mode-region-beginning ((global-mode vi-mode) + &optional (buffer (current-buffer))) + (declare (ignore buffer)) + (if (visual-p) + (car (visual-range)) + (editor-error "Not in visual mode"))) + +(defmethod global-mode-region-end ((global-mode vi-mode) + &optional (buffer (current-buffer))) + (declare (ignore buffer)) + (if (visual-p) + (cadr (visual-range)) + (editor-error "Not in visual mode"))) diff --git a/src/defcommand.lisp b/src/defcommand.lisp index 46be71714..4a8c5bd37 100644 --- a/src/defcommand.lisp +++ b/src/defcommand.lisp @@ -1,8 +1,7 @@ (in-package :lem-core) - (defun maybe-marked () - (when (eql (current-global-mode-keyword-name) :|emacs|) + (when (string= (mode-name (current-global-mode)) "emacs") (check-marked))) (eval-when (:compile-toplevel :load-toplevel) @@ -56,10 +55,8 @@ :existing nil))) (#\r (push '(maybe-marked) pre-forms) - '(list (global-mode-region-beginning - (current-global-mode-keyword-name)) - (global-mode-region-end - (current-global-mode-keyword-name)))))) + '(list (lem-generics:global-mode-region-beginning (current-global-mode)) + (lem-generics:global-mode-region-end (current-global-mode)))))) ((and (consp arg-descriptor) (eq :splice (first arg-descriptor))) (assert (alexandria:length= arg-descriptor 2)) diff --git a/src/ext/language-mode.lisp b/src/ext/language-mode.lisp index cab98253a..4f7158696 100644 --- a/src/ext/language-mode.lisp +++ b/src/ext/language-mode.lisp @@ -39,7 +39,7 @@ :display-xref-references :find-root-directory :buffer-root-directory - :set-region-point) + :set-region-point-global) #+sbcl (:lock t)) (in-package :lem/language-mode) @@ -154,11 +154,12 @@ (uncomment-region) (comment-region))) -(defgeneric set-region-point (start end global-mode)) +(defgeneric set-region-point-global (start end global-mode)) -(defmethod set-region-point ((start point) (end point) (global-mode (eql :|emacs|))) +(defmethod set-region-point-global ((start point) (end point) + (global-mode lem-core::emacs-mode)) (declare (ignore global-mode)) - (cond + (cond ((buffer-mark-p (current-buffer)) (move-point start (cursor-region-beginning (current-point))) (move-point end (cursor-region-end (current-point)))) @@ -170,7 +171,7 @@ (alexandria:when-let ((line-comment (variable-value 'line-comment :buffer))) (with-point ((start (current-point)) (end (current-point))) - (set-region-point start end (lem-core::current-global-mode-keyword-name)) + (set-region-point-global start end (lem-core::current-global-mode)) (loop (skip-whitespace-forward start) (when (point>= start end) @@ -187,7 +188,7 @@ (when line-comment (with-point ((start (current-point) :right-inserting) (end (current-point) :left-inserting)) - (set-region-point start end (lem-core::current-global-mode-keyword-name)) + (set-region-point-global start end (lem-core::current-global-mode)) (skip-whitespace-forward start) (when (point>= start end) (insert-string (current-point) line-comment) @@ -214,7 +215,7 @@ (when line-comment (with-point ((start (current-point) :right-inserting) (end (current-point) :right-inserting)) - (set-region-point start end (lem-core::current-global-mode-keyword-name)) + (set-region-point-global start end (lem-core::current-global-mode)) (let ((p start)) (loop (parse-partial-sexp p end nil t) From ac6dea8da276efbef1eb45bcc72ea3b329472463 Mon Sep 17 00:00:00 2001 From: sasanidas Date: Wed, 10 Jan 2024 16:10:22 +0100 Subject: [PATCH 9/9] Remove unused code --- src/mode.lisp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/mode.lisp b/src/mode.lisp index 02d3863f0..4bade0e57 100644 --- a/src/mode.lisp +++ b/src/mode.lisp @@ -104,10 +104,6 @@ (defun current-global-mode () *current-global-mode*) -(defun current-global-mode-keyword-name () - (alexandria:make-keyword - (mode-name (current-global-mode)))) - (defun all-active-modes (buffer) (mapcar #'ensure-mode-object (append (buffer-minor-modes buffer)