2010-12-01 31 views
4
remplacer

J'ai un tas de macros C dans des fichiers, des trucs comme NEXT(pL) qui est étendu à ((pL) -> next)groupes Emacs regexp dans regex-

Je veux enlever la plupart d'entre eux parce qu'ils sont inutiles.

Ce que je voudrais faire, c'est obtenir le texte entre parenthèses dans la macro, pL. Je veux que l'expression regexp de remplacement utilise ce texte pour la réécriture. Par exemple, en Perl que je pouvais faire quelque chose comme /NEXT\(\s*(.+)\s*) (peut-être un peu incorrect) et puis quelque chose de sortie comme $1->next, qui devrait tourner une ligne

if (NEXT(pL) != NULL) { 

dans

if (pL->next != NULL) { 

Dans Emacs, je voudrais aime utiliser des groupes de correspondance dans un emacs replace-regexp sur une base fichier par fichier. Je ne suis pas entièrement sûr de savoir comment faire cela dans Emacs.

+0

'M-x c-macro-expansion' ou' M-x c-macro-expand' pourrait être utilisé. Mais ce que vous demandez semble avoir besoin d'une nouvelle fonction autour du 'M-x c-macro-expansion' pour travailler sur un fichier entier ou un tampon. – vpit3833

+0

c-macro-expand ne connaît pas les macros? Ils sont situés dans un fichier/tampon séparé. – Kizaru

Répondre

12
M-x query-replace-regexp NEXT(\([^)]+\)) RET \1->next RET 

qui peut être fait dans une fonction comme si (à appliquer à un tampon ensemble)

(defun expand-next() 
    "interactive" 
    (goto-char (point-min)) 
    (while (re-search-forward "\\<NEXT(\\([^\)]+\\))" nil t) 
    (replace-match "\\1->next"))) 

Et, pour l'appliquer à plusieurs fichiers, vous pouvez marquer les fichiers dans Dired and type Q to do a query-replace-regexp on all the marked files (utilisez le regexp/remplacement dans la première ligne de cette réponse).

+0

J'apprécie la réponse. J'ai aussi reçu une réponse très utile du canal IRC d'emacs. – Kizaru

+0

Je suis en train de draguer de la vieille boue ici plutôt que de soumettre une nouvelle question puisque c'est le bon sujet ... J'utilise Emacs 23.1. Lorsque j'utilise \ 1 comme remplacement, j'obtiens "Aucune correspondance trouvée". J'utilise la même expression rationnelle construite à partir de regexp-builder qui correspond correctement au texte trouvé. Des idées?? – Daniel