Это общее решение для любой команды, в которой вы хотите изменить значение аргумента префикса (по крайней мере, для команд, которые интерпретируют свои префиксные аргументы как логические).
(defun foo (&optional arg)
"Do something. Do something else with prefix ARG."
(interactive "P")
(if arg
(message "something else")
(message "something")))
(defun anti-foo (&optional arg)
"Like `foo', but with opposite behavior w.r.t. ARG."
(interactive "P")
(if arg
(foo nil)
(foo '(4))))
Если вы просто хотите заменить функцию (может или не может быть хорошо, смотри ниже), вы можете использовать совет:
(advice-add 'foo
:around
(lambda (orig &rest args)
"Reverse sense of prefix arg."
(let ((arg (car args)))
(if arg
(setq args (cons nil (cdr args)))
(setq args (cons '(4) (cdr args))))
(apply orig args))))
Если функция только конечный пользователь функции, вероятно, хорошо использовать совет по нему (скрыть источник руля, helm-grep-do-git-grep
, вероятно, ОК, чтобы посоветовать). Если функция используется другими функциями, советы могут привести к неправильной работе зависимых функций (потому что вы эффективно изменяете определение рекомендуемой функции).
стороны: Если вы не знакомы с аргументами префиксов Emacs, в nil
используется без префикса, '(4)
используется для одного префикса, '(16)
используется для двойного префикса, и так далее.