Поменять значения в emacs - PullRequest
       5

Поменять значения в emacs

1 голос
/ 27 февраля 2012

Вот Find-Replace, который меняет значения:

Find: right\|left
Repl: \,(if (equal "right" \&) "left" "right")

Вот попытка преобразовать его в интерактивную функцию:

(defun swaps (rit lft)
  "Swaps rit to lft."
  (interactive "sChange this: 
sTo this: ")
  (save-excursion
    (goto-char (region-beginning))
    (while (search-forward-regexp ("%s\\|%s" rit lft) nil t) 
      (replace-match (if (equal rit \\&) lft rit) t nil))))

Я также пытался rit\\|lft и rit\|lftвместо ("%s\\|%s" rit lft) ...

Редактировать :

Ответ:

(defun swaps (rit lft)
  "Swaps rit to lft."
  (interactive "sChange this: 
sTo this: ")
  (save-excursion
    (goto-char (region-beginning))
    (while  (search-forward-regexp (format "%s\\|%s" 
                                          (regexp-quote rit)
                                          (regexp-quote lft)) (region-end) t) 
      (replace-match (if (equal rit (match-string 0)) lft rit) t nil))))

1 Ответ

5 голосов
/ 27 февраля 2012

("%s\\|%s" rit lft) не является допустимым выражением Lisp: когда оно вычисляется, Emacs будет жаловаться, что "%s\\|%s" не является функцией.Вы, вероятно, хотите сделать

 (format "%s\\|%s" rit lft)

, и было бы лучше использовать regexp-quote, если ваши строки содержат специальные символы регулярного выражения:

(format "%s\\|%s" 
        (regexp-quote rit)
        (regexp-quote lft))

В качестве альтернативы, вы также можете использовать *Функция 1010 *, которая создает эффективное регулярное выражение для сопоставления любой из списка строк:

(regexp-opt (list rit lft))

\\& представляет только совпадающую строку в аргументе замены для replace-regexp, replace-match и аналогичныхфункции.В другом коде на Лиспе вам нужно использовать (match-string 0).

Наконец, если вы хотите, чтобы это работало только в регионе, вам, вероятно, следует указать (region-end) в качестве второго аргумента для search-forward-regexp.

...