Интерактивная функция Emacs Lisp для обмена двумя словами друг с другом - PullRequest
5 голосов
/ 20 апреля 2009

Мой первый набег в причудливый мир emacs lisp - это функция, которая берет две строки и заменяет их друг другом:

(defun swap-strings (a b)
  "Replace all occurances of a with b and vice versa"
  (interactive "*sFirst Swap Word: \nsSecond Swap Word: ")
  (save-excursion
    (while (re-search-forward (concat a "\\|" b) nil t)
      (if (equal (match-string 0) a)
      (replace-match b)
    (replace-match a)))))

Это работает - но я застрял на следующем:

  • как запрашивать подтверждение у пользователя перед каждой заменой? (Я не могу заставить perform-replace работать)
  • как экранировать строки a и b, чтобы они не интерпретировались как регулярные выражения, если они содержат какие-либо символы регулярного выражения?

Редактировать: последний код для вставки, который я использовал в течение некоторого времени:

(defun swap-words (a b)
  "Replace all occurances of a with b and vice versa"
  (interactive "*sFirst Swap Word: \nsSecond Swap Word: ")
  (save-excursion
    (while (re-search-forward (concat (regexp-quote a) "\\|" (regexp-quote b)))
      (if (y-or-n-p "Swap?") 
      (if (equal (match-string 0) a)
          (replace-match (regexp-quote b))
        (replace-match (regexp-quote a))))
      )))

К сожалению, он не выделяет предстоящие совпадения на странице, как это делает I-search.

Ответы [ 2 ]

3 голосов
/ 20 апреля 2009

Используйте y-or-n-p для первого: (when (y-or-n-p "Swap?") do stuff

А regexp-quote для второго: (regexp-quote your-string)

1 голос
/ 20 апреля 2009

regexp-quote является уже упомянутым .

Что касается подтверждения, если вы хотите спросить пользователя перед каждой заменой, вы можете выбрать query-replace-regexp, который делает именно то, что вы хотите.

(И вы все еще можете иметь дело со встроенными в Emacs функциями передачи .)

...