2014-12-03 13 views
9

Sono nuovo di emacs e ho una domanda da principiante. Posso associare un tasto a una particolare funzione tramite (global-set-key (kbd "C-c a b c") 'some-command), dove some-command è una funzione. Come posso richiamare due funzioni (ad esempio some-command e some-other-command) con un attacco chiave? Molte grazie!Associazione chiavi di Emacs per comandi multipli

risposta

10

È possibile definire la propria funzione che chiama le due funzioni e associa il tasto alla propria funzione. Oppure utilizzare un semplice lambda:

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

@Stefan Per favore, spiegate perché non citate lambda? – songyuanyao

+0

Funziona alla grande. Grazie! Ho comunque la stessa domanda sulla citazione --- di solito cito anche i lambda e vorrei sapere perché non farlo. –

+2

@songyuanyao: Perché ''(...) 'è una * lista *, non una * funzione *. Vedi http://stackoverflow.com/questions/16801396/when-should-emacs-function-syntax-be-used/16802304#16802304 – Stefan

0

È possibile definire un altro functon con defun in cui si richiama gli altri con funcall o apply così, quando si chiama questa terza funzione (che si può anche legare) che invocherà le altre.

1

Definire un comando che chiama ciascuna delle funzioni (comandi) che si desidera, condizionatamente. Utilizzare il prefisso arg per distinguere quale chiamare. Quindi, se il nuovo comando di invio è vincolato, ad esempio, a C-o, allora C-u C-o chiamerebbe una delle funzioni e C-o (senza un prefisso arg) chiamerebbe l'altro.

Si vorrà fare C-h f interactive, per vedere come definire un comando che riconosce un argomento prefisso ecc. Consultare anche il manuale Elisp - usare i interactive per trovare dove insegna questo.

Questo è un esercizio facile e divertente. Imparare a definire i propri comandi semplici è un buon modo per iniziare a parlare con Emacs nella propria lingua.

15

vi consiglio di non vincolante espressioni lambda per le chiavi, per la semplice ragione che quando si chiede Emacs cosa che chiave fa, finirà che ti dice qualcosa di simile (per usare il accettato codice, quando byte-compilato, a titolo di esempio):

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. 

Se non avete mai byte-compilare il codice, è meno criptico, ma ancora non formattato:

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

Il che, mentre ancora leggibile nel caso di una piccola funzione come questa, diventa rapidamente incomprensibile per funzioni più grandi.

Rispetto:

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. 

che si ottiene se si nome la funzione (che ti incoraggia a documentarlo più di una funzione anonima fa).

(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) 

Infine, come sottolinea abo-ABO, questo significa anche che può facilmente visita la definizione di tale funzione, in qualsiasi momento, per visualizzare o modificare/rivalutare il codice, o seguendo il link disponibile nel buffer di aiuto (a foo.el nell'esempio), oppure utilizzando Mxfind-function (immettere il nome della funzione), o Mxfind-function-on-key (digitare la sequenza di tasti è destinata a).

+2

Molto importante è la possibilità di saltare a definizione utilizzando questo approccio. –

Problemi correlati