artscan ответил на свой вопрос работоспособным ответом, но он немного неполон и вводит в заблуждение. Сюда также входит 'interactive
, который можно сбивает с толку само по себе - похоже, что он определен внутри тела команды, но на самом деле используется до ввода функции - и до выполнения любого совета (если этот совет не имеет 'interactive
звонки ...)
В документации для советов отсутствует ряд подробности, которые могут помочь в этой ситуации, поэтому лучше всего искать источник: _ 3_. Посмотрите на это и найдите раздел комментариев @ Foo games: An advice tutorial
. Вы также можете найти исходный код в самом Emacs с помощью M-x find-library advice RET.
В частности, для решения этой проблемы посмотрите раздел в advice.el
, помеченный @@ Advising interactive behavior:
- потому что это именно то, что вы пытаетесь сделать.
Если вы внимательно его прочитаете, то заметите, что совет не обязательно должен иметь форму around
, но также может быть before
, а может быть after
- хотя это просто напрашивается на неприятности. Это потому, что interactive
обрабатывается (и требует) особого обращения.
Итак, следующий код работает (обратите внимание на before
):
(defadvice find-dired (before eab-find-dired (dir args) activate)
"ignore find-args, hard code \"-iname '**'\""
(interactive
(list (read-directory-name "Run find in directory: " nil "" t)
(read-string "Run find (with args): " '("-iname '**'" . 10)
'(find-args-history . 1)))))
Вероятно, более чистый способ сделать это, как предлагали другие, - написать свою собственную функцию, и я думаю, что самый простой - это Lindydancer ' s ответ.
Совет - довольно заманчивый инструмент, но им легко злоупотреблять. Я бы не стал говорить, что это опасно, но его следует использовать с осторожностью. Кажется, лучше всего использовать, когда написание вашей собственной функции не работает - например, изменение поведения функции, вызываемой кодом, который вы не можете изменить. Думаю, хорошие примеры этой ситуации можно найти здесь, здесь и здесь (чтобы услышать мой собственный рог).
person
Trey Jackson
schedule
30.01.2013
defadvice
устарел, и теперь вы должны использоватьadd-function
,add-advice
(и их сопутствующие функции) - person ocodo   schedule 07.11.2015