Rechercher et remplacer via un projet multifichier dans AUCTeX?

8

Je suis sur le point d'adopter Emacs pour être le seul éditeur que j'utilise dans tout ce que j'écris, y compris les documents LaTeX. Je venais de l'éditeur WYSIWYG qui servait cet objectif assez bien, à savoir TexStudio ou TXS pour faire court. Pour la transition de TXS à Emacs, il me manque encore la façon dont TXS traite de l'exécution de la recherche de requête regexp massive et remplace par la mise en évidence des correspondances et de la restriction de la recherche aux seuls .texfichiers liés au projet . Cela me manque profondément dans Emacs maintenant. Voir une capture d'écran de TXS ci-dessous:

Requête TeXStudio dans un projet LaTeX multifichier entrez la description de l'image ici

Je voudrais souligner les points du workflow à réaliser dans Emacs:

  1. Recherche et remplacement de requêtes RegExp uniquement dans les .texfichiers liés au projet .
  2. Mettre en évidence les matchs
  3. Un aperçu des résultats mis en surbrillance tous ensemble dans une mise en page gérable (similaire à la vue du journal Magitdans Emacs lorsque vous appuyez sur lsuivi par un autre lou tout simplement comme C-x den mode Dired
  4. Comment savoir combien de correspondances de remplacement ou d'inspection ont été effectuées avec ou restantes et un moyen de reprendre la requête au cas où elle serait interrompue par une frappe maladroite qui arrête la requête
  5. Un moyen propre de sortir de cette requête compliquée en fermant et en enregistrant tous les fichiers associés et en revenant à l'état avant d'appeler cette requête

J'ai lu ce post mais mon intention est d'être plus comme CWça n'importe qui peut partager son meilleur workflow pour faire ce travail commun. Ma ou mes approches actuelles comme suit:

Premier workflow

  1. Le mode fatigué % gmarquera tous les fichiers contenant cette expression régulière. Inconvénients: cela inclura même un fichier sans rapport avec le projet, y compris des fichiers non .tex.
  2. C-x 3 ouvre un nouveau tampon tout en gardant un œil sur le premier tampon comme aperçu de l'orientation des fichiers marqués que je dois interroger individuellement dans le nouveau tampon
  3. Exécution de la requête par C-c q. Il a de très bons commutateurs comme !remplacer tout sans demander de surligner les correspondances dans le fichier ouvert. Mais cela signifie que je dois exécuter la même requête à chaque fois et pour chaque fichier marqué.
  4. Après avoir fait tous les fichiers marqués, je frappe C-x s !pour tout enregistrer en une seule touche. Phew!

entrez la description de l'image ici

Deuxième workflow - préféré

  • Marquer tous les .texfichiers à l'aide % mdu mode Dired par regexp afin de ne marquer que les .texfichiers, donc en gros \.tex, m'y amènera.
  • C-x 3 comme ci-dessus pour conserver un tampon pour la vue d'ensemble et l'autre pour la requête
  • L'exécution Qdans Dired qui est une requête remplace l'expression régulière dans les fichiers marqués uniquement. Alternativement, il As'agit uniquement d'une requête de recherche d'expression régulière. Une requête complète sera exécutée et un menu d'aide par ?généreusement fourni
  • C-x s !enregistrer et fermer tout le gâchis. Sinon, j'ai dû fermer les fichiers ouverts un par un, ce qui est fastidieux. J'espère qu'il existe un moyen de fermer uniquement ceux que nous avons dérangés.

entrez la description de l'image ici

Comment estimer la requête de recherche / remplacement d'expressions rationnelles de TXS dans plusieurs fichiers?

Remarque

  • Emacs 24.4 sur Windows 7
doctorat
la source
Cette question fait actuellement l'objet d'un vote "serré" car elle est trop large, ce avec quoi je suis d'accord. Pourriez-vous s'il vous plaît restreindre la question à une version plus discrète (peut-être dans le sens de "comment puis-je approximer la recherche de requête regexp de TeXStudio dans plusieurs fichiers")? "Quel est votre meilleur workflow?" est très large et est susceptible de donner des réponses longues et basées sur l'opinion.
Dan
Je ne peux pas écrire de réponse complète pour le moment, mais vous devriez regarder wgrep.
Malabarba
@Malabarba, veuillez envisager de mettre à jour votre commentaire en réponse si vous pensez que cela répondra aux critères mentionnés dans le message.
doctorat du

Réponses:

3

Si j'ai bien compris, vous souhaitez rechercher des modèles de texte dans votre projet, vous pouvez alors utiliser Projectile avec Helm.

  • M-x helm-projectile-grep
  • Saisissez un modèle de texte ou un modèle d'expression régulière.
  • Voir les résultats mis à jour pour chaque caractère entré.

Voici une démo de helm-projectile-grep:

helm-projectile-grep

Vous pouvez enregistrer dans un tampon séparé pour vous y référer ultérieurement en utilisant Save results in grep bufferaction` (vous basculez vers le tampon d'action en utilisant TAB, par défaut).

Si vous n'avez pas entendu parler de Helm, vous pouvez lire mon tutoriel Helm . Visitez mon didacticiel Helm Projectile pour plus de démos et de conseils sur Helm Projectile.

Alternativement, vous pouvez également utiliser rgrep, qui est intégré:

  • M-x rgrep
  • Entrez le texte / motif d'expression régulière dans l' Search for:invite, c'est-à-dire "test"
  • Entrez le type de fichier à rechercher Search for "test" in file:, c.-à-d *.tex.
  • Entrez le répertoire pour rechercher récursivement (d'où le nom rgrep).
  • Appuyez RETet voyez les résultats.

Une rgrepdémo:

entrez la description de l'image ici

Concernant vos critères:

  1. Recherche et remplacement de requêtes RegExp uniquement dans les .texfichiers liés au projet .

Helm et rgrepprennent en charge cette fonctionnalité.

  1. Mettre en évidence les matchs

Comme ci-dessus.

  1. Un aperçu des résultats mis en évidence tous ensemble dans une mise en page gérable

Comme ci-dessus.

  1. Comment savoir combien de correspondances de remplacement ou d'inspection ont été effectuées avec ou restantes et un moyen de reprendre la requête au cas où elle serait interrompue par une frappe maladroite qui arrête la requête

Si vous souhaitez remplacer des correspondances, vous pouvez utiliser wgrep pour effectuer le remplacement d'un *Grep*tampon. Une fois que vous avez terminé et synchronisé le *Grep*tampon, tout sera remplacé selon le texte que vous avez remplacé.

Vous "reprenez" en exécutant à nouveau la requête si vous l'arrêtez accidentellement. Mais en utilisant Helm, vous avez une helm-resumecommande qui vous ramène à l'opération précédente en cours si vous l'annulez accidentellement.

  1. Un moyen propre de sortir de cette requête compliquée en fermant et en enregistrant tous les fichiers associés et en revenant à l'état avant d'appeler cette requête

En fait, vous n'avez pas à tuer de tampon si vous utilisez des outils comme helm-mini . La gestion de milliers de tampons ouverts est un jeu d'enfant: vous pouvez vous limiter à vos tampons désirés avec un court modèle de texte. Vous pouvez tuer tout d'un coup si vous le souhaitez.

Voici une démo de helm-mini:

barre-mini

Voir l'explication détaillée dans la page Helm Github, dans la section "Utilisation avancée" .

Tu Do
la source
Je pense que je dois essayer d'étudier le projectile avec la barre. Merci pour vos tutoriels riches en captures d'écran!
doctorat du
quels sont les paquets que je dois installer pour obtenir ces fonctions décentes: projectile, helmet helm-projectileest évident, quoi d' autre? De plus, il y a deux paquets MELPA helm-pojectileet helm projectile-alldes recommandations ici?
doctorat du
Ça suffit déjà. Ensuite, suivez la configuration dans mes guides. Vous devriez vérifier la Installationsection dans mes guides Helm et Helm Projectile.
Tu Do
quelles touches utilisez-vous rgreppour visiter les occurrences de match (avant ou arrière) dans le tampon supérieur et inférieur?
doctorat du
1
ce fut une expérience qui a changé Emacs de rencontrer un pilote et un projectile pilote, merci! Mais, la recherche grep ne fonctionne pas. Pouvez-vous consulter ce post: emacs.stackexchange.com/q/7178/2443
doctorat
5

Si j'ai compris ce que vous vouliez, RefTeX ' reftex-isearch-minor-modedevrait être ce que vous recherchez. D'après sa description dans le manuel:

Basculez un mode mineur qui permet à la recherche incrémentielle de fonctionner globalement sur l'ensemble du document multifichier. Les fichiers seront recherchés dans l'ordre où ils apparaissent dans le document.

Comme indiqué par T. Verron, cela fonctionne également avec les expressions rationnelles.

Pour activer ce mode mineur dans tous les tampons * TeX, ajoutez l'une des lignes suivantes à votre fichier init

(add-hook 'TeX-mode-hook (lambda () (reftex-isearch-minor-mode))) ; for AUCTeX
(add-hook 'tex-mode-hook (lambda () (reftex-isearch-minor-mode))) ; for the Emacs' bultin TeX mode.
giordano
la source
Bon à savoir car j'utilise reftex. Mais comme aucune expression rationnelle n'est prise en charge, je doute que cette approche soit meilleure!
doctorat du
2
Apparemment, en appuyant M-rsur le tampon de recherche, vous basculez vers la recherche d'expression régulière, tout comme pour la recherche régulière isearch.
T. Verron
1
Et le raccourci habituel pour regexp isearch ( C-M-s) fonctionne aussi.
T. Verron
@ T.Verron merci! En fait, je n'ai pas beaucoup utilisé cette fonctionnalité, la dernière fois que je l'ai essayée, la recherche d'expression rationnelle n'a pas fonctionné, qui sait ce que j'ai essayé alors;-)
giordano
@ T.Verron dans la barre de menu -> ref-> actions globales -> rechercher la version et remplacer la version pour le document entier fournit une meilleure expression rationnelle car vous pouvez modifier votre expression dans le mini-tampon, mais je ne sais pas quelle est cette fonction et ce qui est la liaison de touches.
doctorat du
3

Si vous n'êtes pas au courant, vous ne pouvez ouvrir Dired que sur un ensemble particulier de fichiers (situés dans n'importe quel répertoire, n'importe où). IOW, vous pouvez utiliser Dired comme point d'entrée pour tous les fichiers d'un projet. Les fonctionnalités habituelles de Dired fonctionnent dans ce contexte: fonctionnement sur des fichiers marqués, etc.

Si vous utilisez la bibliothèque Bookmark +, vous pouvez avoir des signets Dired que vous utilisez pour vous donner différentes "vues" de différents ensembles de fichiers, leurs marquages, etc.

(Emacs Wiki est en cours de maintenance pour le moment, et pour quelques jours de plus, de sorte que ce lien est temporairement inaccessible.)

A dessiné
la source
Est-ce comme un rétrécissement d'Emacs C-x n n? pouvez-vous enrichir votre réponse avec plus de détails. Merci.
doctorat du
Non; rien à voir avec C-x n n- juste une fonction Dired peu connue. C-h f diredvous indique que vous pouvez passer comme argument une liste (par exemple absolue) de noms de fichiers (et de répertoires) au lieu d'un nom de répertoire. Voilà la clé. La bibliothèque Dired + facilite l'utilisation interactive de cette fonctionnalité. (Mais encore une fois, le wiki est temporairement fermé, donc ce lien n'est pas disponible pour le moment.)
Drew