summaryrefslogtreecommitdiff
path: root/lisp/rect.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/rect.el')
-rw-r--r--lisp/rect.el50
1 files changed, 36 insertions, 14 deletions
diff --git a/lisp/rect.el b/lisp/rect.el
index 15d636f074e..47df95b04e4 100644
--- a/lisp/rect.el
+++ b/lisp/rect.el
@@ -634,18 +634,17 @@ with a prefix argument, prompt for START-AT and FORMAT."
(add-function :around region-insert-function
#'rectangle--insert-region)
-(defvar rectangle-mark-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [?\C-o] 'open-rectangle)
- (define-key map [?\C-t] 'string-rectangle)
- (define-key map [remap exchange-point-and-mark]
- 'rectangle-exchange-point-and-mark)
- (dolist (cmd '(right-char left-char forward-char backward-char
- next-line previous-line))
- (define-key map (vector 'remap cmd)
- (intern (format "rectangle-%s" cmd))))
- map)
- "Keymap used while marking a rectangular region.")
+(defvar-keymap rectangle-mark-mode-map
+ :doc "Keymap used while marking a rectangular region."
+ "C-o" #'open-rectangle
+ "C-t" #'string-rectangle
+ "<remap> <exchange-point-and-mark>" #'rectangle-exchange-point-and-mark
+ "<remap> <right-char>" #'rectangle-right-char
+ "<remap> <left-char>" #'rectangle-left-char
+ "<remap> <forward-char>" #'rectangle-forward-char
+ "<remap> <backward-char>" #'rectangle-backward-char
+ "<remap> <next-line>" #'rectangle-next-line
+ "<remap> <previous-line>" #'rectangle-previous-line)
;;;###autoload
(define-minor-mode rectangle-mark-mode
@@ -656,6 +655,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 +755,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