Замена у вас хорошо работает для меня.
Возьми текст:
hi there mom
hi son!
и попробуйте query-replace-regexp с вашим советом:
M-x query-replace-regexp (hi).*(mom) RET \1 \2! RET
выходы
hi mom!
hi son!
Мне не нужно было ставить обратную косую черту перед скобками, чтобы привести их в группу. Тем не менее, это отключает возможность совпадения с фактическими скобками ...
Причина, по которой replace-regexp-in-string
приводит к \\(abc
, заключается в том, что строка эквивалентна интерактивному типу \(abc
. В строке \
используется для обозначения того, что следующий символ является специальным, например, "\t"
- строка с вкладкой. Таким образом, чтобы указать только обратную косую черту, перед ней необходимо использовать обратную косую черту "\\"
- строка, содержащая обратную косую черту.
Что касается рекомендаций по интерактивным функциям, код lisp может вызывать интерактивные функции по своему усмотрению. Ярким примером является find-file
- который вызывается повсюду. Чтобы сделать ваш совет немного более безопасным, вы можете обернуть тело чеком на interactive-p
, чтобы избежать путаницы при внутренних вызовах:
(defadvice query-replace-regexp (before my-query-replace-regexp activate)
(when (interactive-p)
(ad-set-arg 0 (replace-regexp-in-string "(" "\\\\(" (ad-get-arg 0)))
(ad-set-arg 0 (replace-regexp-in-string ")" "\\\\)" (ad-get-arg 0)))))