diff options
author | Juri Linkov <juri@linkov.net> | 2022-06-08 20:10:12 +0300 |
---|---|---|
committer | Juri Linkov <juri@linkov.net> | 2022-06-08 20:10:12 +0300 |
commit | c754f277a67549bb8346c77a4962bcbf03590ece (patch) | |
tree | 05113a32275cd54ea9c2f39e6e4d92890c74e92a /lisp/rect.el | |
parent | 4ad75a50a266f24b48031fcf66df0738f66bea9b (diff) | |
download | emacs-c754f277a67549bb8346c77a4962bcbf03590ece.tar.gz |
* lisp/rect.el: Return correct positions of region-beginning/end (bug#55234)
(rectangle-mark-mode): Add advices for region-beginning and region-end.
(rectangle--region-beginning, rectangle--region-end): New advices.
(rectangle--extract-region): Let-bind rectangle-mark-mode around
region-beginning and region-end to use the original functions.
Diffstat (limited to 'lisp/rect.el')
-rw-r--r-- | lisp/rect.el | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/lisp/rect.el b/lisp/rect.el index 15d636f074e..e717d2ac7e1 100644 --- a/lisp/rect.el +++ b/lisp/rect.el @@ -656,6 +656,8 @@ on. Only lasts until the region is next deactivated." :lighter nil (rectangle--reset-crutches) (when rectangle-mark-mode + (advice-add 'region-beginning :around #'rectangle--region-beginning) + (advice-add 'region-end :around #'rectangle--region-end) (add-hook 'deactivate-mark-hook (lambda () (rectangle-mark-mode -1))) (unless (region-active-p) @@ -754,17 +756,38 @@ Ignores `line-move-visual'." (rectangle--col-pos col 'point))) +(defun rectangle--region-beginning (orig) + "Like `region-beginning' but supports rectangular regions." + (cond + ((not rectangle-mark-mode) + (funcall orig)) + (t + (apply #'min (mapcar #'car (region-bounds)))))) + +(defun rectangle--region-end (orig) + "Like `region-end' but supports rectangular regions." + (cond + ((not rectangle-mark-mode) + (funcall orig)) + (t + (apply #'max (mapcar #'cdr (region-bounds)))))) + (defun rectangle--extract-region (orig &optional delete) (cond ((not rectangle-mark-mode) (funcall orig delete)) ((eq delete 'bounds) - (extract-rectangle-bounds (region-beginning) (region-end))) + (extract-rectangle-bounds + ;; Avoid recursive calls from advice + (let (rectangle-mark-mode) (region-beginning)) + (let (rectangle-mark-mode) (region-end)))) (t (let* ((strs (funcall (if delete #'delete-extract-rectangle #'extract-rectangle) - (region-beginning) (region-end))) + ;; Avoid recursive calls from advice + (let (rectangle-mark-mode) (region-beginning)) + (let (rectangle-mark-mode) (region-end)))) (str (mapconcat #'identity strs "\n"))) (when (eq last-command 'kill-region) ;; Try to prevent kill-region from appending this to some |