diff options
| author | Stefan Monnier | 2025-04-30 09:41:22 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2025-04-30 09:41:22 -0400 |
| commit | 3f97836538e926309fe9d307bde24472a6d317f6 (patch) | |
| tree | edeaebe16a4f1c36088b535f3c6c4f242f49d2e7 | |
| parent | 0c7e8f431b15ec11cd3b6a47eb58a3ddc3a1367c (diff) | |
| download | emacs-scratch/cleanup-register-preview.tar.gz emacs-scratch/cleanup-register-preview.zip | |
(register-type, register--type): Delete functionsscratch/cleanup-register-preview
Automatically figure out which regval can be used for insertion
and jump based on the presence of a matching method.
* lisp/register.el (register-type, register--type): Delete functions.
(register--get-method-type, register--jumpable-p)
(register--insertable-p): New functions.
(jump-to-register, insert-register): Use them.
* lisp/frameset.el (register--type): Delete method.
| -rw-r--r-- | lisp/frameset.el | 5 | ||||
| -rw-r--r-- | lisp/register.el | 79 |
2 files changed, 29 insertions, 55 deletions
diff --git a/lisp/frameset.el b/lisp/frameset.el index cbdbc1ac239..ee30f77c3ba 100644 --- a/lisp/frameset.el +++ b/lisp/frameset.el | |||
| @@ -1444,11 +1444,6 @@ Called from `list-registers' and `view-register'. Internal use only." | |||
| 1444 | (if (= 1 ns) "" "s") | 1444 | (if (= 1 ns) "" "s") |
| 1445 | (format-time-string "%c" (frameset-timestamp fs)))))) | 1445 | (format-time-string "%c" (frameset-timestamp fs)))))) |
| 1446 | 1446 | ||
| 1447 | (cl-defmethod register--type ((_regval frameset-register)) | ||
| 1448 | ;; FIXME: Why `frame' rather than `frameset'? | ||
| 1449 | ;; FIXME: We shouldn't need to touch an internal function. | ||
| 1450 | 'frame) | ||
| 1451 | |||
| 1452 | ;;;###autoload | 1447 | ;;;###autoload |
| 1453 | (defun frameset-to-register (register) | 1448 | (defun frameset-to-register (register) |
| 1454 | "Store the current frameset in register REGISTER. | 1449 | "Store the current frameset in register REGISTER. |
diff --git a/lisp/register.el b/lisp/register.el index d9465fd5b9e..cde2f6d61b7 100644 --- a/lisp/register.el +++ b/lisp/register.el | |||
| @@ -240,43 +240,6 @@ Do nothing when defining or executing kmacros." | |||
| 240 | (interactive) | 240 | (interactive) |
| 241 | (register-preview-forward-line -1)) | 241 | (register-preview-forward-line -1)) |
| 242 | 242 | ||
| 243 | (defun register-type (regval) | ||
| 244 | "Return register value REGVAL's type. | ||
| 245 | Register type that can be returned is one of the following: | ||
| 246 | - string | ||
| 247 | - number | ||
| 248 | - marker | ||
| 249 | - buffer | ||
| 250 | - file | ||
| 251 | - file-query | ||
| 252 | - window | ||
| 253 | - frame | ||
| 254 | - kmacro | ||
| 255 | |||
| 256 | One can add new types to a specific command by defining a new `cl-defmethod' | ||
| 257 | matching that command. Predicates for type in new `cl-defmethod' should | ||
| 258 | satisfy `cl-typep', otherwise the new type should be defined with | ||
| 259 | `cl-deftype'." | ||
| 260 | (if (integerp (car-safe regval)) (setq regval (cdr regval))) | ||
| 261 | ;; Call register--type against the register value. | ||
| 262 | (register--type (if (consp regval) | ||
| 263 | (car regval) | ||
| 264 | regval))) | ||
| 265 | |||
| 266 | (cl-defgeneric register--type (regval) | ||
| 267 | "Return the type of register value REGVAL." | ||
| 268 | (ignore regval)) | ||
| 269 | |||
| 270 | (cl-defmethod register--type ((_regval (eql nil))) 'null) | ||
| 271 | (cl-defmethod register--type ((_regval string)) 'string) | ||
| 272 | (cl-defmethod register--type ((_regval number)) 'number) | ||
| 273 | (cl-defmethod register--type ((_regval marker)) 'marker) | ||
| 274 | (cl-defmethod register--type ((_regval (eql buffer))) 'buffer) | ||
| 275 | (cl-defmethod register--type ((_regval (eql file))) 'file) | ||
| 276 | (cl-defmethod register--type ((_regval (eql file-query))) 'file-query) | ||
| 277 | (cl-defmethod register--type ((_regval window-configuration)) 'window) | ||
| 278 | (cl-defmethod register--type ((regval oclosure)) (oclosure-type regval)) | ||
| 279 | |||
| 280 | (defun register-of-type-alist (pred) | 243 | (defun register-of-type-alist (pred) |
| 281 | "Filter `register-alist' according to PRED." | 244 | "Filter `register-alist' according to PRED." |
| 282 | (if (null pred) | 245 | (if (null pred) |
| @@ -572,13 +535,7 @@ ignored if the register contains anything but a frameset. | |||
| 572 | Interactively, prompt for REGISTER using `register-read-with-preview'." | 535 | Interactively, prompt for REGISTER using `register-read-with-preview'." |
| 573 | (interactive (list (register-read-with-preview | 536 | (interactive (list (register-read-with-preview |
| 574 | "Jump to register: " | 537 | "Jump to register: " |
| 575 | (lambda (regval) | 538 | #'register--jumpable-p) |
| 576 | (memq (register-type regval) | ||
| 577 | ;; FIXME: This should not be hardcoded but | ||
| 578 | ;; computed based on whether a given register | ||
| 579 | ;; type implements `register-val-jump-to'. | ||
| 580 | '(window frame marker kmacro | ||
| 581 | file buffer file-query)))) | ||
| 582 | current-prefix-arg)) | 539 | current-prefix-arg)) |
| 583 | (let ((val (get-register register))) | 540 | (let ((val (get-register register))) |
| 584 | (register-val-jump-to val delete))) | 541 | (register-val-jump-to val delete))) |
| @@ -621,6 +578,24 @@ With a prefix argument, prompt for BUFFER as well." | |||
| 621 | (add-hook 'kill-buffer-hook #'register-buffer-to-file-query nil t)) | 578 | (add-hook 'kill-buffer-hook #'register-buffer-to-file-query nil t)) |
| 622 | (set-register register (cons 'buffer buffer))) | 579 | (set-register register (cons 'buffer buffer))) |
| 623 | 580 | ||
| 581 | (defun register--get-method-type (val genfun) | ||
| 582 | (let* ((type (cl-type-of val)) | ||
| 583 | (types (cl--class-allparents (cl-find-class type)))) | ||
| 584 | (while (and types (not (cl-find-method genfun nil (list (car types))))) | ||
| 585 | (setq types (cdr types))) | ||
| 586 | (car types))) | ||
| 587 | |||
| 588 | (defun register--jumpable-p (regval) | ||
| 589 | "Return non-nil if `register-val-insert' is implemented for REGVAL." | ||
| 590 | (pcase (register--get-method-type regval 'register-val-jump-to) | ||
| 591 | ('t nil) | ||
| 592 | ('registerv (registerv-jump-func regval)) | ||
| 593 | ('cons | ||
| 594 | (or (frame-configuration-p (car regval)) | ||
| 595 | (window-configuration-p (car regval)) | ||
| 596 | (memq (car regval) '(file buffer file-query)))) | ||
| 597 | (type type))) | ||
| 598 | |||
| 624 | (cl-defgeneric register-val-jump-to (_val _arg) | 599 | (cl-defgeneric register-val-jump-to (_val _arg) |
| 625 | "Execute the \"jump\" operation of VAL. | 600 | "Execute the \"jump\" operation of VAL. |
| 626 | VAL is the contents of a register as returned by `get-register'. | 601 | VAL is the contents of a register as returned by `get-register'. |
| @@ -868,18 +843,22 @@ Interactively, prompt for REGISTER using `register-read-with-preview'." | |||
| 868 | (barf-if-buffer-read-only) | 843 | (barf-if-buffer-read-only) |
| 869 | (list (register-read-with-preview | 844 | (list (register-read-with-preview |
| 870 | "Insert register: " | 845 | "Insert register: " |
| 871 | (lambda (regval) | 846 | #'register--insertable-p) |
| 872 | (memq (register-type regval) | ||
| 873 | ;; FIXME: This should not be hardcoded but | ||
| 874 | ;; computed based on whether a given register | ||
| 875 | ;; type implements `register-val-insert'. | ||
| 876 | '(string number)))) | ||
| 877 | (not current-prefix-arg)))) | 847 | (not current-prefix-arg)))) |
| 878 | (push-mark) | 848 | (push-mark) |
| 879 | (let ((val (get-register register))) | 849 | (let ((val (get-register register))) |
| 880 | (register-val-insert val)) | 850 | (register-val-insert val)) |
| 881 | (if (not arg) (exchange-point-and-mark))) | 851 | (if (not arg) (exchange-point-and-mark))) |
| 882 | 852 | ||
| 853 | (defun register--insertable-p (regval) | ||
| 854 | "Return non-nil if `register-val-insert' is implemented for REGVAL." | ||
| 855 | (pcase (register--get-method-type regval 'register-val-insert) | ||
| 856 | ;; Only rectangles are currently supported. | ||
| 857 | ('t nil) | ||
| 858 | ('registerv (registerv-insert-func regval)) | ||
| 859 | ('cons (stringp (car regval))) | ||
| 860 | (type type))) | ||
| 861 | |||
| 883 | (cl-defgeneric register-val-insert (_val) | 862 | (cl-defgeneric register-val-insert (_val) |
| 884 | "Insert register value VAL in current buffer at point." | 863 | "Insert register value VAL in current buffer at point." |
| 885 | (user-error "Register does not contain text")) | 864 | (user-error "Register does not contain text")) |