Erro “Argumento de tipo errado: commandp” ao vincular um lambda a uma chave

87

Estou recebendo um "argumento de tipo errado: commandp, (lambda nil (linha direta 5))" aqui.

(global-set-key [?\M-n] (lambda () (forward-line 5)))

Qual é o erro? Tenho quase certeza de que é simples e estou perdendo algo óbvio.

Paul Nathan
fonte
Você está faltando um parêntese de fechamento. Provavelmente não em seu código, apenas na pergunta.
Helder S Ribeiro
Como uma observação lateral: quando você cita a função anônima dessa forma, ela não será compilada. Eu imagino que não seja grande coisa no seu caso, no entanto.
Phil Jackson

Respostas:

129

global-set-keyespera um comando interativo. (lambda () (interactive) (forward-line 5))deve funcionar.

A propósito, C-h f commandpé um bom ponto de partida para erros como esse.

Brendan
fonte
Acho que não há lados negativos. Da documentação: >> A "chamada" para 'interativo' é na verdade uma declaração em vez de uma função; diz à 'chamada interativa' como ler os argumentos para passar para a função. Quando realmente chamado, 'interativo' retorna apenas nulo.
Dangelov
Portanto, de acordo com a (commandp)documentação, as funções lambda com chamada de nível superior (interactive)funcionam, mas como posso definir uma função com (defun)que funcione?
Peterhil
35

A forma correta deve ser esta -

(global-set-key (kbd "M-n") (lambda () (interactive) (forward-line 5)))

O problema é que você se esqueceu de colocar (interactive) (como o brendan mencionou).

A propósito, você notará que usei a (kbd)função para especificar a combinação de teclas. Essa função é extremamente útil, pois você pode colocar as teclas de atalho quase literalmente.

Baishampayan Ghose
fonte
2

Também vi esse erro em uma nova máquina onde estou usando meu .emacsarquivo usual, mas não instalei meus pacotes, e o comando a ser executado está em um desses pacotes. (Porque um comando que não pode ser executado definitivamente não é interativo!)

Paul Bissex
fonte