Error "Wrong type argument: commandp" saat mengikat lambda ke kunci


88

Saya mendapatkan "Argumen jenis salah: commandp, (lambda nil (baris depan 5))" di sini.

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

Apa kesalahannya? Saya cukup yakin itu sederhana & saya kehilangan sesuatu yang jelas.


Anda kehilangan tanda kurung tutup. Mungkin tidak dalam kode Anda, hanya dalam pertanyaan.
Helder S Ribeiro

Sebagai catatan tambahan: ketika Anda mengutip fungsi anonim seperti itu, itu tidak akan dikompilasi. Saya membayangkan itu bukan masalah besar dalam kasus Anda.
Phil Jackson

Jawaban:


130

global-set-keymengharapkan perintah interaktif. (lambda () (interactive) (forward-line 5))harus bekerja.

Omong-omong, C-h f commandpini adalah titik awal yang cukup bagus untuk kesalahan seperti itu.


Saya pikir tidak ada sisi negatifnya. Dari dokumentasi: >> "Panggilan" ke 'interaktif' sebenarnya adalah deklarasi, bukan fungsi; itu memberitahu 'panggilan-interaktif' bagaimana membaca argumen untuk diteruskan ke fungsi. Ketika benar-benar dipanggil, 'interaktif' hanya mengembalikan nol.
Dangelov

Jadi menurut (commandp)dokumentasi, fungsi lambda dengan panggilan tingkat atas (interactive)berfungsi, tetapi bagaimana saya bisa mendefinisikan fungsi dengan panggilan (defun)itu?
peterhil

36

Bentuk yang benar harus seperti ini -

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

Masalahnya adalah Anda lupa meletakkannya (interactive) (seperti yang disebutkan brendan).

Ngomong-ngomong, Anda akan melihat bahwa saya menggunakan (kbd)fungsi untuk menentukan pengikatan kunci. Fungsi itu sangat berguna karena Anda dapat meletakkan key-binding secara harfiah.


2

Saya juga melihat kesalahan ini pada mesin baru tempat saya menggunakan .emacsfile biasa tetapi belum menginstal paket saya, dan perintah yang akan dijalankan ada di salah satu paket tersebut. (Karena perintah yang tidak dapat dijalankan pasti tidak interaktif!)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.