Emacs Case Sensitive Замените строку

Я просто задал связанный с этим вопрос (вопрос setq), но он отчетливо отличался, поэтому я решил ответить на этот вопрос.

В моем .emacs файле я определяю привязку ключа к команде replace-string:

(define-key global-map "\C-r" 'replace-string)

replace-string выполняет основной поиск и заменяет. Предполагая, что первая буква строки поиска имеет строчные буквы, если case-fold-search - nil, то replace-string выполняет поиск с учетом регистра, в противном случае поиск без учета регистра.

Проблема заключается в том, что case-fold-search управляет "чувствительностью к регистру" как "поиск" (например, команда search-forward), так и "поиск и замена" (например, команда replace-string).

Вопрос заключается в том, как сделать команду JUST командой replace-string (или что-либо связанное с C-r) с учетом регистра, оставив search-forward без учета регистра, как это было по умолчанию.

Возможно, мне нужно установить case-fold-search в nil только для команды replace-string, но я не уверен, как это сделать.

Ответ 1

Поместите это в ваш .emacs:

(defadvice replace-string (around turn-off-case-fold-search)
  (let ((case-fold-search nil))
    ad-do-it))

(ad-activate 'replace-string)

Это то, что вы сказали, установите case-fold-search в nil только для replace-string.

На самом деле это почти точно пример справочного руководства Emacs Lisp.

Ответ 2

Попробуйте этот метод, который не требует совета:

(global-set-key (kbd "C-r") 
    (lambda () 
      (interactive) 
      (let ((case-fold-search nil)) 
        (call-interactively 'replace-string))))