summaryrefslogtreecommitdiff
path: root/lisp/rect.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2013-11-03 22:06:54 -0500
committerStefan Monnier <monnier@iro.umontreal.ca>2013-11-03 22:06:54 -0500
commit4aca7145ffb6e532ed3939950d0ed6b4efec2c6c (patch)
tree8923c78c18eb0c884e9eb7c24a55579d45be1b48 /lisp/rect.el
parent8b77446f3f4e49780e29cd936211eeee1453ca6c (diff)
downloademacs-4aca7145ffb6e532ed3939950d0ed6b4efec2c6c.tar.gz
* lisp/rect.el (rectangle-mark-mode): Rename from rectangle-mark.
Make it into a proper minor mode. (rectangle--region): (implicitly) rename to rectangle-mark-mode. (rectangle-mark-mode-map): New keymap. (rectangle--highlight-for-redisplay): Fix some corner cases. Fixes: debbugs:15796
Diffstat (limited to 'lisp/rect.el')
-rw-r--r--lisp/rect.el46
1 files changed, 29 insertions, 17 deletions
diff --git a/lisp/rect.el b/lisp/rect.el
index 44799f2616a..5f4f1672bdd 100644
--- a/lisp/rect.el
+++ b/lisp/rect.el
@@ -420,11 +420,8 @@ with a prefix argument, prompt for START-AT and FORMAT."
;; - lots of commands handle the region without paying attention to its
;; rectangular shape.
-(defvar-local rectangle--region nil
- "If non-nil, the region is meant to delimit a rectangle.")
-
(add-hook 'deactivate-mark-hook
- (lambda () (kill-local-variable 'rectangle--region)))
+ (lambda () (rectangle-mark-mode -1)))
(add-function :around redisplay-highlight-region-function
#'rectangle--highlight-for-redisplay)
@@ -433,17 +430,25 @@ with a prefix argument, prompt for START-AT and FORMAT."
(add-function :around region-extract-function
#'rectangle--extract-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 open-line] 'open-rectangle)
+ ;; (define-key map [remap transpose-chars] 'string-rectangle)
+ map)
+ "Keymap used while marking a rectangular region.")
+
;;;###autoload
-(defun rectangle-mark ()
- "Toggle the region as rectangular."
- (interactive)
- (if rectangle--region
- (kill-local-variable 'rectangle--region)
- (unless (region-active-p) (push-mark-command t))
- (setq rectangle--region t)))
+(define-minor-mode rectangle-mark-mode
+ "Toggle the region as rectangular.
+Activates the region if needed. Only lasts until the region is deactivated."
+ nil nil nil
+ (when rectangle-mark-mode
+ (unless (region-active-p) (push-mark-command t))))
(defun rectangle--extract-region (orig &optional delete)
- (if (not rectangle--region)
+ (if (not rectangle-mark-mode)
(funcall orig delete)
(let* ((strs (funcall (if delete
#'delete-extract-rectangle
@@ -473,7 +478,7 @@ with a prefix argument, prompt for START-AT and FORMAT."
(defun rectangle--highlight-for-redisplay (orig start end window rol)
(cond
- ((not rectangle--region)
+ ((not rectangle-mark-mode)
(funcall orig start end window rol))
((and (eq 'rectangle (car-safe rol))
(eq (nth 1 rol) (buffer-modified-tick))
@@ -535,10 +540,17 @@ with a prefix argument, prompt for START-AT and FORMAT."
(eq (char-before right) ?\t))
(setq right (1- right))
(move-overlay ol left right)
- (goto-char right)
- (let ((str (make-string (- rightcol (current-column)) ?\s)))
- (put-text-property 0 (length str) 'face 'region str)
- (overlay-put ol 'after-string str)))
+ (if (= rightcol leftcol)
+ (overlay-put ol 'after-string nil)
+ (goto-char right)
+ (let ((str (make-string
+ (- rightcol (max leftcol (current-column))) ?\s)))
+ (put-text-property 0 (length str) 'face 'region str)
+ (when (= left right)
+ ;; If cursor happens to be here, draw it *before* rather
+ ;; than after this highlighted pseudo-text.
+ (put-text-property 0 1 'cursor 1 str))
+ (overlay-put ol 'after-string str))))
((overlay-get ol 'after-string)
(overlay-put ol 'after-string nil)))
(when (= leftcol rightcol)