aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/frameset.el5
-rw-r--r--lisp/register.el79
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.
245Register 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
256One can add new types to a specific command by defining a new `cl-defmethod'
257matching that command. Predicates for type in new `cl-defmethod' should
258satisfy `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.
572Interactively, prompt for REGISTER using `register-read-with-preview'." 535Interactively, 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.
626VAL is the contents of a register as returned by `get-register'. 601VAL 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"))