From ca58aedbba96599731ba29bb617e1b077d2284eb Mon Sep 17 00:00:00 2001 From: divyansharma001 Date: Wed, 25 Feb 2026 13:38:14 +0530 Subject: [PATCH] Add separate 'Replace all occurrences' button, keep original 'Replace all further occurrences' --- TeXmacs/progs/generic/search-widgets.scm | 19 ++++++++++++ devel/202_105.md | 38 ++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 devel/202_105.md diff --git a/TeXmacs/progs/generic/search-widgets.scm b/TeXmacs/progs/generic/search-widgets.scm index e440f02668..ec0eae33ca 100644 --- a/TeXmacs/progs/generic/search-widgets.scm +++ b/TeXmacs/progs/generic/search-widgets.scm @@ -704,6 +704,19 @@ tree 或 #f (perform-search*) (set! isreplace? #t)))) +(tm-define (replace-all-occurrences . args) + (let ((u (if (null? args) (master-buffer) (car args))) + (raux (if (null? args) (replace-buffer) (cadr args)))) + (and-with by (or (by-tree raux) current-replace) + (with-buffer u + (search-extreme-match #f) + (start-editing) + (while (replace-next by) + (perform-search*)) + (end-editing)) + (perform-search*) + (set! isreplace? #t)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Customized keyboard shortcuts in search and replace modes ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -938,6 +951,8 @@ tree 或 #f "Replace all further occurrences (Command+Enter)" "Replace all further occurrences (Ctrl+Enter)"))) (replace-all u raux)) + ((balloon (icon "tm_replace_all.xpm") "Replace all occurrences") + (replace-all-occurrences u raux)) >>> (=> (balloon (icon "tm_preferences.xpm") "Search and replace preferences") @@ -977,6 +992,8 @@ tree 或 #f (replace-one)) ((balloon (icon "tm_replace_all.xpm") "Replace all further occurrences") (replace-all)) + ((balloon (icon "tm_replace_all.xpm") "Replace all occurrences") + (replace-all-occurrences)) >>> (=> (balloon (icon "tm_preferences.xpm") "Search and replace preferences") @@ -1178,6 +1195,8 @@ tree 或 #f (replace-one)) ((balloon (icon "tm_replace_all.xpm") "Replace all further occurrences") (replace-all)) + ((balloon (icon "tm_replace_all.xpm") "Replace all occurrences") + (replace-all-occurrences)) >>> ((check (balloon (icon "tm_filter.xpm") "Only show paragraphs with hits") "v" (search-filter-enabled?)) diff --git a/devel/202_105.md b/devel/202_105.md new file mode 100644 index 0000000000..33cd9dc9d1 --- /dev/null +++ b/devel/202_105.md @@ -0,0 +1,38 @@ +# [202_105] Search and replace: add "Replace all occurrences" button + +## How to test +1. Open a document with multiple occurrences of a word (e.g. "hello" appearing 5 times) +2. Open search and replace (Edit → Search and replace) +3. Place cursor in the middle of the document (e.g. after the 3rd occurrence) +4. Enter the search term "hello" and the replacement "world" +5. Click "Replace all further occurrences" (or press Ctrl+Enter / Command+Enter) +6. Confirm that only the occurrences **after the cursor** are replaced (original behavior preserved) +7. Undo, then click "Replace all occurrences" +8. Confirm that **all 5 occurrences** are replaced, including those before the cursor + +## 2026/02/25 +### What +Add a separate "Replace all occurrences" button that replaces every match in the entire document, while keeping the original "Replace all further occurrences" button and behavior. + +### Why +Users expect a way to replace every occurrence in the document regardless of cursor position (issue #2857). The maintainer requested this as a separate button so the original "Replace all further occurrences" behavior is preserved. + +### How +Added a new `replace-all-occurrences` function that calls `(search-extreme-match #f)` before the replace loop to navigate to the first match, so replacement starts from the beginning of the document. The original `replace-all` function is kept unchanged. + +```scheme +(tm-define (replace-all-occurrences . args) + (let ((u (if (null? args) (master-buffer) (car args))) + (raux (if (null? args) (replace-buffer) (cadr args)))) + (and-with by (or (by-tree raux) current-replace) + (with-buffer u + (search-extreme-match #f) ;; Go to the first match + (start-editing) + (while (replace-next by) + (perform-search*)) + (end-editing)) + (perform-search*) + (set! isreplace? #t)))) +``` + +Added a new "Replace all occurrences" button in all 3 replace UI locations (dialog, side panel, toolbar) alongside the existing "Replace all further occurrences" button.