Titik intinya adalah bahwa ada perbedaan antara fungsi dan perintah .
Dalam Emacs lisp, fungsi tidak dapat dipanggil secara interaktif secara default. Itu berarti Anda tidak dapat mengaksesnya melalui M-x
atau mengikat mereka ke tombol atau klik mouse. Jika Anda ingin melakukan itu, Anda harus secara eksplisit mendeklarasikan fungsi tersebut interactive
, yang Anda lakukan dengan menambahkan (interactive)
formulir sebagai baris pertama dalam tubuh (mengikuti string dokumentasi). Fungsi interaktif disebut perintah. Ini dijelaskan dalam manual: (info "(elisp) Using Interactive")
(versi online) .
Pesan kesalahan yang Anda lihat,, Wrong type argument: commandp, my-function
menunjukkan bahwa Anda mencoba memanggil suatu fungsi secara interaktif, tetapi fungsi itu bukan perintah .
Untuk menjelaskan kesalahan yang sebenarnya, surat p
itu sering digunakan dalam lisp untuk menunjukkan predikat atau tes. Dalam kasus ini, Emacs sedang menguji my-function
untuk melihat apakah itu adalah perintah menggunakan tes commandp
. Bukan, yang mengarah ke kesalahan. Kesalahan serupa muncul setiap kali Anda menggunakan objek dengan tipe yang salah: jika Emacs mengharapkan string dan Anda melewati simbol, Anda mungkin melihat referensi stringp
, misalnya.
Untuk menjawab pertanyaan saat ditanyakan, Anda perlu menambahkan (interactive)
baris ke definisi:
(defun my-function ()
(interactive)
(message "This is a great function"))
Ada banyak opsi untuk interactive
formulir, mendukung semua jenis cara menyampaikan informasi ke fungsi Anda. Periksa manual untuk semua detail.
Makro keyboard adalah kasus khusus dalam konteks ini. Makro keyboard adalah urutan acara input, direpresentasikan sebagai string. Makro keyboard berperilaku seperti perintah, sehingga Anda dapat mengikatnya ke tombol tanpa khawatir menambahkan interactive
deklarasi. Misalnya, berikut ini:
(global-set-key (kbd "C-c l") "λ")
"λ"
adalah makro keyboard, jadi kita dapat mengikatnya C-c l
tanpa masalah. Jika kita mencoba melakukan hal yang sama dengan suatu fungsi, kita harus memastikan untuk mendefinisikan fungsi sebagai interactive
:
(global-set-key (kbd "C-c k")
(lambda () (insert "λ"))
;; C-c k is undefined! We tried to bind it to a function
(global-set-key (kbd "C-c m")
(lambda () (interactive) (insert "λ"))
;; C-c m is bound to a command that inserts λ