Temel nokta, bir fonksiyon ve bir komut arasında bir fark olmasıdır .
Emacs lisp'de işlevler varsayılan olarak etkileşimli olarak çağrılamaz. Bu, M-x
onlara bir tuş veya fare tıklamasıyla erişemeyeceğiniz veya bağlanamayacağınız anlamına gelir . Bunu yapmak istiyorsanız , gövdede ilk satır olarak interactive
bir (interactive)
form ekleyerek (belge dizesini izleyerek) işlevi açıkça belirtmeniz gerekir . Etkileşimli bir işleve komut denir Bu kılavuzda açıklanmıştır: (info "(elisp) Using Interactive")
(çevrimiçi sürüm) .
Gördüğünüz hata mesajı, Wrong type argument: commandp, my-function
bir işlevi etkileşimli olarak çağırmaya çalıştığınızı gösterir, ancak bu işlev bir komut değildir .
Gerçek hatayı açıklamak için, mektup p
lisp'de genellikle bir yüklemi veya testi belirtmek için kullanılır. Bu durumda Emacs, testi my-function
kullanan bir komut olup olmadığını test ediyor commandp
. Hataya yol açmaz. Yanlış türdeki bir nesneyi her kullandığınızda benzer hatalar ortaya çıkar: Emacs bir dize beklerse ve bir sembol iletirseniz, stringp
örneğin bir başvuru görebilirsiniz .
Soruyu sorulduğu gibi cevaplamak (interactive)
için, tanıma satır eklemeniz gerekir :
(defun my-function ()
(interactive)
(message "This is a great function"))
Form için, işlevinize bilgi aktarmanın her türlü yolunu destekleyen birçok seçenek vardır interactive
. Tüm ayrıntılar için kılavuza bakın.
Klavye makroları bu bağlamda özel bir durumdur. Klavye makrosu, dize olarak gösterilen bir dizi girdi olayıdır. Klavye makroları komutlar gibi davranır, böylece bir interactive
bildirim eklemeden endişe etmeden onları tuşlara bağlayabilirsiniz . Örneğin, aşağıdakilerde:
(global-set-key (kbd "C-c l") "λ")
"λ"
bir klavye makrosudur, bu yüzden C-c l
sorunsuz bir şekilde bağlayabiliriz . Bir işlevi aynı şeyi yapmaya çalışırsak, işlevi şu şekilde tanımladığımızdan emin olmalıyız 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 λ