Как выполнить запрос-замену с учетом регистра?


15

Когда я делаю, M-x query-replaceчтобы заменить все вхождения vна w, то это также совпадает V(в верхнем регистре V). Как заставить emacs найти только строчные буквы v?


«Без учета регистра» - это поведение по умолчанию, где регистр не имеет значения при поиске. Если вы хотите сопоставить только один регистр, то вы должны учитывать регистр. (Я тоже могу что-то пропустить, не стесняйтесь откатить редактирование при необходимости)
Т. Веррон

@ T.Verron Теперь я уверен, ты прав.
Имя

Ответы:


13
(customize-set-variable case-fold-search  nil)

Или свяжите эту переменную (опцию) в вашей собственной команде, которая в противном случае является просто оболочкой query-replace. Преимущество этого заключается в том, что он не изменяет значение переменной для общего использования, за исключением замены запросов.

Смотрите также переменную case-replace, которая контролирует регистр для текста замены.

Смотрите также C-h f query-replace, где написано, например:

Соответствие не зависит от регистра, если case-fold-searchоно не равно нулю и FROM-STRING не имеет заглавных букв. Замена переводит шаблон регистра старого текста в новый, если case-replaceи case-fold-searchне ноль, а FROM-STRING не имеет верхнего регистра.

Смотрите также комментарии ниже и Emacs bug # 20687 , где показано, как вы можете вносить исправления, perform-replaceчтобы позволить вам переключать сворачивание регистров во время query-replace.


Также обратите внимание, что существующий код для perform-replaceпривязок case-fold-searchтаким образом (обратите внимание на переменные, от которых он зависит):

(case-fold-search  (if (and case-fold-search search-upper-case)
                       (isearch-no-upper-case-p from-string regexp-flag)
                     case-fold-search))

Было бы неплохо изменить case-fold-searchна лету, как мы можем сделать во время isearchиспользования M-cпривязки. Но, к сожалению query-replace, есть своя карта режимов.
Каушал Моди

2
@kaushalmodi: Обычно это было бы так же просто, как добавить привязку ключа для query-replace-map: (defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search)))и (define-key query-replace-map "C" 'toggle-case). Но обработка ключей на этой карте жестко запрограммирована perform-replace. Возможно, вы захотите M-x report-emacs-bug, чтобы perform-replaceкод был более открытым, чтобы ключи можно было добавлять на карту. По крайней мере, в нем должно быть резервное предложение, которое просто вызывает cmd, связанный с ключом.
Дрю

Благодарность! Не уверен, почему я не нашел query-replace-mapраньше.
Каушал Моди

1
Я подал отчет об ошибке сейчас (# 20687 ). Решение в этом отчете об ошибке: просто измените, perform-replaceчтобы добавить дополнительное condпредложение, которое вызывает ключ, который вы определили query-replace-map. Поместите новое предложение непосредственно перед tпредложением всеобъемлющего. Это новый раздел: (def (call-interactively def)). Не может быть проще.
Дрю

(customize-set-variable case-fold-search nil)выдает ошибку customize-set-variable: Attempt to set a constant symbol: nil. Также я пробовал и то (setq case-fold-search nil)и другое, (setq case-replace nil)но запрос все еще соответствует заглавной букве V.
Имя
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.