aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/delsel.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/delsel.el')
-rw-r--r--lisp/delsel.el81
1 files changed, 45 insertions, 36 deletions
diff --git a/lisp/delsel.el b/lisp/delsel.el
index f00f4843073..e736dd75e3a 100644
--- a/lisp/delsel.el
+++ b/lisp/delsel.el
@@ -68,16 +68,13 @@ Value must be the register (key) to use."
68 (character :tag "Register (Key)")) 68 (character :tag "Register (Key)"))
69 :group 'editing-basics) 69 :group 'editing-basics)
70 70
71;; FIXME: Why not just define a face?
71(defcustom delete-selection-replacement-face 'highlight 72(defcustom delete-selection-replacement-face 'highlight
72 "If non-nil, active region replacement text is shown in this face. 73 "If non-nil, active region replacement text is shown in this face.
73The highlighted text is the text that will be inserted by 74The highlighted text is the text that will be inserted by
74the `delete-selection-repeat-replace-region' command." 75the `delete-selection-repeat-replace-region' command."
75 :type 'face 76 :type 'face
76 :group 'editing-basics 77 :group 'editing-basics)
77 :set (lambda (symbol value)
78 (set-default symbol value)
79 (if delsel--replace-overlay
80 (overlay-put delsel--replace-overlay 'face value))))
81 78
82(defcustom delete-selection-temporary-region nil 79(defcustom delete-selection-temporary-region nil
83 "Whether to delete only temporary regions. 80 "Whether to delete only temporary regions.
@@ -128,8 +125,8 @@ For compatibility with features and packages that are aware of
128 (setq-default delete-selection-mode nil) ; But keep it globally disabled. 125 (setq-default delete-selection-mode nil) ; But keep it globally disabled.
129 ))) 126 )))
130 127
131(defvar delsel--replace-overlay nil) ;overlay 128(defvar delsel--replace-text-or-position nil
132(defvar delsel--replace-text nil) ;text from overlay 129 "Can be a string or an overlay.")
133 130
134;;;###autoload 131;;;###autoload
135(defun delete-active-region (&optional killp) 132(defun delete-active-region (&optional killp)
@@ -145,17 +142,43 @@ the active region is killed instead of deleted."
145 (delete-selection-save-to-register 142 (delete-selection-save-to-register
146 (set-register delete-selection-save-to-register 143 (set-register delete-selection-save-to-register
147 (funcall region-extract-function t)) 144 (funcall region-extract-function t))
148 (if delsel--replace-overlay 145 ;; FIXME: This overlay stays "alive" too long (i.e. well after
149 (move-overlay delsel--replace-overlay (point) (point) (current-buffer)) 146 ;; the users are likely to consider they've completed the replacement).
150 (setq delsel--replace-overlay 147 ;; Maybe we should setup `cusror-sensor-mode' to call
151 (make-overlay (point) (point) (current-buffer) nil t)) 148 ;; `delete--replacement-string'. when the cursor moves away from
149 ;; the overlay.
150 (if (overlayp delsel--replace-text-or-position)
151 (move-overlay delsel--replace-text-or-position
152 (point) (point) (current-buffer))
153 (setq delsel--replace-text-or-position
154 (make-overlay (point) (point) nil nil t))
152 (if delete-selection-replacement-face 155 (if delete-selection-replacement-face
153 (overlay-put delsel--replace-overlay 'face 156 (overlay-put delsel--replace-text-or-position 'face
154 delete-selection-replacement-face))) 157 delete-selection-replacement-face))))
155 (setq delsel--replace-text nil))
156 (t 158 (t
157 (funcall region-extract-function 'delete-only)))) 159 (funcall region-extract-function 'delete-only))))
158 160
161(defun delete--replacement-string ()
162 ;; If this is the first use after overwriting regions,
163 ;; find the replacement text by looking at the overlay.
164 (when (overlayp delsel--replace-text-or-position)
165 (if (null (overlay-buffer delsel--replace-text-or-position))
166 (setq delsel--replace-text-or-position nil)
167 (with-current-buffer (overlay-buffer delsel--replace-text-or-position)
168 (let ((s (overlay-start delsel--replace-text-or-position))
169 (e (overlay-end delsel--replace-text-or-position)))
170 (delete-overlay delsel--replace-text-or-position)
171 (if (= s e)
172 (setq delsel--replace-text-or-position nil)
173 (setq delsel--replace-text-or-position
174 (filter-buffer-substring s e))
175 (set-text-properties
176 0 (length delsel--replace-text-or-position)
177 nil delsel--replace-text-or-position))))))
178 (cl-assert (or (null delsel--replace-text-or-position)
179 (stringp delsel--replace-text-or-position)))
180 delsel--replace-text-or-position)
181
159(defun delete-selection-repeat-replace-region (arg) 182(defun delete-selection-repeat-replace-region (arg)
160 "Repeat replacing text of highlighted region with typed text. 183 "Repeat replacing text of highlighted region with typed text.
161Search for the next stretch of text identical to the region last replaced 184Search for the next stretch of text identical to the region last replaced
@@ -169,28 +192,14 @@ Just `\\[universal-argument]' means repeat until the end of the buffer's accessi
169 (prefix-numeric-value current-prefix-arg)))) 192 (prefix-numeric-value current-prefix-arg))))
170 (if (not (and old-text (> (length old-text) 0))) 193 (if (not (and old-text (> (length old-text) 0)))
171 (message "No known previous replacement") 194 (message "No known previous replacement")
172 ;; If this is the first use after overwriting regions, 195 (let ((string (delete--replacement-string)))
173 ;; find the replacement text by looking at the undo list. 196 (if string
174 (when (and (null delsel--replace-text) 197 (while (and (> count 0)
175 delsel--replace-overlay 198 string
176 (buffer-live-p (overlay-buffer delsel--replace-overlay))) 199 (search-forward old-text nil t))
177 (with-current-buffer (overlay-buffer delsel--replace-overlay) 200 (replace-match string nil t)
178 (let ((s (overlay-start delsel--replace-overlay)) 201 (setq count (1- count)))
179 (e (overlay-end delsel--replace-overlay))) 202 (message "Cannot locate replacement text"))))))
180 (when (/= s e)
181 (setq delsel--replace-text
182 (filter-buffer-substring s e))
183 (set-text-properties
184 0 (length delsel--replace-text)
185 nil delsel--replace-text))))
186 (delete-overlay delsel--replace-overlay))
187 (if delsel--replace-text
188 (while (and (> count 0)
189 delsel--replace-text
190 (search-forward old-text nil t))
191 (replace-match delsel--replace-text nil t)
192 (setq count (1- count)))
193 (message "Cannot locate replacement text")))))
194 203
195(defun delete-selection-helper (type) 204(defun delete-selection-helper (type)
196 "Delete selection according to TYPE: 205 "Delete selection according to TYPE: