diff options
| author | Stefan Monnier | 2026-02-14 13:11:50 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2026-02-14 13:11:50 -0500 |
| commit | 90009704969e2ae2f50598a71d8369641968b367 (patch) | |
| tree | b5699f136cccf8e973c697994b37154e63abe8f2 /lisp/delsel.el | |
| parent | da3db9653d322f7a5a946082ec81420ebc23a8ab (diff) | |
| download | emacs-feature/delsel-replace.tar.gz emacs-feature/delsel-replace.zip | |
delsel.el: Tweak the `delsel--replace-text-or-position` handlingfeature/delsel-replace
* lisp/delsel.el (delete-selection-replacement-face): Don't bother
changing the face "on the fly".
(delsel--replace-overlay, delsel--replace-text): Delete vars and ...
(delsel--replace-text-or-position): ...re-add this single var instead.
(delete-active-region): Adjust accordingly.
(delete--replacement-string): New function extracted from
`delete-selection-repeat-replace-region`, with adjustments to account
for the above changes.
(delete-selection-repeat-replace-region): Use it.
Diffstat (limited to 'lisp/delsel.el')
| -rw-r--r-- | lisp/delsel.el | 81 |
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. |
| 73 | The highlighted text is the text that will be inserted by | 74 | The highlighted text is the text that will be inserted by |
| 74 | the `delete-selection-repeat-replace-region' command." | 75 | the `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. |
| 161 | Search for the next stretch of text identical to the region last replaced | 184 | Search 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: |