Eu escrevi uma função e quero chamá-la via Mx e vinculá-la a uma chave. Esta é a minha função:
(defun my-function ()
(message "This is a great function"))
Se eu tentar chamá-lo M-x my-function
, recebo o erro: [no match]
no mini-buffer.
Se eu tentar vinculá-lo a uma chave (ou clique do mouse):
(global-set-key (kbd "C-c a") 'my-function)
Parece funcionar, mas quando tento chamá-lo C-c a
, recebo o erro
Argumento de tipo errado: commandp, my-function
Por que não consigo usar minha função?
functions
commands
interactive
Tyler
fonte
fonte
interactive
- por exemplo, às vezes um comando desaparece de uma nova versão de uma biblioteca. O erro pode ser gerado em qualquer contexto em que o Emacs espera um comando.commandp
, para tentar encontrar outros Qs que possam ser fechados como duplicados deste. Porém, tenha cuidado ao ler as perguntas e respostas, pois algumas são diferentes. Em alguns casos, vale a pena repetir a resposta (e o contexto Q) aqui. Em outros casos, a questão não é relacionada e deve ser deixada como está (não fechada).Respostas:
O ponto principal é que há uma diferença entre uma função e um comando .
No Emacs lisp, as funções não são chamadas interativamente por padrão. Isso significa que você não pode acessá-los via
M-x
ou vinculá-los a uma tecla ou clique do mouse. Se você quiser fazer isso, precisará declarar explicitamente a funçãointeractive
, adicionando um(interactive)
formulário como a primeira linha do corpo (seguindo a sequência de documentação). Uma função interativa é chamada de comando. Isso é explicado no manual:(info "(elisp) Using Interactive")
(versão online) .A mensagem de erro exibida
Wrong type argument: commandp, my-function
indica que você está tentando chamar uma função interativamente, mas essa função não é um comando .Para explicar o erro real, a letra
p
é frequentemente usada no lisp para indicar um predicado ou teste. Nesse caso, o Emacs está testandomy-function
para ver se é um comando usando o testecommandp
. Não é, o que leva ao erro. Erros semelhantes aparecem sempre que você usa um objeto do tipo errado: se o Emacs espera uma string e passa um símbolo, você pode ver uma referência astringp
, por exemplo.Para responder à pergunta conforme solicitado, você precisa adicionar a
(interactive)
linha à definição:Existem muitas opções para o
interactive
formulário, suportando todos os tipos de maneiras de passar informações para sua função. Verifique o manual para todos os detalhes.As macros do teclado são um caso especial nesse contexto. Uma macro de teclado é uma sequência de eventos de entrada, representada como uma sequência. As macros do teclado se comportam como comandos, para que você possa vinculá-las às teclas sem se preocupar em adicionar uma
interactive
declaração. Por exemplo, no seguinte:"λ"
é uma macro de teclado, para que possamos vinculá-laC-c l
sem problemas. Se tentarmos fazer o mesmo com uma função, precisamos definir a função comointeractive
:fonte
M-x my-function
no seu exemplo. Também como iniciante no emacs, ainda não estou 100% claro sobre o que exatamenteC-x C-e
faz ou quando você precisa executá-lo, mas parece que ... quando você o executa, ele analisa o buffer e sobrescrevemy-function
na memória, porque se eu não executeC-x C-e
M-x
executa a função a partir da última vez que eu corriC-x C-e
C-x C-e
avalia o buffer , parece que o resultado da avaliação de um buffer contendo adefun
está registrando a função, embora este artigo pareça me fazer pensar que ele deve apenas executar a função e, no entanto, a única coisa mostrada no minibuffer émy-function
(implicando que ele retorna a função?), nãoThis is a great function
. Eu devo estar esquecendo algo aqui.