emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: `Q' in Dired - be able to skip the rest of one file and move onto th


From: Juri Linkov
Subject: Re: `Q' in Dired - be able to skip the rest of one file and move onto the next
Date: Sun, 20 Jul 2008 03:33:54 +0300
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (x86_64-pc-linux-gnu)

>> I see that this useful feature is not yet implemented, so I have
>> made a patch that implements multi-file query-replace UI.
>
> Thanks for implementing this.

I now have a better patch where all multi-file processing was moved to
`perform-replace', so external packages like etags.el only need to add
`multi-query-replace-map' as the `map' argument of `perform-replace'.

Index: lisp/progmodes/etags.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/progmodes/etags.el,v
retrieving revision 1.211
diff -c -r1.211 etags.el
*** lisp/progmodes/etags.el     7 Jun 2008 02:37:37 -0000       1.211
--- lisp/progmodes/etags.el     20 Jul 2008 00:27:14 -0000
***************
*** 1865,1871 ****
                              ;; to the beginning of it so perform-replace
                              ;; will see it.
                              (goto-char (match-beginning 0))))
!       tags-loop-operate `(perform-replace ',from ',to t t ',delimited))
    (tags-loop-continue (or file-list-form t)))
  
  (defun tags-complete-tags-table-file (string predicate what) ; Doc string?
--- 1865,1872 ----
                              ;; to the beginning of it so perform-replace
                              ;; will see it.
                              (goto-char (match-beginning 0))))
!       tags-loop-operate `(perform-replace ',from ',to t t ',delimited
!                                           nil multi-query-replace-map))
    (tags-loop-continue (or file-list-form t)))
  
  (defun tags-complete-tags-table-file (string predicate what) ; Doc string?

Index: lisp/replace.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/replace.el,v
retrieving revision 1.273
diff -c -r1.273 replace.el
*** lisp/replace.el     29 Jun 2008 16:09:08 -0000      1.273
--- lisp/replace.el     20 Jul 2008 00:32:42 -0000
***************
*** 1372,1377 ****
--- 1372,1391 ----
  `exit', `act-and-exit', `edit', `delete-and-edit', `recenter',
  `automatic', `backup', `exit-prefix', and `help'.")
  
+ (defvar multi-query-replace-map
+   (let ((map (make-sparse-keymap)))
+     (set-keymap-parent map query-replace-map)
+     (define-key map "Y" 'automatic-all)
+     (define-key map "N" 'exit-current)
+     map)
+   "Keymap that defines additional bindings for multi-buffer operations.
+ It extends its parent map `query-replace-map' with new bindings to
+ operate on a set of buffers/files.  The difference with its parent map
+ is the additional answers `automatic-all' to replace all remaining
+ matches in all remaining buffers with no more questions, and
+ `exit-current' to skip remaining matches in the current buffer
+ and to continue with the next buffer in the sequence.")
+ 
  (defun replace-match-string-symbols (n)
    "Process a list (and any sub-lists), expanding certain symbols.
  Symbol  Expands To
***************
*** 1527,1532 ****
--- 1541,1547 ----
           (stack nil)
           (replace-count 0)
           (nonempty-match nil)
+        (multi-file nil)
  
           ;; If non-nil, it is marker saying where in the buffer to stop.
           (limit nil)
***************
*** 1548,1553 ****
--- 1563,1573 ----
        (goto-char (min start end))
        (deactivate-mark))
  
+     ;; If last typed key in previous call of multi-file perform-replace
+     ;; was `automatic-all', don't ask more questions in next files
+     (when (eq (lookup-key map (vector last-input-char)) 'automatic-all)
+       (setq query-flag nil multi-file t))
+ 
      ;; REPLACEMENTS is either a string, a list of strings, or a cons cell
      ;; containing a function and its first argument.  The function is
      ;; called to generate each replacement like this:
***************
*** 1705,1710 ****
--- 1725,1732 ----
                        ((eq def 'exit)
                         (setq keep-going nil)
                         (setq done t))
+                       ((eq def 'exit-current)
+                        (setq multi-file t keep-going nil done t))
                        ((eq def 'backup)
                         (if stack
                             (let ((elt (pop stack)))
***************
*** 1744,1757 ****
                                   real-match-data (replace-match-data
                                                    t real-match-data)
                                   replaced t)))
!                       ((eq def 'automatic)
                         (or replaced
                             (setq noedit
                                   (replace-match-maybe-edit
                                    next-replacement nocasify literal
                                    noedit real-match-data)
                                   replace-count (1+ replace-count)))
!                        (setq done t query-flag nil replaced t))
                        ((eq def 'skip)
                         (setq done t))
                        ((eq def 'recenter)
--- 1766,1780 ----
                                   real-match-data (replace-match-data
                                                    t real-match-data)
                                   replaced t)))
!                       ((or (eq def 'automatic) (eq def 'automatic-all))
                         (or replaced
                             (setq noedit
                                   (replace-match-maybe-edit
                                    next-replacement nocasify literal
                                    noedit real-match-data)
                                   replace-count (1+ replace-count)))
!                        (setq done t query-flag nil replaced t)
!                        (if (eq def 'automatic-all) (setq multi-file t)))
                        ((eq def 'skip)
                         (setq done t))
                        ((eq def 'recenter)
***************
*** 1838,1844 ****
        (message "Replaced %d occurrence%s"
                 replace-count
                 (if (= replace-count 1) "" "s")))
!     (and keep-going stack)))
  
  (defvar replace-overlay nil)
  
--- 1861,1867 ----
        (message "Replaced %d occurrence%s"
                 replace-count
                 (if (= replace-count 1) "" "s")))
!     (or (and keep-going stack) multi-file)))
  
  (defvar replace-overlay nil)

-- 
Juri Linkov
http://www.jurta.org/emacs/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]