@Malabarba a mentionné l'utilisation du wgrep
paquet pour éditer les résultats grep / ack / ag.
Je voudrais écrire une présentation détaillée de la façon dont j'utilise le ag
package et les wgrep-ag
packages pour réaliser l'édition des résultats «ag» à l'aide du multiple-cursors
package.
Ces packages sont disponibles via Melpa. Vous devez également avoir ag
aka the_silver_searcher installé sur votre système.
Cette procédure pas à pas s'applique aux cas où vous recherchez un moyen d'effectuer des modifications sur une seule ligne à tous les emplacements sélectionnés sélectionnés ag
.
Installez ag
sur votre système et les packages emacs mentionnés ci-dessus.
ag
prend en charge la recherche de fichiers dont le contenu correspond à l'expression régulière spécifiée. La façon la plus simple de savoir ag
où se trouve la racine du projet est d'y placer un .git
dossier vide . Effectuez ensuite la recherche à l'aide de M-x ag-project-regexp
.
Le tampon de résultats de la recherche ag n'est pas modifiable par défaut. Pour le rendre modifiable, utilisez M-x wgrep-change-to-wgrep-mode
ou utilisez la wgrep
liaison -default C-c C-p
.
Maintenant, si vous deviez changer 'abcdef' en 'ghijkl' dans tous vos fichiers, vous rechercheriez 'abcdef' et le tampon de résultats ag affichera toutes les lignes contenant cette chaîne. Ensuite, vous modifiez ce tampon et modifiez ces chaînes manuellement et ces modifications se refléteront dans les tampons de fichier réels lors de l'exécution M-x wgrep-finish-edit
ou de l'utilisation de la liaison par défaut C-c C-e
. Vous pouvez également utiliser query-replace-regexp
pour effectuer cette recherche remplacer.
Je préfère utiliser multiple-cursors
pour une refactorisation rapide afin que je puisse voir un retour en temps réel de l'endroit où mes multiples modifications se produisent simultanément. Mettez en surbrillance la chaîne que vous souhaitez remplacer dans ce tampon de résultats ag et appelez M-x mc/mark-all-like-this
, puis modifiez-la avec admiration lorsque vous voyez des éléments modifiés en plusieurs points en même temps.
Une fois que vous êtes satisfait des modifications, comme je l'ai mentionné ci-dessus, faites C-c C-e
pour "refléter" les changements dans les tampons réels. Les tampons ne sont pas encore enregistrés.
Pour enregistrer tous les tampons, je le fais généralement en une seule fois, en utilisant la C-x s !
liaison par défaut emacs .
Voici un exemple d'utilisation avec des captures d'écran:
Il montre le processus de remplacement de toutes les instances de bind-to-modi-map
to bind-to-my-map
dans my ~/.emacs.d/
.
Lorsque je recherche bind-to-modi-map
dans mon dossier de configuration emacs, j'obtiens le résultat ci-dessous 'ag':
Ce tampon est en lecture seule.
Après M-x wgrep-change-to-wgrep-mode
, je souligne, -modi-map
sélectionnez toutes les instances de cette sélection en utilisant M-x mc/mark-all-like-this
et après avoir édité ces sélections -my-map
, cela ressemble à ci-dessous:
La surbrillance bleue indique les lignes qui seront modifiées lorsque j'appuie sur C-c C-e
.
En frappant C-c C-e
, vous pouvez voir le changement reflété dans le fichier réel dans cette capture d'écran:
Je voudrais ensuite enregistrer tous les fichiers modifiés en utilisant C-x s !
.
Vous n'avez pas besoin de convertir le tampon de résultats grep en quoi que ce soit, il existe déjà un mode spécifiquement pour éditer la sortie grep (et refléter les changements sur les fichiers, bien sûr).
(require 'wgrep)
dans votre fichier init.C-c C-p
et modifiez!C-c C-e
Il fonctionne même avec ack et ag également.
la source
Cette fonctionnalité existe dans projectile (
projectile-replace
). Il utilisera ag / ack / git grep / grep si disponible (dans cet ordre) pour trouver des occurrences ettags-query-replace
pour exécuter le remplacement de requête.la source
M-g n C-x e
(c'est-à-dire, utiliseznext-error
pour faire défiler les occurrences).Voici une autre approche, en utilisant Icicles .
Dans votre
*grep*
tampon de sortie Emacs , appuyez sur Cc `(c'est-à-dire Cc backquote), qui en mode Icicle est lié dans le tampon*grep*
à la commandeicicle-compilation-search
. Cela vous permet de naviguer rapidement parmi les résultats de recherche (lesgrep
résultats) que vous choisissez, dans n'importe quel ordre.L'entrée que vous saisissez dans le mini-tampon filtre dynamiquement (rétrécit) l'ensemble des résultats de recherche, et vous pouvez utiliser l'achèvement progressif pour affiner en faisant correspondre successivement plusieurs modèles (par exemple, sous-chaînes, expressions rationnelles).
Lorsque vous naviguez parmi les résultats de recherche, vous pouvez remplacer n'importe lequel d'entre eux à la demande - soit le résultat complet (ligne) ou uniquement la partie correspondant à votre entrée de mini-tampon actuelle.
Voir Icicles Search - Compile ou Grep . Une introduction à la recherche Icicles est ici , et des informations sur le remplacement des correspondances pendant la recherche Icicles sont ici .
la source
J'utilise cet util que j'ai écrit xah_find.el
Je l'ai écrit parce que:
Cet util elisp est peut-être 5 à 10 fois plus lent que d'appeler unix grep dans emacs, mais il a bien fonctionné pour moi.
la source