Remplacement de requête Emacs par transformation textuelle
Question
Je veux trouver n'importe quel texte dans un fichier qui correspond à une expression rationnelle du formulaire t[A-Z]
toi (c'est-à-dire une correspondance t suivi d'une lettre majuscule et d'une autre correspondance toi, et transformez le texte correspondant pour que la lettre majuscule soit en minuscule.Par exemple, pour l'expression rationnelle x[A-Z]y
xAy
devient
xay
et
xZy
devient
xzy
Emacs' query-replace
la fonction permet les références arrière, mais AFAIK pas la transformation du texte correspondant.Existe-t-il une fonction intégrée qui fait cela ?Quelqu'un a-t-il une courte fonction Elisp que je pourrais utiliser ?
MISE À JOUR
@Marcel Levy l'a : \,
dans une expression de remplacement introduit une expression Elisp (arbitraire ?).Par exemple, la solution à ce qui précède est
M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z
La solution
On dirait Steve Yegge en fait, j'ai déjà posté la réponse à cette question il y a quelques années : "Brillant et neuf :Emacs 22." Faites défiler jusqu'à "Changement de casse dans les chaînes de remplacement" et vous verrez son exemple de code utilisant le replace-regexp
fonction.
La réponse générale est que vous utilisez "\" pour appeler n'importe quelle expression Lisp dans le cadre de la chaîne de remplacement, comme dans \,(capitalize \1)
.En lisant le texte d'aide, il semble que ce soit uniquement en mode interactif, mais cela semble être le seul endroit où cela serait le plus nécessaire.
Autres conseils
Une alternative à qrr dans ce cas consiste à enregistrer une macro et à la rejouer.(isearch-forward-regexp, sélectionnez le caractère, downcase-regexp.) Je trouve les macros à la volée plus faciles, car vous obtenez un retour immédiat si votre expression rationnelle est fausse.
Je ferais également cela avec une macro, mais uniquement parce que l'exécution de code à partir d'une chaîne de remplacement pour une expression régulière m'est très peu intuitive.Si vous écrivez un script batch ou quelque chose qui doit aller très vite, \ est certainement la voie à suivre.