216 votes

En utilisant Emacs de manière récursive Rechercher et remplacer dans les fichiers de texte n’est pas déjà ouverts

Comme suivi à cette question, c'est d'essayer de trouver comment faire quelque chose comme ce qui devrait être facile, surtout ne m'empêche de se plus utilisé à l'aide d'Emacs et au lieu de départ de l'éditeur, je suis déjà familier avec. Je prends l'exemple ici assez souvent dans l'édition de plusieurs fichiers.

Dans Ultraedit que j'ai fais Alt+s, puis sur p pour afficher une boîte de dialogue avec les options: Trouver (comprend l'utilisation d'expressions régulières sur plusieurs lignes), Remplacez-le par, Dans des dossiers/Types de Répertoire, de la casse, Mot Entier Seulement, la Liste des Fichiers Modifiés et Recherche dans les Sous-Répertoires. Habituellement, je vais d'abord utiliser la souris pour cliquer-glisser sélectionnez le texte que je veux remplacer.

En utilisant seulement Emacs lui-même (sur Windows XP), sans appeler utilitaire externe, comment faire pour remplacer tous les foo\nbar avec bar\nbaz en *.c et *.h fichiers dans un dossier et de tous les dossiers en dessous. Peut-être Emacs n'est pas le meilleur outil pour ce faire avec, mais comment peut-il être fait facilement avec un minimum de commande?

390voto

Chris Conway Points 24671
<ol> <li><code></code>: vous serez invité pour un répertoire racine et un modèle de nom de fichier.</li> <li>Presse <code></code> pour « alterner marque » pour tous les fichiers trouvés.</li> <li>Presse <code></code> pour « Requête-remplacer dans les fichiers... » : on vous demandera de requête/substitution expressions régulières.</li> <li>Procéder comme avec <code></code> : <code></code> pour remplacer et passer au prochain match, <code></code> pour sauter un match, etc..</li> </ol>

37voto

Ballpark Points 1341
  • M-x find-name-dired RET
    • il peut prendre un certain temps pour que tous les fichiers apparaissent dans la liste, faites défiler vers le bas (M->) jusqu'à ce que "find finished" s'affiche pour vous assurer qu'ils ont tous chargé
  • Appuyez sur t "bascule de la marque" tous les fichiers trouvés
  • Appuyez sur Q pour les "Query-replace dans les Fichiers...": vous serez invité à saisir de la requête ou de substitution d'expressions régulières.
  • Procéder comme avec query-replace-regexp: ESPACE ou y afin de remplacer et de se déplacer au prochain match, n pour passer d'un match, etc.
    • Type de ! pour remplacer toutes les occurrences dans le fichier actuel, sans le demander, N de sauter tous les possibles de remplacement pour le repos du fichier en cours. (N est emacs 23+ uniquement)
    • Pour faire le remplacement de tous les fichiers sans demander, tapez Y.
  • Appel "ibuffer" (C-x C-b s'il est lié à ibuffer, ou M-x ibuffer RET) à la liste de tous les fichiers ouverts.
  • Type * u marquer tous les fichiers non enregistrés, tapez S pour enregistrer tous les fichiers marqués
  • * * RET pour la désélectionner toutes les marques, ou de type D pour fermer tous les fichiers marqués

Cette réponse est combiné à partir de cette réponse, à partir de ce site, et à partir de mes propres notes. En Utilisant Emacs 23+.

18voto

EmacsFodder Points 12284

Les réponses fournies sont grands, mais je pensais que je voudrais ajouter une approche légèrement différente.

C'est une méthode interactive, et exige wgrep, rgrep et iedit. Les deux iedit et wgrep doit être installé via MELPA ou de la Marmelade (à l'aide d' M-x package-list-packages)

La première exécution M-x rgrep de trouver la chaîne que vous recherchez.

Vous serez en mesure de spécifier les types de fichiers/pattern et le dossier de manière récursive.

Ensuite, vous aurez besoin pour exécuter wgrep démarrer avec C-s C-p.

Wgrep vous permettra de modifier l' rgrep résultats afin de définir une région sur la chaîne de match et le début iedit-mode avec C-; (en fonction de votre terminal, vous pourriez avoir besoin de re-lier cet)

Toutes les occurrences seront modifiables à la fois. C-x C-s de commettre wgrep. Ensuite, C-x s ! pour enregistrer les fichiers modifiés.

Le principal avantage de cette méthode est que vous pouvez utiliser iedit-mode pour désactiver certains matchs M-;. Vous pouvez également utiliser les résultats en rgrep de sauter dans les fichiers, par exemple si vous avez un imprévu match.

Je trouve ça très utiles pour faire de la source de modifications et de les renommer des symboles (variables, les noms de fonction, etc.) l'ensemble du projet.

Si vous ne connaissez pas déjà/utilisation iedit mode c'est un outil très pratique, je vous recommande fortement de donner un coup d'oeil.

13voto

Blair Conrad Points 56195

Je généralement utiliser d’autres outils pour effectuer cette tâche et il semble que bon nombre des approches mentionnées à débourser de EmacsWiki Rechercher et remplacer dans l’entrée de fichiers , mais le Paquet Findr semble très prometteur.

Voler la partie du fichier source:

5voto

Alex Coventry Points 11090

À l’aide de dired récursivité dans une arborescence de répertoires profonde va être un peu lent pour cette tâche. Vous pouvez envisager d’utiliser des balises-query-replace. Cela ne veut pas dire écosser dehors pour créer une table de balises, mais qui est souvent utile de toute façon, et c’est rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X