2013-02-23 3 views
4

J'essaye de convertir un site Web en ebook, et il y a un morceau énorme de html au début de chaque page que je veux supprimer. Comme vous pouvez l'imaginer, l'utilisation de Q ne donne aucune correspondance car quelque chose dans le gros morceau n'est pas correctement échappé. Lorsque j'essaie de résoudre le problème, j'obtiens un débordement de pile. Ce dont j'ai vraiment besoin, c'est d'un moyen de trouver et de remplacer dans dired sans regex, de la manière habituelle M-%. Est-ce possible?Rechercher et remplacer sans regexp dans dired

Répondre

6

Le comportement de l'expression rationnelle est facultatif en théorie, mais la fonction appelle en question le codage en dur de cette hypothèse dans quelques endroits. Je pense que la solution la plus simple est de faire des copies qui ne définissent pas les drapeaux de regexp quand ils s'exécutent.

(eval-after-load 'dired 
    '(define-key dired-mode-map (kbd "C-c Q") 'my-dired-do-query-replace)) 

(defun my-dired-do-query-replace (from to &optional delimited) 
    "Do `query-replace' of FROM with TO, on all marked files. 
Third arg DELIMITED (prefix arg) means replace only word-delimited matches. 
If you exit (\\[keyboard-quit], RET or q), you can resume the query replace 
with the command \\[tags-loop-continue]." 
    (interactive 
    (let ((common 
      (query-replace-read-args 
      "Query replace in marked files" nil t))) 
    (list (nth 0 common) (nth 1 common) (nth 2 common)))) 
    (require 'dired-aux) 
    (dolist (file (dired-get-marked-files nil nil 'dired-nondirectory-p)) 
    (let ((buffer (get-file-buffer file))) 
     (if (and buffer (with-current-buffer buffer 
         buffer-read-only)) 
      (error "File `%s' is visited read-only" file)))) 
    (my-tags-query-replace 
    from to delimited '(dired-get-marked-files nil nil 'dired-nondirectory-p))) 

(defun my-tags-query-replace (from to &optional delimited file-list-form) 
    "Do `query-replace' of FROM with TO on all files listed in tags table. 
Third arg DELIMITED (prefix arg) means replace only word-delimited matches. 
If you exit (\\[keyboard-quit], RET or q), you can resume the query replace 
with the command \\[tags-loop-continue]. 
Fourth arg FILE-LIST-FORM non-nil means initialize the replacement loop. 
Fifth and sixth arguments START and END are accepted, for compatibility 
with `query-replace', and ignored. 

If FILE-LIST-FORM is non-nil, it is a form to evaluate to 
produce the list of files to search. 

See also the documentation of the variable `tags-file-name'." 
    (interactive (query-replace-read-args "Tags query replace" nil t)) 
    (require 'etags) 
    (setq tags-loop-scan `(let ,(unless (equal from (downcase from)) 
           '((case-fold-search nil))) 
          (if (search-forward ',from nil t) 
           ;; When we find a match, move back 
           ;; to the beginning of it so perform-replace 
           ;; will see it. 
           (goto-char (match-beginning 0)))) 
     tags-loop-operate `(perform-replace ',from ',to t nil ',delimited 
              nil multi-query-replace-map)) 
    (tags-loop-continue (or file-list-form t))) 
+0

Parfait. Seul reproche (que je suis sûr que cela arrive avec l'expression rationnelle) est que lorsque vous appuyez sur! il se termine uniquement pour le tampon actuel, plutôt que pour tous les fichiers. Encore, 2 minutes de maintien! est une solution suffisante pour moi! –

+0

Oui, c'est littéralement une copie des fonctions d'origine avec seulement quelques changements mineurs pour utiliser la fonctionnalité non-regexp (et un couple de 'require's, car l'autre code charge automatiquement les bibliothèques nécessaires). – phils