Отменить интерактивную функцию с помощью совета
Как я могу переопределить интерактивный ввод с defadvice
в элиспе?
Например, я пытаюсь остановить ansi-term
от запроса на ввод со следующим:
(defadvice ansi-term (around kill-interactive activate)
(let ((explicit-shell-file-name "/bin/bash"))
(ad-set-arg 0 explicit-shell-file-name)
(deactivate-input-method)
ad-do-it))
Но это все еще подсказывает, хотя explicit-shell-file-name
установлен правильно.
1 ответ
Функция все еще имеет свой оригинальный interactive
объявление, поэтому, если вы вызываете его в интерактивном режиме, он будет использовать его для получения значений аргумента.
Вы можете заменить interactive
Форма, включив его в свой совет. например:
(defadvice ansi-term (around kill-interactive activate)
(interactive (list "/bin/bash" nil))
ad-do-it)
И действительно, это именно то, где вы должны установить значение аргумента, если используете такой совет, иначе вы забьете PROGRAM
значение для неинтерактивного использования ansi-term, что явно не то, что вы хотите здесь!
Лично я бы этого не сделал. Я бы определил новую команду-оболочку и вместо этого вызвал бы ее:
(defun bash ()
"Run bash inside `ansi-term'."
(interactive)
(ansi-term "/bin/bash"))
Если у вас есть какие-либо сочетания клавиш для ansi-term
затем вы можете переназначить их так:
(global-set-key [remap ansi-term] 'bash)