2010-05-12 6 views
2

question que le titre.Comment remplacer « (» avec « (» dans l'expression rationnelle, Emacs/saveur elisp?

Plus précisément, je suis un peu fatigué d'avoir à taper \(, etc. chaque fois que je veulent une parenthèse dans les fonctions (interactive) regexp d'Emacs (sans parler de la \\( dans le code). donc, je l'ai écrit quelque chose comme

(defadvice query-replace-regexp (before my-query-replace-regexp activate) 
    (ad-set-arg 0 (replace-regexp-in-string "(" "\\\\(" (ad-get-arg 0))) 
    (ad-set-arg 0 (replace-regexp-in-string ")" "\\\\)" (ad-get-arg 0))))) 

dans l'espoir que je peux facilement oublier idiosyncrasie emacs dans regexp pendant « mode d'interaction ». Sauf que je ne peux pas obtenir l'expression rationnelle droite ...

(replace-regexp-in-string "(" "\\\\(" "(abc") 

donne \\(abc au lieu du \(abc recherché. D'autres variations sur le nombre de barres obliques donnent juste des erreurs. Pensées? Depuis que j'ai commencé à poser des questions, je pourrais en demander une autre: puisque le code Lisp n'est pas censé utiliser les fonctions interactives, le fait de recommander query-replace-regexp devrait être correct, ai-je raison?

+1

On ne sait pas ce que vous essayez de faire. Un littéral '(' correspond à lui-même. '\\ (' démarre une capture lorsque vous n'êtes pas dans une chaîne entre guillemets. \\\ ('démarre une capture lorsque vous êtes dans une chaîne entre guillemets doubles. confus, juste différent de, disons, perl qui analyse les expressions rationnelles différemment des chaînes entre guillemets doubles.Utilisez 'rx' si cela vous dérange vraiment De plus, le code Lisp peut appeler des fonctions interactives. – jrockway

+0

@jrockway: J'utilise beaucoup plus l'expression groupée que d'essayer de faire correspondre de vraies parenthèses, et devoir taper \\ (quelque chose \\) tout le temps est fatiguant. Je sais que cela nécessite de citer la parenthèse - mais pas étonnamment donné la quantité de parenthèses en Lisp – polyglot

Répondre

7

Le remplacement que vous avez fonctionne bien pour moi.

Prenez le texte:

hi there mom 
hi son! 

et essayez requête remplacer-regexp avec votre conseil:

M-x query-replace-regexp (hi).*(mom) RET \1 \2! RET 

donne

hi mom! 
hi son! 

Je ne devais pas mettre une barre oblique inverse devant les parenthèses pour les amener au groupe. Cela dit, cela désactive pouvoir correspondre entre parenthèses réelles ...

La raison pour laquelle les rendements replace-regexp-in-string\\(abc, est que comme une chaîne , qui équivaut à une dactylographiées interactive \(abc. Dans une chaîne \ est utilisé pour indiquer que le caractère suivant est spécial, par ex. "\t" est une chaîne avec une tabulation. Ainsi, afin de spécifier juste une barre oblique inverse, vous devez utiliser une barre oblique inverse en face de lui "\\" est une chaîne contenant une barre oblique inverse. En ce qui concerne les fonctions interactives de conseil, le code Lisp peut appeler des fonctions interactives tout ce qu'il veut. Un bon exemple est find-file - qui est appelé partout. Pour faire vos conseils un peu plus sûr, vous pouvez envelopper le corps avec un chèque de interactive-p pour éviter ébouriffant avec appels internes:

(defadvice query-replace-regexp (before my-query-replace-regexp activate) 
    (when (interactive-p) 
    (ad-set-arg 0 (replace-regexp-in-string "(" "\\\\(" (ad-get-arg 0))) 
    (ad-set-arg 0 (replace-regexp-in-string ")" "\\\\)" (ad-get-arg 0))))) 
+0

Merci pour la partie (interactive-p).Je pense que j'ai été confus par le tampon de travail et j'ai oublié qu'il renvoie la chaîne correctement échappée. – polyglot

Questions connexes