Отменить интерактивную функцию с помощью совета

Как я могу переопределить интерактивный ввод с 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)
Другие вопросы по тегам