2014-12-03 24 views
9

Emacs konusunda yeniyim ve bir çaylak sorunuz var. Belirli bir işlevin bir anahtarını (global-set-key (kbd "C-c a b c") 'some-command) ile bağlayabilirim; burada some-command bir işlevdir. Tek bir tuşla iki işlevi nasıl çağırırım (some-command ve some-other-command)? Çok teşekkürler!Emacs çoklu komutlar için anahtar bağlama

cevap

10

İki işlevi çağıran kendi işlevinizi tanımlayabilir ve anahtarı kendi işlevinize bağlayabilirsiniz.

(global-set-key (kbd "C-c a b c") (lambda() (interactive) (some-command) (some-other-command))) 
+0

@Stefan Lütfen lambdaların neden alıntı yapmadığını açıklar mısınız? – songyuanyao

+0

Bu harika çalışıyor. Teşekkürler! Ben de alıntı hakkında aynı soru var --- Ben de genellikle lambdas alıntı ve neden olmasın bilmek istiyorum. –

+2

@songyuanyao: Çünkü ''...) 'bir * listesi *, bir * işlevidir *. Bkz. Http://stackoverflow.com/questions/16801396/when-should-emacs-function-syntax-be-used/16802304#16802304 – Stefan

0

Sen (siz de bağlayabilir) bu üçüncü işlevi çağırmak bunu funcall veya apply başkalarını çağırmak hangi defun, başka functon tanımlayabilirsiniz diğerlerini açılmasına neden olur.

1

Koşullu olarak, istediğiniz tüm işlevleri (komutları) çağıran bir komut tanımlayın. Aramak için hangisi olduğunu ayırt etmek için önek argümanını kullanın. Bu nedenle, yeni, gönderme komutu C-o'a bağlanırsa, C-u C-o, işlevlerden birini çağırır ve C-o (önek arg komutu olmadan) diğerini çağırır.

Bir önek argümanını tanıyan bir komutu nasıl tanımlayacağınızı görmek için C-h f interactive yapmak isteyeceksiniz. Ayrıca, Elisp kılavuzuna da danışın - bunun nerede olduğunu bulmak için i interactive kullanın.

Bu kolay ve eğlenceli bir egzersiz. Kendi basit komutlarınızı tanımlamayı öğrenmek, Emacs ile kendi dilinde konuşmaya başlamak için iyi bir yoldur.

15

Ben asla bu anahtar ne Emacs sorduğunuzda, kabul kullanmak (size böyle bir şey söylüyorum sona erecek basit bir nedenle, tuşlara lambda ifadeleri bağlayıcı öneririz: Ya basit bir lambda kullanmak örnek olarak, bayt-derlenmiş kod): Eğer hiçbir zaman

C-c a b c runs the command #[nil "\300 \210\301 \207" [some-command 
some-other-command] 1 nil nil], which is an interactive compiled Lisp 
function. 

It is bound to C-c a b c. 

(anonymous) 

Not documented. 

kodunuzu bayt-derlemek, bu az şifreli, ama yine de biçimlendirilmemiş var:

C-c a b c runs the command (lambda nil (interactive) (some-command) 
(some-other-command)), which is an interactive Lisp function. 

Hangi iken hala okunabilir Böyle küçük bir işlev durumunda, büyük işlevler için hızla anlaşılmaz olur. ile karşılaştırıldığında

? Elde

C-c a b c runs the command my-run-some-commands, which is an 
interactive compiled Lisp function in `foo.el'. 

It is bound to C-c a b c. 

(my-run-some-commands) 

Run `some-command' and `some-other-command' in sequence. 

eğer adı (daha anonim bir fonksiyon yapar daha belgelemek için teşvik eder) fonksiyonu. Abo-Abo işaret ettiği gibi

(defun my-run-some-commands() 
    "Run `some-command' and `some-other-command' in sequence." 
    (interactive) 
    (some-command) 
    (some-other-command)) 

(global-set-key (kbd "C-c a b c") 'my-run-some-commands) 

Son olarak, bu aynı zamanda, her iki bağlantıyı takip ederek kolayca ziyareti görüntülemek için herhangi bir zamanda bu fonksiyonun tanım veya düzenleme/yeniden değerlendirmek kodu can demektir ya da (işlevin adını girmek) find-function Mxkullanılarak (bizim örneğimizde foo.el kadar) yardımcı tampon maddesi içinde temin ya Mxfind-function-on-key (bu için bağlı anahtar dizisi de).

+2

Çok önemlisi, bu yaklaşımı kullanarak tanımlamaya geçebilirsiniz. –