Muitos comandos do Emacs alteram seu comportamento quando chamados com um ou mais C-uprefixos. Em alguns casos, o comportamento padrão de um comando é menos útil para mim do que o comportamento que recebo quando o prefixo C-u. Ao mesmo tempo, não quero me livrar completamente do comportamento padrão.
Para dar um exemplo concreto, o quit-window
comando (vinculado a q
in help-mode
) sai da janela atual e enterra o buffer exibido nela por padrão. Quando chamado C-u, mata o buffer. Eu gostaria que o comando matasse o buffer por padrão e o enterrasse quando chamado com um C-uprefixo.
P: Como posso dizer ao Emacs para que um comando se comporte como se fosse chamado com um C-u prefixo por padrão enquanto move o comportamento padrão para o C-u prefixo ?
Eu sei que poderia resolver isso redefinindo o comando original ou agrupando-o em um comando personalizado que passa o prefixo args de acordo com minhas preferências. Mas prefiro fazer algo assim:
(swap-args 'quit-window)
fonte
:filter-args
vez de:around
, eu acho.swap-args
funciona porque torna oC-u
comportamento o padrão ao aplicá-lo a um comando. No entanto, quando chamo o comando comC-u
, não recebo o comportamento original. Talvezcalled-interactively-p
seja a culpa? Meu entendimento é que, com um argumento arg'any
, essa função retornará apenasnil
se o comando que contém for chamado do Lisp, portanto, ao invocar o comando recomendado por meio de uma ligação de chave, o ramo else não poderá ser alcançado.'any
foi bom, eu usei emfuncall
vez deapply
por engano.org-insert-subheading
) verificam literalmente o argumento universal bruto (aparentemente(4)
) em vez de uma verificação convincente da verdade.Outro método baseado no fato de que uma
interactive-form
propriedade no plist da função substitui o formulário especificado no código: ( ref )Usando
(interactive-form 'function)
para obter as especificações atuais, também é possível lidar com especificações mais complexas.Eu acho que a melhor solução (se possível) é envolver a função com
(let ((prefix-arg (not current-prefix-arg)))
emborafonte
Não é tão fácil quanto se pensava. No entanto, como é trivial ter o comando swapped:
fonte
quit-window
comando.C-u
comportamento e padrão , e tenho certeza de que outras pessoas que encontrarem sua postagem serão ajudadas por ela! Pessoalmente, não vou usá-lo porque tenho vários comandos cujo comportamento quero alterar e gostaria de evitar a necessidade de definir vários wrappers.