Определите команду emacs, которая вызывает другую команду emacs (с сохранением интерактивных материалов)

Как я могу определить команду emacs X, которая что-то делает, а затем вызывает другую команду emacs Y, а также копирует интерактивный интерфейс команды Y?

Я хочу определить альтернативную версию query-replace с временно переключаемым значением case-fold-search:

(defun alt-query-replace (a b c d e)
  (interactive)
  (let ((case-fold-search (not case-fold-search))
    (query-replace a b c d e)))

Это не работает. Когда я вызываю alt-query-replace, он говорит «неправильное количество аргументов». Я хочу, чтобы интерактивный интерфейс alt-query-replace был таким же, как и query-replace. Нужно ли проверять исходный код запроса-замены или есть общий подход?


person Yoo    schedule 20.10.2009    source источник


Ответы (2)


Используйте интерактивный вызов:


(defun alt-query-replace ()
  (interactive)
  (let ((case-fold-search (not case-fold-search)))
    (call-interactively 'query-replace)))
person remvee    schedule 20.10.2009
comment
Будет ли этот код волшебным образом передавать все аргументы в query-replace, как если бы он был вызван напрямую? - person Ryan C. Thompson; 05.08.2010

Вы можете посоветовать исходную функцию, если хотите изменить ее поведение вместо вызова отдельной функции.

Из главы 17.3 Around-Advice GNU Emacs Справочное руководство по Лиспу:

Around-advice позволяет вам «обернуть» выражение Лиспа «вокруг» исходного определения функции.

 (defadvice foo (around foo-around)
   "Ignore case in `foo'."
   (let ((case-fold-search t))
     ad-do-it))

В вашем случае вы можете написать:

(defadvice query-replace (around alt-query-replace (from-string to-string &optional delimited start end))
    (let ((case-fold-search (not case-fold-search)))
      ad-do-it))
(ad-activate 'query-replace)
person viam0Zah    schedule 20.10.2009
comment
Я заметил, что люди делают ad-activate отдельно от исходного совета, но вы можете активировать его в исходной строке around alt-query-replace (...) activate. - person Trey Jackson; 21.10.2009