Kurzantwort
Problem Linie:
'(((kbd "<kp-1>") . "a"))
Solution (erzwingen die Auswertung des Makros):
;; Single quote changed to back-quote and added a comma
`((,(kbd "<kp-1>") . "a"))
Lange Antwort
Die 012.Makro ermöglicht es Ihnen, kleinere Modi relativ leicht zu erstellen (soweit Emacs) geht.
Zuerst werde ich zeigen, wie es gemacht wird, dann werde ich erklären, wie es funktioniert:
In allgemeiner Form:
(define-minor-mode NAME-mode
"DOCUMENTATION"
INIT-VALUE
"LIGHTER"
;; keymap
'(
(KEY-SEQUENCE . DEFINITION)
(KEY-SEQUENCE . DEFINITION)
... ETC ...
)
;; other options
:KEYWORD-ARG VALUE
:KEYWORD-ARG VALUE
... ETC ...
)
Konkretes Beispiel mit Zwang Auswertung von Makros in dem alist:
;; Custom Minor Mode
(define-minor-mode custom-mode
"Doc description, yada yada yada."
;; The initial value - Set to 1 to enable by default
nil
;; The indicator for the mode line.
" CustomMode"
;; The minor mode keymap
`(
(,(kbd "C-c C-a") . some-command)
(,(kbd "C-c C-b") . other-command)
("\C-c\C-c" . "This works too")
)
;; Make mode global rather than buffer local
:global 1
)
eine alternative Art und Weise, wenn Sie eine Variable für die keymap verwenden möchten ist die keymap Variable und die keymap vor t zu definieren er Moll Erklärung etwas wie folgt aus:
(defvar custom-mode-keymap (make-keymap) "num-mode keymap.")
(define-key custom-mode-keymap (kbd "C-c C-a") 'some-command)
Und dann, in der Moll-Definition, einfache Liste der Variablenname für Ihre keymap anstelle der alist
(define-key custom-mode-keymap (kbd "C-c C-b") 'other-command)
;; Num pad enable
(define-minor-mode custom-mode
...
;; The minor mode bindings.
custom-mode-keymap
Wie alles funktioniert
Von oben nach unten definieren wir direkt nach dem Define-Minor-Modus einen Befehlsnamen, um den Moll-Modus umzuschalten. custom-mode
in diesem Fall (M-x custom-mode
, um den Modus umzuschalten). Dies definiert auch eine Variable mit dem gleichen Namen.
Gleich nach dem Befehlsnamen führen wir die Dokumentationszeichenfolge für den untergeordneten Modus in Anführungszeichen auf. Das kann so lange sein, wie Sie möchten.
Als nächstes haben wir mehrere Möglichkeiten. Die einfachste Wahl ist, einfach drei Dinge aufzulisten und dann irgendwelche zusätzlichen Optionen. Die drei Dinge müssen in der folgenden Reihenfolge aufgelistet werden. Diese drei Dinge sind:
Der Initialisierungswert für die Nebenmodusvariable. nil
wird standardmäßig deaktiviert. Etwas anderes als nil
wird standardmäßig aktiviert sein.
Das Feuerzeug. Das Feuerzeug ist einfach das, was in der Moduszeile unten angezeigt wird, wenn der Nebenmodus aktiviert ist. Dies sollte kurz sein, und es wird oft helfen, es in Bezug auf die Formatierung mit einem Leerzeichen zu beginnen.
Die Tastenbelegung. Die Keymap kann entweder als Variable oder als Alist (Assoziationsliste) definiert werden. Da die Verwendung einer alist einfacher und kürzer ist, habe ich das im Beispiel verwendet. Der Alist sollte in der Form (key-sequence . definition)
sein.
Wenn Sie definieren die keymap als alist, es gibt ein paar Dinge, die zu achten, besonders wenn man auf die Definition globaler keybindings gewohnt sind. Erstens werden Befehlsnamen nicht zitiert. Zweitens, wenn Sie ein Makro verwenden möchten, müssen Sie force it to evaluate (and on SO). Dies geschieht mit einer Kombination aus dem Rückzitat (kein einfaches Zitat) und dem Komma. Wie das im Beispiel mit dem kbd-Makro funktioniert, können Sie sehen. Ich habe auch eine Tastenanschlagsdefinition eingefügt, wenn Sie das kbd-Makro nicht verwenden. Wenn Sie einfach eine Zeichenfolge in Ihrer Tastaturbelegung angeben, wird diese beim Drücken der definierten Tastenkombination ausgedruckt (genau wie beim Definieren globaler Tastenbelegungen).
Die Tastenbelegung funktioniert nicht mit kbd-Makros, wenn Sie die Auswertung der kbd-Makros nicht mit einer Kombination aus dem hinteren Anführungszeichen und dem Komma erzwingen. So:
`((,(kbd "C-c C-a") . some-command))
Schließlich können Sie zusätzliche Optionen hinzufügen :blah
mit Keyword-args des Formulars. Im Beispiel habe ich :global
verwendet. Wir hätten den gesamten Modus mit Schlüsselwort-Argumenten definieren können, aber es ist kürzer, um nur den Initialisierungswert, Lighter und Keymap in der richtigen Reihenfolge aufzulisten.
Ich habe versucht, eine Formatierung wie hier zu verwenden: http://www.gnu.org/software/emacs/elisp/html_node/Defining-Minor-Modes.html in dem Beispiel. Wenn Sie die gesamte Definition für dieses Format zeigen könnten, wäre das großartig. –
clojure-mode verwendet diesen Stil, um lokale Tastaturbelegungen einzurichten - sehen Sie sich die Quelle hier an - http://github.com/jochu/clojure-mode/blob/master/clojure-mode.el –
Danke, das ist eine gute Sache Beispiel .el-Datei zum Betrachten. –