Frage

Frage:

Wie erstelle ich benutzerdefinierte Tastenbelegungen für kleinere Modi? So etwas wie dieses .

Hier ist, was ich bisher haben. Ich versuche nur, eine benutzerdefinierte Tastenkombination zur Arbeit zu bekommen:

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

Als ich „1“ auf dem Ziffernblock Hit nach meinem benutzerdefinierten Moll Aufruf „num-Modus“ und die Überprüfung auf im Mini-Puffer ist, erhalte ich die Fehler <kp-1> is undefined. Was ich will, geschehen ist a wird ausgedruckt, wo der Zeiger ist, wenn ich <kp-1> getroffen. (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 wird global festgelegt. Ich möchte eine kleine Modus erstellen, dass ich anrufen kann, wenn ich möchte meine num-Pad verwenden, einfach Zahlen eingeben.

Standardmäßig sind die Tasten auf meinem Nummernblock nicht definiert. Ich benutze <kp-0> zu <kp-9> die Tastenbelegungen für die Numpad Tasten zu definieren.

kann ich eine kleine Modus erstellen, die ich anrufen kann, aber ich kann keine keybindings nicht anhängen. Dies gilt für alle Tastenbelegungen, darunter eine nicht irgendwo anders definiert.

Vielen Dank für jede Hilfe!

War es hilfreich?

Lösung

Kurze Antwort

Problem Zeile:

'(((kbd "<kp-1>") . "a"))

Solution (erzwingt die Auswertung des Makros):

;; Single quote changed to back-quote and added a comma
`((,(kbd "<kp-1>") . "a"))

Lange Antwort

Die definieren-Moll-Modus Makro können Sie kleinere Modi relativ leicht (so weit wie Emacs) geht.

erstellen

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 zu definieren, bevor die 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 des 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 das alles funktioniert

Von oben nach unten, direkt nach define-Moll-Modus definieren wir einen Befehlsnamen zu wechseln Moll. custom-mode in diesem Fall (M-x custom-mode den Modus zu wechseln). Dies definiert auch eine Variable mit dem gleichen Namen.

Gleich nach dem Befehlsnamen, listen wir die Docstring für Moll in Anführungszeichen. Dies kann ziemlich viel sein, so lange wie Sie wollen.

Als nächstes haben wir mehrere Möglichkeiten. Die einfachste Wahl ist einfach drei Dinge auflisten und dann alle zusätzlichen Optionen. Die drei Dinge haben in der folgenden Reihenfolge aufgeführt werden. Diese drei Dinge sind:

  1. Der initilization Wert für den Moll-Variable. nil wird der Modus standardmäßig deaktiviert haben. Etwas anderes als nil wird es standardmäßig aktiviert hat.

  2. Das Feuerzeug. Das Feuerzeug ist einfach das, was Anzeige im Modus Zeile unten ist, wenn Ihr Moll-Modus aktiviert ist. Dies sollte kurz sein, und es wird oft Hilfe in Bezug auf die Formatierung, es mit einem Raum zu starten.

  3. Die keymap. Die keymap kann entweder als Variable oder eine aList (Assoziationsliste) definiert werden. Da mit einem alist ist einfacher und kürzer, das ist, was ich in dem Beispiel verwendet. Der alist sollte in Form (key-sequence . definition) sein.

Wenn Sie die keymap als alist definieren, gibt es ein paar Dinge zu achten, besonders wenn man auf die Definition globaler keybindings gewohnt sind. Zuerst Befehlsnamen werden nicht angegeben. Zweitens, wenn Sie ein Makro verwenden möchten, Sie müssen zwingen zu bewerten ( und auf SO ) . Dies wird mit einer Kombination aus dem Back-Zitat (nicht Apostroph) und Komma erfolgen. Sie können sehen, wie dies in dem Beispiel mit dem kbd Makro erfolgt. Ich habe auch einen Tastendruck Definition enthalten, wenn Sie nicht das kbd Makro verwenden. Wenn Sie einfach eine Zeichenfolge in Ihrem keymap zitieren, das wird ausgedruckt, wenn die definierte Tastenkombination (genau wie für die Definition globale Tastenbelegungen) gedrückt wird.

Die keymap wird nicht funktionieren mit kbd Makros, wenn Sie nicht die Auswertung der kbd Makros mit einer Kombination aus der Rückseite Zitat und Komma zwingen Sie Wie folgt aus:.

`((,(kbd "C-c C-a") . some-command))
Verwendung von Keyword-args des Formulars :blah

Schließlich können Sie zusätzliche Optionen hinzuzufügen. Im Beispiel verwenden ich :global. Wir könnten den gesamten Modus mit keyword-args definiert, aber es ist kürzer, nur Liste des init-Wert, leichter und keymap in der richtigen Reihenfolge.

Andere Tipps

Sie müssen in Ihren Moll Definition wie folgt Code 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 können einen Blick auf die vielen Modi zur Verfügung haben in EmacsWiki Referenz.

Haben 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

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

Gut geschrieben wichtigste Modi Haken am Ende laufen. So können Sie einen Haken, um Ihren Keybinding zu definieren. Minor-Modi müssen in der Regel nicht Haken. In diesem Fall können Sie anrufen „(erfordern )“ zuerst, dann definieren Sie Ihr Keybinding.

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

Vielleicht ist die akzeptierte Antwort auch Ihnen hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top