Emacs - Использование выполнения-замены со счетчиком - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь написать команду в elisp, чтобы автоматически перенумеровать юнит-тесты в заданном файле.Чтобы помочь мне легко найти неудачные тесты, я обычно использую следующий синтаксис (используя GoogleTest):

TEST (testCaseName, T0XX_Test_Description)

Я смогнаписать рабочую команду, используя цикл while с повторным поиском-пересылкой / заменой-соответствием:

(defun renumber-tests-auto(&optional num)
 "Automatically renumber the tests from the current location in
 the active buffer. Optional argument sets the current test
 number (instead of 1).  This function automatically updates
 all test numbers from the current location until the end of
 the buffer without querying the user for each test."

  (interactive "NStarting test number: ")
  (save-excursion
  (setq num (or num 1 ))
  (while (re-search-forward ", +T0[0-9]+" nil t )
    (replace-match
      (concat ", T" (format "%03d" num )))
    (setq num (+ 1 num))
    )
  )
)

Однако я бы также хотел иметь интерактивную версию этой функции с использованием execute-replaceинтерактивно запрашивать пользователя для каждого теста.Конечно, я мог бы просто обработать запрос в своем коде вручную, однако, учитывая, что эта функциональность уже присутствует, я не хочу, чтобы она была реализована заново.Кроме того, я хотел бы убедиться, что эта команда имеет тот же интерфейс, что и другие встроенные функции замены запросов.

Моя последняя неудачная попытка следующая:

(defun renumber-tests(&optional num)
  (interactive "NStarting test number: ")
  (save-excursion
    (setq num (or num 1 ))
    (perform-replace ", +T0[0-9]+"
                 (concat ", T" (format "%03d" (+ 1 num )
                                   ))
                 t t nil)
  )
)

Однако этане обновляет значение num каждый раз, когда он запускается (я также пытался (setq num (+ 1 num)) и получал тот же результат.

Я был бы очень признателен за помощь от тех, кто более опытен в elisp- если есть какой-то способ заставить его работать так, как я собираюсь.

1 Ответ

0 голосов
/ 19 мая 2018

Вы звоните perform-replace с string в качестве текста замены.Вы должны предоставить функцию замены для выполнения динамической замены.Цитата из документации:

REPLACEMENTS - это либо строка, список строк, либо cons-ячейка, содержащая функцию и ее первый аргумент.Функция вызывается для генерации каждой замены следующим образом: (funcall (замены автомобилей) (замены cdr) replace-count). Она должна возвращать строку.

Таким образом, вы также можете избавиться от мутации:

(defun renumber-tests(&optional num)
  (interactive "NStarting test number: ")
  (save-excursion
    (perform-replace ", +T0[0-9]+"
             (list (lambda (replacement replace-count)
                 (concat ", T" (format "%03d" (+ replace-count (or num 1))))))
             t t nil)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...