From e9faa13f6f30512755ef19344a90588b26305ccf Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Sat, 18 Jan 2025 18:04:55 +0100 Subject: [PATCH] (refactor-backend-read-replacement): Provide live feedback --- lisp/progmodes/refactor.el | 49 +++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/lisp/progmodes/refactor.el b/lisp/progmodes/refactor.el index 5ffa83a7f4c..c4fc2ec5f8c 100644 --- a/lisp/progmodes/refactor.el +++ b/lisp/progmodes/refactor.el @@ -184,27 +184,42 @@ Otherwise, if the replacement is valid, return nil." (push (cons (match-beginning 0) (match-end 0)) regions))) regions)) +(declare-function track-changes-register "track-changes") +(declare-function track-changes-fetch "track-changes") + (cl-defgeneric refactor-backend-read-replacement (backend old scope) "Read a replacement for identifier OLD across SCOPE using BACKEND." - (pcase-dolist (`(,beg . ,end) - (refactor-backend-rename-highlight-regions backend old scope)) - (let ((ov (make-overlay beg end))) - (overlay-put ov 'refactor-rename-old t) - (overlay-put ov 'face 'lazy-highlight))) - (unwind-protect - (let ((new nil) - (invalid nil)) - (while (not new) - (setq new (read-string (format "%sRename \"%s\" across %s to: " + (let (ovs) + (pcase-dolist (`(,beg . ,end) + (refactor-backend-rename-highlight-regions backend old scope)) + (let ((ov (make-overlay beg end))) + (overlay-put ov 'face 'lazy-highlight) + (push ov ovs))) + (unwind-protect + (let ((new nil) (invalid nil)) + (while (not new) + (setq new + (minibuffer-with-setup-hook + (lambda () + (require 'track-changes) + (track-changes-register + (lambda (id) + (track-changes-fetch + id (lambda (&rest _) + (dolist (ov ovs) + (overlay-put ov 'display + (minibuffer-contents)))))) + :nobefore t)) + (read-string (format "%sRename \"%s\" across %s to: " (or invalid "") old (or scope "current scope")) - nil nil old)) - (when-let ((inv (refactor-backend-invalid-replacement - backend old new scope))) - (setq invalid (format "Invalid replacement \"%s\": %s\n" new inv) - new nil))) - new) - (remove-overlays (point-min) (point-max) 'refactor-rename-old t))) + nil nil old))) + (when-let ((inv (refactor-backend-invalid-replacement + backend old new scope))) + (setq invalid (format "Invalid replacement \"%s\": %s\n" new inv) + new nil))) + new) + (mapc #'delete-overlay ovs)))) (cl-defgeneric refactor-backend-read-new-function-name (_backend) "Read a new function name." -- 2.39.5