2013-02-27 14 views
5

Ich bin in den frühen Phasen der Erstellung eines major mode for Emacs zum Durchsuchen und Interagieren mit dem Stack Exchange Network.Emacs Keybinding funktioniert nicht in benutzerdefinierten Hauptmodus

Daran beteiligt sind mehrere Hauptmodi, alle mit Ein-Tasten-Tastenbelegungen ähnlich . Ich suchte nach dired an der Quelle und extrahiert, was ich dachte funktionieren würde:

(defvar stack-network-mode-map 
    (let ((map (make-keymap))) 
    (define-key map "n"  'stack-network-next-site) 
    (define-key map "p"  'stack-network-previous-site) 
    (define-key map ","  'stack-network-move-site-up) 
    (define-key map "."  'stack-network-move-site-down) 
    (define-key map "j"  'stack-network-jump-to-bookmarks) 
    (define-key map "\C-m" 'stack-network-do-enter-site) ; ret 
    (define-key map "o"  'stack-network-do-enter-site) 
    (define-key map "u"  'stack-network-do-profile-summary) 
    (define-key map "\C-uu" 'stack-network-do-profile-summary-for-user) 
    (define-key map "i"  'stack-network-do-inbox) 
    (define-key map "b"  'stack-network-toggle-bookmark) 
    (define-key map "?"  'stack-network-list-functions) ; [1] 
    (define-key map "\C-i" 'stack-network-display-details) ; tab 
    map) 
    "Keymap for Stack Exchange: Network Browser major mode") 

aber leider scheint dies absolut keine Wirkung zu haben; Der Puffer wird einfach wie jeder andere normale Puffer bearbeitet. Wie kann ich eine Tastenbelegung erreichen, wenn dies nicht so ist? (Was übrigens, ich bin sicher, dass es ist. Hier muss etwas anderes los sein.)

+0

Brauchen Sie mehr Detail .... Ich lade das Paket, das Sie beziehen, und es funktioniert gut. Alle Hauptmodusbindungen sind verfügbar (undefiniert). –

+0

Definieren Sie keine Hauptmodi mit 'defun'. Verwenden Sie den 'define-derived-mode', der alle Voreinstellungen für Sie übernimmt, einschließlich des Tötens lokaler Variablen, Umschalten der Key-Map, Setzen von Major-Modus-Variablen, Ausführen der Hooks usw. – lunaryorn

Antwort

5

Sie wollen stack-network-mode definieren define-derived-mode mit (und es von special-mode, zum Beispiel machen ableiten).

Kommentare über Ihren Code:

  • Verwendung () statt nil für leere Argumentlisten.
  • stack-network-next-site muss (interactive) direkt nach dem Docstring haben, um es zu einem interaktiven Befehl zu machen, sonst wird es nicht als Schlüsselbindung funktionieren.

Wenn Sie nicht special-mode verwenden möchten, können Sie supress-keymap rufen direkt nach dem make-keymap zu schaffen.

+0

Dies verhindert die Pufferbearbeitung (dank' special- Modus ", nehme ich an), aber die Schlüssel werden immer noch nicht gebunden :((Meines Wissens nach'() === Nil'.) –

+0

Wenn Sie den Code so sehen möchten, wie er ist, ist es [ hier] (https://github.com/vermiculus/stack-mode/blob/71fb0081400bf71abf226fc6cb9e0382e2b7009a/elisp/stack-network-mode.el) (spezifisches Commit, das verknüpft ist, um die Verwendung für zukünftige Referenz beizubehalten) –

+0

@vermiculus '() == = nil' gilt, aber es ist üblich, '()' für leere Argumentlisten zu verwenden. 'nil' an dieser Stelle wirkt auf die meisten Emacs Lisp-Programmierer störend. – lunaryorn

0

Sie haben eine Tastenbelegung definiert, aber Sie haben sie nicht benutzt. Die Variable existiert, erfasst jedoch keine Schlüsselereignisse.

(use-local-map stack-network-mode-map) 
2

Verschieben Sie die Definition von stack-network-mode-map vor der Definition des Modus. Ansonsten definiert define-derived-mode diese Variable implizit und defvar ändert den Wert von Nicht-Nil-Variablen nicht, daher ist die Map tatsächlich leer.

Siehe Derived Modes:

Der neue Modus seine eigene spärliche keymap hat, benannte Variante -map. define-derived-mode macht die Keymap des übergeordneten Modus zum übergeordneten Element der neuen Map, es sei denn, die Variante -map ist bereits festgelegt und hat bereits ein Parent.