2014-12-03 10 views
9

Ich bin neu in Emacs, und habe eine Anfängerfrage. Ich kann einen Schlüssel an eine bestimmte Funktion von (global-set-key (kbd "C-c a b c") 'some-command) binden, wobei some-command eine Funktion ist. Wie kann ich zwei Funktionen (zB some-command und some-other-command) mit einem Schlüssel binden? Danke vielmals!Emacs Key-Bindung für mehrere Befehle

Antwort

10

Sie können eine eigene Funktion definieren, die die beiden Funktionen aufruft und den Schlüssel an Ihre eigene Funktion bindet. Oder eine einfache Lambda verwenden:

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

@Stefan Wollen Sie bitte erklären, warum nicht lambdas zitieren? – songyuanyao

+0

Das funktioniert großartig. Vielen Dank! Ich habe die gleiche Frage zum Zitat - ich ziehe normalerweise auch die Lambdas und möchte wissen, warum nicht. –

+2

@songyuanyao: Weil ''(...) 'ist eine * Liste *, keine * Funktion *. Siehe http://stackoverflow.com/questions/16801396/when-should-emacs-function-syntax-be-used/16802304#16802304 – Stefan

0

Sie können einen anderen functon mit defun definieren, in dem Sie die anderen mit funcall oder apply so aufrufen, wenn Sie diese dritte Funktion aufrufen (die man auch binden kann) wird es die anderen aufrufen.

1

Definieren Sie einen Befehl, der jede der gewünschten Funktionen (Befehle) bedingt aufruft. Verwenden Sie das Präfix arg, um zu unterscheiden, welcher Anruf erfolgen soll. Wenn also der neue Befehl zum Senden beispielsweise an C-o gebunden ist, würde C-u C-o eine der Funktionen aufrufen und C-o (ohne ein Präfix arg) würde den anderen aufrufen.

Sie wollen C-h f interactive zu tun, um zu sehen, wie ein Befehl zu definieren, die ein Präfix Argument erkennt usw. die Elisp Handbuch Consult auch - i interactive verwenden zu finden, wo es dies lehrt.

Dies ist eine einfache und lustige Übung. Es ist ein guter Weg, mit Emacs in seiner eigenen Sprache zu sprechen, um eigene einfache Befehle zu definieren.

15

empfehle ich nie Lambda-Ausdrücke, um Schlüssel zu binden, aus dem einfachen Grund, dass, wenn Sie Emacs fragen, was das Schlüssel tut, wird es Ihnen so etwas wie dies am Ende zu sagen (die akzeptiert zu verwenden Code, wenn Byte-kompilierte, als Beispiel):

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. 

Wenn Sie nie Ihren Code Byte-kompiliert, es ist weniger kryptisch, aber immer noch nicht formatiert:

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

, die zwar noch lesbar im Falle einer kleinen Funktion wie diese, wird schnell unverständlich für größere Funktionen.

Verglichen mit:

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. 

Was Sie, wenn Sie Namen bekommen die Funktion (die Sie mehr als eine anonyme Funktion tut zu dokumentieren fördert).

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

schließlich als abo-abo weist darauf hin, das bedeutet auch, können Sie einfach Besuch der Definition dieser Funktion jederzeit anzeigen oder bearbeiten/neu bewerten den Code, indem Sie entweder den folgenden Link in Hilfe Puffer vorgesehen (zu foo.el in meinem Beispiel) oder durch Mxfind-function (geben sie den Namen der Funktion), oder Mxfind-function-on-key (die Tastenfolge eingeben es gebunden).

+2

Sehr wichtig, dass Sie mit diesem Ansatz auf die Definition springen können. –