]> git.eshelyaron.com Git - emacs.git/commitdiff
Faster region-beginning and region-end for rectangle selections
authorMattias EngdegÄrd <mattiase@acm.org>
Sat, 24 Aug 2024 13:00:32 +0000 (15:00 +0200)
committerEshel Yaron <me@eshelyaron.com>
Wed, 4 Sep 2024 07:51:32 +0000 (09:51 +0200)
* lisp/rect.el (rectangle--region-beginning, rectangle--region-end):
Make these run in O(1), not linear, time and space.

(cherry picked from commit 3a8222e700304e4dff84fcdfa8ff2a4e48646c82)

lisp/rect.el

index 0212dedcb48eafe955394e88a71b370779e5483c..9300782467913bdbca37d4cb0d9c53af20fa89ac 100644 (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