2016-10-07 3 views
0

Как я могу переопределить интерактивный ввод с помощью defadvice в elisp?Переопределить интерактивную функцию с помощью совета

Например, я пытаюсь остановить 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 установлен правильно.

ответ

2

Функция все еще имеет свое первоначальное объявление interactive, поэтому, если вы вызываете ее в интерактивном режиме, она будет использовать ее для получения значений аргументов.

Вы можете заменить форму interactive, введя это в своем совете. например:

(defadvice ansi-term (around kill-interactive activate) 
    (interactive (list "/bin/bash" nil)) 
    ad-do-it) 

И действительно, что именно там, где вы должны быть установкой значения аргумента при использовании советов, как это, в противном случае вы затирание значения PROGRAM для неинтерактивного использования AnSi перспективы, а также , что явно не то, что вы хотите здесь!

Лично я бы этого не сделал. Я бы определить новую команду оболочки и вызывать, что вместо того, чтобы:

(defun bash() 
    "Run bash inside `ansi-term'." 
    (interactive) 
    (ansi-term "/bin/bash")) 

Если у вас есть какие-либо сочетание клавиш для ansi-term вы могли бы затем перераспределить их так:

(global-set-key [remap ansi-term] 'bash) 
Смежные вопросы