En utilisant Emacs récursive de rechercher et remplacer dans des fichiers texte n'est pas déjà ouverte
Comme un suivi de 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 uniquement Emacs lui-même (sur Windows XP), sans appeler utilitaire externe, comment faire pour remplacer tous les foo\nbar avec bar\nbaz dans *.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?
Vous devez vous connecter pour publier un commentaire.
M-x find-name-dired
: vous serez invité pour un répertoire de racine et d'un modèle de nom de fichier.t
à "changer de marque" pour tous les fichiers trouvés.Q
pour la Requête "-Remplacer dans les Fichiers...": vous serez invité à saisir de la requête ou de substitution d'expressions régulières.query-replace-regexp
:SPACE
afin de remplacer et de se déplacer au prochain match,n
pour passer d'un match, etc.C-x s
pour enregistrer les tampons. (Vous pouvez ensuite appuyer sury
,n
ou!
pour enregistrer tous à la fois)C-x s !
pour enregistrer tous les fichiers à la fois.M-,
de continuer la recherche et de remplacement (par exemple, après un "revert fichier" inviter si le fichier modifié sur le disque).*(txt|html)
est converti enfind . \( -iname \*\(coffee\|html\) \) -ls
, qui ne fonctionne pas. Est-il possible de les convertir à l'-o ou -regex mentionné ici: ? unix.stackexchange.com/questions/15308/...find-lisp-find-dired
qui ne nécessite pas de GNU trouver, de sorte qu'il fonctionne sur toutes les plateformes. en outre, il prend en charge unicode nom de fichier de la boîte.!
pour remplacer toutes les instances, mais au lieu de remplacer toutes les instances de TOUS les fichiers?M-x find-name-dired RET
M->
) jusqu'à ce que "find finished
" semble assurez-vous qu'ils ont tous chargét
à "changer de marque" pour tous les fichiers trouvésQ
pour la Requête "-Remplacer dans les Fichiers...": vous serez invité à saisir de la requête ou de substitution d'expressions régulières.y
afin de remplacer et de se déplacer au prochain match, n pour passer d'un match, etc.N
de passer tous les possibles de remplacement pour le repos du fichier en cours. (N
est emacs 23+ uniquement)Y
.C-x C-b
s'il est lié à ibuffer, ouM-x ibuffer RET
) à la liste de tous les fichiers ouverts.* u
pour marquer tous les fichiers non enregistrés, typeS
pour enregistrer tous les fichiers marqués* * RET
pour enlever toutes les marques, ou le typeD
pour fermer tous les fichiers marquésCette réponse est combiné à partir de cette réponse, de ce site, et à partir de mes propres notes. En Utilisant Emacs 23+.
ibuffer
n'est pas lié àC-x C-b
par défaut.C-x C-b
àibuffer
, parce que c'est tellement mieux que la liaison par défaut. Juste ajouter(global-set-key (kbd "C-x C-b") 'ibuffer)
pour votre .emacs fichier. À défaut, utilisezM-x ibuffer RET
dans les instructions ci-dessus.bla-bla-bla
est visité en lecture seule et il s'arrête à la recherche. Comment éviter / ignorer et de continuer à remplacer? Merci.ibuffer
quand vous pouvezC-x s
(save-some-buffers
) et le type!
? Je ne veux pas être coup de gueule, juste curieux. P. S. en plus pour décrire!
,N
etY
.Généralement, j'utilise d'autres outils pour effectuer cette tâche, et il semble que de nombreux approches mentionnées à EmacsWiki de Rechercher et Remplacer dans des Fichiers d'entrée shell, mais la Findr Paquet semble très prometteur.
Voler une partie de le fichier source:
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 nécessite
wgrep
,rgrep
etiedit
. Les deuxiedit
etwgrep
doit être installé via MELPA ou de la Marmelade (à l'aide deM-x package-list-packages
)De la première exécution de
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 avecC-s C-p
.Wgrep vous permettra de modifier la
rgrep
résultats, afin de définir une région sur la chaîne de match et commencer àiedit-mode
avecC-;
(en fonction de votre terminal, vous pourriez avoir besoin de re-lier ce)Toutes les occurrences seront modifiables à la fois.
C-x C-s
de commettrewgrep
. PuisC-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 matchsM-;
. Vous pouvez également utiliser les résultats dansrgrep
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 lui donner un look.
wgrep
fonctionnera très bien avecag
, etack
modes.wgrep
estC-c C-p
btw.Projectile est vraiment sympa:
C-c p r exécute la commande projectile-remplacer
À l'aide de dired répéter en bas d'un arbre de répertoires profond va être un peu lent pour cette tâche. Vous pourriez envisager d'utiliser tags-query-replace. Cela signifie que les bombardements de créer une table tags, mais qui est souvent utile de toute façon, et c'est rapide.
Source de l'information: Un
Pour emacs utilisateurs de la version pro:
Étape-par-Étape pour Emacs Débutants
Sélectionnez Les Fichiers Cibles
Commencer emacs en tapant “emacs” dans l'interface de ligne de commande d'invite. (Ou, double-cliquez sur l'Emacs icône si vous êtes dans l'Interface Graphique de l'environnement)
Sélection de Fichiers dans un Répertoire
Vous devez d'abord sélectionner les fichiers que vous voulez faire remplacer. Utilisez le menu graphique 〖Fichier ▸ Open Directory〗. Emacs vous demandera un chemin d'accès au répertoire. Tapez le chemin d'accès au répertoire, puis appuyez sur Enter.
Maintenant, vous verrez la liste des fichiers, et maintenant vous avez besoin de marquer les fichiers que vous souhaitez la regex rechercher/remplacer pour travailler sur. Vous marquez un fichier en déplaçant le curseur sur le fichier que vous souhaitez, puis appuyez sur la touche m. La désélectionner en appuyant sur u. (Pour la liste des sous-répertoires, déplacez votre curseur sur le répertoire et appuyez sur i. Le sous-répertoire de contenu seront listés en bas.) Pour marquer tous les fichiers en une regex, type 【% m】, puis tapez votre expression régulière pattern. Par exemple, si vous voulez marquer tous les fichiers HTML, puis tapez 【% m】 ensuite .html$. (Vous pouvez trouver une liste des marque de commandes dans le menu graphique “Marque” (ce menu s'affiche lorsque vous êtes dans le mode dired).)
Sélection de Fichiers dans un Répertoire et Tous Ses Sous-Répertoires
Si vous voulez faire un rechercher/remplacer dans les fichiers contenus dans un répertoire, y compris des centaines de sous-répertoires, voici une méthode pour sélectionner tous ces fichiers.
Appel trouver-dired. (vous appelez une commande en appuyant sur 【Alt+x】) Ensuite, tapez un nom de répertoire, ⁖ /Utilisateurs/marie/myfiles
Remarque: si vous utilisez emacs sur un unix non graphique terminal texte, et si 【Alt+x】 ne fonctionne pas, l'équivalent de la touche est 【Esc x】.
Emacs vous demandera avec l'invite de commande “Exécuter recherche (avec des arguments): ”. Si vous avez besoin de faire le remplacement sur tous les fichiers HTML, puis tapez -name "*html". Si vous ne se soucient pas quel type de fichier mais simplement tous les fichiers que dir, puis donner “de type f”.
Maintenant, marquez les fichiers comme décrit ci-dessus.
Interactive Rechercher/Remplacer
Maintenant, vous êtes prêt à faire le interactive rechercher remplacer. Pour simplifier, disons que vous voulez juste de remplacer le mot “rapide” par “super”. Maintenant, appelez-dired-do-query-replace-regexp. Il vous invite pour l'expression rationnelle de la chaîne et de la chaîne de remplacement. De Type “rapide”, enter, puis “super”.
Maintenant, emacs sera l'utilisation de votre modèle et de vérifier les fichiers, et d'arrêter et de vous montrer à chaque fois qu'une correspondance s'est produite. Lorsque cela se produit, emacs vous demande, et vous avez le choix de faire le changement ou d'ignorer le changement. Pour effectuer la modification, tapez y à l'. De sauter, de type n. Si vous voulez simplement emacs pour aller de l'avant et de faire tous ces changements à l'actuel fichier, tapez !.
Si vous souhaitez annuler l'opération sans enregistrer les modifications que vous avez apportées, type 【Ctrl+g】, puis de quitter emacs en utilisant le menu 〖Fichier ▸ Quitter Emacs〗.
Sauver les Fichiers Modifiés
Maintenant, après être passé par les au-dessus de cette épreuve, il y a une étape que vous devez faire, c'est de sauver les fichiers modifiés.
Si vous utilisez emacs version 22 ou plus tard, puis d'appeler ibuffer pour aller dans un tampon d'inscription mode, puis tapez 【* u】 pour marquer tous les fichiers non enregistrés, puis tapez S pour les sauver tous. (c'est shift-s)
Si vous utilisez un emacs version 21, alors vous pouvez le faire: liste des appels-tampons, puis déplacez le curseur sur le fichier que vous souhaitez enregistrer et de type s. Il marque le fichier pour ensuite enregistrer l'action. Type u pour la désélectionner. Une fois que vous avez terminé, tapez sur x pour exécuter la sauvegarde de tous les fichiers marqués pour la sauver. (dans emacs, ouvert le fichier est appelé “tampon”. Ignorer les autres choses.)
Alternative aux options ci-dessus, vous pouvez également appeler la méthode save-certains-tampons 【Ctrl+x s】. Puis emacs affiche chaque fichier non enregistré et vous demander si vous souhaitez enregistré.
Remarque: emacs de la regex n'est pas la même que Perl ou Python, mais similaire. Pour un résumé et des tendances communes, voir: Emacs Regex.
Pour ouvrir les tampons, c'est ce que je fais :
M-X Dired
, et t pour sélectionner tous les fichiers, etQ
à une requête de remplacement de texte dans chacun d'eux.Vous pouvez développer un sous-répertoire à l'aide de la
i
commande avant le query-replace.Ils touche info, je suis en ajoutant que si vous donnez un préfixe (contrôle-u) à la commande,
il vous invite arg, et l'argument-R sera de développer de manière récurrente tous les
subdirs
dans le
dired
tampon. Alors maintenant, vous pouvez faire une requête de recherche tous les fichiers dans un répertoire entier.Une autre option est d'utiliser Les glaçons de recherche. C'est un genre différent de l'accroissement de la recherche qui utilise l'achèvement de votre minibuffer d'entrée à l'encontre des résultats de recherche. Comme vous modifiez votre entrée de courant de l'ensemble de la correspondance de frappe est mis à jour dans le tampon
*Completions*
.Vous pouvez rechercher n'importe quel nombre de fichiers, des tampons, ou signet endroits que vous pouvez choisir à l'aide de minibuffer modèle (par exemple regexp) correspondant.
Lorsque vous visitez un résultat de recherche, vous pouvez remplacer sur la demande, soit l'ensemble de frapper ou juste la partie qui correspond à votre minibuffer d'entrée. Remplacement sur demande cela signifie que vous n'êtes pas interrogé sur chaque recherche touché à son tour; vous accédez à la frappe que vous voulez directement, dans n'importe quel ordre. Cette approche peut être plus efficace que la requête remplacez-les si vous avez un nombre limité de remplacements à faire: vous passez la exhaustive
y/n
invite.Recherche est terminée recherche contextes que vous définissez -- vous n'êtes pas limité à la recherche de la totalité du texte dans les fichiers cibles (par exemple, vous pouvez passer des commentaires ou des types particuliers de sections de programme). Un exemple simple d'un contexte de recherche est une ligne, comme dans
grep
, mais un contexte peut être de n'importe quel motif appariés bloc de texte que vous le souhaitez. En général, vous définissez la recherche de contextes à l'aide d'une expression régulière, mais vous pouvez à la place utiliser une fonction. En plus de définir votre propre, il y a prédéfini des Glaçons commandes de recherche pour différents types de contextes: des blocs de texte propriétés ou propriétés de superposition, chose-à-point des choses, etc.Vous pouvez également sorte les résultats de recherche dans les divers ordres de tri pour faciliter l'accès et de navigation.
find-name-dired
est OK, mais:find-dired
est plus souple à cet égard, mais elle aussi est faite pour l'utilisation de règles générales (même si elles peuvent être arbitrairement complexe). Et bien sûrfind
a son propre langage complexe.find(-name)-dired
de la mémoire tampon, vous devez soit la marque ou de les supprimer/omettre les lignes de ceux que vous ne voulez pas d'agir sur.Une alternative est d'utiliser Dired+ des commandes qui agissent sur (a) les fichiers marqués et (b) tous les fichiers marqués (ou tous les fichiers, si aucune n'est indiquée) dans le marqué les sous-répertoires ... trouvé de manière récursive. Cela vous donne à la fois la généralité et la facilité de contrôle sur le choix du fichier. Ces "ici-et-ci-dessous" les commandes sont toutes sur le préfixe de la clé
M-+
en mode Dired.Par exemple,
M-+ Q
est le même queQ
--- query-replace, mais les fichiers cibles sont tous ceux qui sont marqués dans le répertoire courant et dans tout marqué de sous-dossiers, bas, bas, bas...Oui, une alternative à l'utilisation de tel ici et ci-dessous commandes insérer tous les sous-dossiers et leurs sous-dossiers, de manière récursive, et ensuite utiliser un haut-niveau de la commande telle que
Q
. Mais souvent, il peut être opportun de ne pas s'embêter avec insérée sous-dossiers.Et de faire que vous avez quand même besoin d'un moyen rapide pour insérer tous ces sous-dossiers de manière récursive. Ici aussi, Dired+ peut vous aider.
M-+ M-i
insère tous marqués sous-dossiers et leurs propres marqué sous-dossiers, de manière récursive. C'est elle, c'est commeM-i
(qui insère la nette sous-dossiers dans Dired+), mais il agit de manière récursive sur les sous-dossiers.(Tous ces "ici-et-ci-dessous" Dired+ les commandes sont sur menu Plusieurs > Marqué Ici et ci-Dessous.)
Vous pouvez également effectuer Dired opérations sur Emacs fileset, laquelle est enregistré un ensemble de noms de fichiers situés n'importe où. Et si vous utilisez Glaçons ensuite, vous pouvez ouvrir un Dired tampon pour seulement les fichiers dans un fileset ou d'autres types de fichier enregistré listes.
Vous pouvez également signet tout Dired mémoire tampon, y compris celui que vous créez à l'aide de
find(-name)-dired
. Cela vous donne un moyen rapide pour revenir à un tel ensemble (par exemple, un projet de jeu) plus tard. Et si vous utilisez Signet+ puis marquer une Dired tampon dossiers (a) sonls
commutateurs, (b) les fichiers qui sont marqués, (c) qui les sous-répertoires sont insérés, et (d) qui les sous-répertoires sont cachés. Tout cela est restauré lorsque vous "sauter" vers le signet. Signet+ vous permet également de signet de toute une arborescence de Dired tampons --- saut à l'signet restaure tous les tampons de l'arbre.Je voudrais suggérer un plus grand outil qui n'a pas encore été mentionnés, à savoir Barre.
C'est un grand remplacement pour de nombreux standard Emacs opérations impliquant l'achèvement, à la recherche etc. En particulier,
helm-find-files
permet d'effectuer une requête de remplacement (y compris les regexp) au sein de plusieurs fichiers sélectionnés.Il suffit d'ouvrir
helm-find-files
, sélectionnez les fichiers avecM-SPC
et ensuite utiliserF6
ouF7
pour exécuter une requête de remplacement ou une requête de remplacement de regexp dans les fichiers sélectionnés.helm-find-files
marque par regexp au lieu deM-SPC
?Ce n'est pas Emacs, mais xxdiff est livré avec un outil appelé xx-renommer qui va le faire pour plusieurs chaînes en même temps (par exemple à Partir de À partir de à PARTIR de À), avec interactif invitant, enregistrer des copies de sauvegarde de tous les fichiers modifiés, et de produire un court journal des modifications apportées avec le contexte. C'est ce que j'ai tendance à utiliser quand je fais de gros/global renommages.