Faster region-beginning and region-end for rectangle selections

* lisp/rect.el (rectangle--region-beginning, rectangle--region-end):
Make these run in O(1), not linear, time and space.
This commit is contained in:
Mattias Engdegård 2024-08-24 15:00:32 +02:00
parent 7319f5e078
commit 3a8222e700

View file

@ -766,7 +766,17 @@ Ignores `line-move-visual'."
((not rectangle-mark-mode)
(funcall orig))
(t
(apply #'min (mapcar #'car (region-bounds))))))
(save-excursion
(let* ((pt (point))
(mk (mark))
(start (min pt mk))
(end (max pt mk))
(cols (rectangle--pos-cols start end))
(startcol (car cols))
(endcol (cdr cols)))
(goto-char start)
(move-to-column (min startcol endcol))
(point))))))
(defun rectangle--region-end (orig)
"Like `region-end' but supports rectangular regions."
@ -774,7 +784,17 @@ Ignores `line-move-visual'."
((not rectangle-mark-mode)
(funcall orig))
(t
(apply #'max (mapcar #'cdr (region-bounds))))))
(save-excursion
(let* ((pt (point))
(mk (mark))
(start (min pt mk))
(end (max pt mk))
(cols (rectangle--pos-cols start end))
(startcol (car cols))
(endcol (cdr cols)))
(goto-char end)
(move-to-column (max startcol endcol))
(point))))))
(defun rectangle--extract-region (orig &optional delete)
(cond