Группы регулярных выражений Emacs в regex-replace - PullRequest
4 голосов
/ 02 декабря 2010

У меня есть куча макросов C в файлах, вроде NEXT( pL ), который расширен до ( ( pL ) -> next )

Я хочу удалить большинство из них, потому что они не нужны.

Что я хотел бы сделать, так это получить текст внутри скобок в макросе pL.Я хочу, чтобы заменяющее регулярное выражение использовало этот текст для переписывания.Например, в Perl я мог сделать что-то вроде /NEXT\(\s*(.+)\s*) (может быть немного некорректно) и затем вывести что-то вроде $1->next, что должно превратить строку

if ( NEXT( pL ) != NULL ) { 

в

if ( pL->next != NULL ) {

В Emacs я хотел бы использовать группы совпадений в emacs replace-regexp для каждого файла отдельно.Я не совсем уверен, как это сделать в Emacs.

1 Ответ

12 голосов
/ 02 декабря 2010
M-x query-replace-regexp NEXT(\([^)]+\)) RET \1->next RET

Что можно сделать внутри такой функции (чтобы применить ее ко всему буферу)

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

И, чтобы применить это к нескольким файлам, вы можете пометить файлы в Dired и наберите Q , чтобы сделать query-replace-regexp для всех отмеченных файлов (используйте регулярное выражение / замена в первой строке этого ответа).

...