--- replace.el 17 Jun 2004 16:36:17 +0200 1.173 +++ replace.el 17 Jun 2004 18:55:27 +0200 @@ -1115,6 +1115,24 @@ (aset data 2 (if (consp next) next (aref data 3)))))) (car (aref data 2))) +(defun replace-match-maybe-edit (newtext fixedcase literal &optional match-data) + "Make a replacement with `replace-match', editing `\\?'. +NEXTEXT, FIXEDCASE, LITERAL are just passed on. If MATCH-DATA is handed +in, it is used for the replacement, otherwise the current MATCH-DATA is +used (and saved during editing)." + (unless literal + (unless match-data + (setq match-data (match-data))) + (while (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\\\?\\)" + newtext) + (setq newtext + (read-input "Edit replacement string: " + (cons + (replace-match "" t t newtext 3) + (1+ (match-beginning 3))))))) + (if match-data (set-match-data match-data)) + (replace-match newtext fixedcase literal)) + (defun perform-replace (from-string replacements query-flag regexp-flag delimited-flag &optional repeat-count map start end) @@ -1252,8 +1270,8 @@ replace-count))) (if (not query-flag) (let ((inhibit-read-only query-replace-skip-read-only)) - (set-match-data real-match-data) - (replace-match next-replacement nocasify literal) + (replace-match-maybe-edit next-replacement nocasify literal + real-match-data) (setq replace-count (1+ replace-count))) (undo-boundary) (let (done replaced key def) @@ -1300,26 +1318,30 @@ ((eq def 'act) (or replaced (progn - (replace-match next-replacement nocasify literal) + (replace-match-maybe-edit + next-replacement nocasify literal) (setq replace-count (1+ replace-count)))) (setq done t replaced t)) ((eq def 'act-and-exit) (or replaced (progn - (replace-match next-replacement nocasify literal) + (replace-match-maybe-edit + next-replacement nocasify literal) (setq replace-count (1+ replace-count)))) (setq keep-going nil) (setq done t replaced t)) ((eq def 'act-and-show) (if (not replaced) (progn - (replace-match next-replacement nocasify literal) + (replace-match-maybe-edit + next-replacement nocasify literal) (setq replace-count (1+ replace-count)) (setq replaced t)))) ((eq def 'automatic) (or replaced (progn - (replace-match next-replacement nocasify literal) + (replace-match-maybe-edit + next-replacement nocasify literal) (setq replace-count (1+ replace-count)))) (setq done t query-flag nil replaced t)) ((eq def 'skip) @@ -1350,7 +1372,8 @@ (read-input "Edit replacement string: " next-replacement)) (or replaced - (replace-match next-replacement nocasify literal)) + (replace-match-maybe-edit + next-replacement nocasify literal)) (setq done t)) ((eq def 'delete-and-edit)