2010-06-25 12 views
11

Frage erstellen:Wie keybindings für eine benutzerdefinierte Moll in Emacs

Wie erstelle ich benutzerdefinierte Tastenbelegungen für kleinere Modi? Something like this.

Hier ist was ich bisher habe. Ich versuche nur, eine benutzerdefinierte Tastenkombination an der Arbeit:

(define-minor-mode num-mode 
     "Toggle the Num pad keys. 
    With no argument, this command toggles the mode. 
    Non-null prefix argument turns on the mode. 
    Null prefix argument turns off the mode. 

    When Num mode is enabled, the num pad inserts the 
    keys you see on the pad. This may over ried existing 
    definitions, and is probably only usefule if you aref 
    running Emacs through a terminal." 
     ;; The initial value. 
     nil 
     ;; The indicator for the mode line. 
     " NumPad" 
     ;; The minor mode bindings. 
     ;; This doesn't work right now!!!! 
     '(((kbd "<kp-1>") . "a")) 
     :global 1 
) 

Wenn ich auf dem Ziffernblock „1“ Hit nach meiner benutzerdefinierten Moll „num-Modus“ aufrufen und überprüft, ist es auf dem Mini Puffer, bekomme ich den Fehler <kp-1> is undefined. Was ich will, ist a wird ausgedruckt, wo der Zeiger ist, wenn ich <kp-1> treffe. (Nur ein Test)

Kontext:

Also, ich in der Regel meine Num-Pad verwenden, um zwischen Puffer zu bewegen (die Pfeiltasten bewegen mich die entsprechenden Richtungen). Dies ist global festgelegt. Ich möchte einen untergeordneten Modus erstellen, den ich aufrufen kann, wenn ich mit meinem Nummernblock einfach Zahlen eingeben möchte.

Standardmäßig sind die Tasten auf meinem Nummernblock nicht definiert. Ich verwende <kp-0> bis <kp-9>, um die Tastenbelegung für die Numpad-Tasten zu definieren.

Ich kann einen untergeordneten Modus erstellen, den ich anrufen kann, aber ich kann keine Tastaturbelegungen anhängen. Dies gilt für alle Tastaturbelegungen, einschließlich einer Tastatur, die nirgendwo anders definiert ist.

Danke für jede Hilfe!

Antwort

20

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:

  1. Der Initialisierungswert für die Nebenmodusvariable. nil wird standardmäßig deaktiviert. Etwas anderes als nil wird standardmäßig aktiviert sein.

  2. 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.

  3. 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.

3

Sie müssen in Ihren Moll Definition Code wie diese haben:

(defvar your-mode-map 
    (let ((map (make-sparse-keymap))) 
    (set-keymap-parent map parent-mode-shared-map) 
    (define-key map "\C-c\C-a" 'some-defun) 
    (define-key map "\C-c\C-b" 'some-other-sexp) 
    map) 

(use-local-map your-mode-map) 

Sie einen Blick auf die vielen Modi in EmacsWiki als Referenz zur Verfügung haben könnte.

+0

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. –

+1

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 –

+0

Danke, das ist eine gute Sache Beispiel .el-Datei zum Betrachten. –

2

Werfen Sie einen Blick auf diese (nur Informationen über keybindings):

http://www.gnu.org/software/emacs/manual/html_node/emacs/Key-Bindings.html#Key-Bindings

http://www.gnu.org/software/emacs/manual/html_node/emacs/Local-Keymaps.html#Local-Keymaps

Von http://xahlee.org/emacs/reclaim_keybindings.html:

Gut geschrieben Hauptmodi Haken am Ende laufen. Sie können also einen Haken verwenden, um Ihre Tastenkürzel zu definieren. Kleinere Modi haben normalerweise keine Haken. In diesem Fall können Sie zuerst "(erfordert )" aufrufen und dann Ihre Tastenkürzel definieren.

Auch können Sie einen Blick auf haben: http://www.cs.utah.edu/dept/old/texinfo/emacs19/emacs_35.html#SEC347

Vielleicht ist die akzeptierte Antwort here auch Ihnen hilft.

+0

Danke, dass der letzte Link zu einer vorherigen Antwort mir den Hinweis gab, den ich brauchte. –

Verwandte Themen