Bir lambda'yı bir anahtara bağlarken "Yanlış tür bağımsız değişkeni: commandp" hatası


88

Burada "Yanlış tür bağımsız değişkeni: commandp, (lambda nil (ileri satır 5))" alıyorum.

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

Hata nedir? Oldukça basit olduğundan eminim ve bariz bir şeyi kaçırıyorum.


Bir kapanış parantezi eksik. Muhtemelen kodunuzda değil, sadece soruda.
Helder S Ribeiro

Bir yan not olarak: anonim işlevi bu şekilde alıntı yaptığınızda, derlenmeyecektir. Senin durumunda önemli olmadığını düşünüyorum.
Phil Jackson

Yanıtlar:


130

global-set-keyetkileşimli bir komut bekliyor. (lambda () (interactive) (forward-line 5))çalışmalı.

Bu arada, C-h f commandpbu tür hatalar için oldukça iyi bir başlangıç ​​noktası.


Bence kötü taraf yok. Dokümantasyondan: >> "Etkileşimli" ye "çağrı" aslında bir işlevden ziyade bir bildirimdir; İşleve geçmek için argümanların nasıl okunacağını 'çağrı etkileşimli olarak' anlatır. Gerçekte çağrıldığında, 'etkileşimli' sadece sıfır döndürür.
Dangelov

Yani (commandp)belgelere göre , lambda üst seviye (interactive)işe çağrı ile çalışır, ancak bununla çalışacak bir işlevi nasıl tanımlayabilirim (defun)?
peterhil

36

Doğru form bu olmalıdır -

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

Sorun, (interactive)(brendan'ın da bahsettiği gibi) koymayı unutmuş olmanızdı .

Bu arada, (kbd)anahtar bağlamayı belirlemek için işlevi kullandığımı fark edeceksiniz . Bu işlev son derece kullanışlıdır, çünkü tuş bağlamalarını neredeyse tam anlamıyla koyabilirsiniz.


2

Bu hatayı, her zamanki dosyamı kullandığım .emacsancak paketlerimi yüklemediğim ve yürütülecek komutun bu paketlerden birinde olduğu yeni bir makinede de gördüm . (Çünkü yürütülemeyen bir komut kesinlikle etkileşimli değildir!)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.