2013-02-27 15 views
5

Sono nelle fasi iniziali della creazione di major mode for Emacs per la navigazione e l'interazione con la rete di scambio di stack.La codifica di Emacs non funziona in modalità principale personalizzata

Coinvolti in esso sono diverse modalità principali, tutte con combinazioni di tasti ad un tasto simili a dired. Ho guardato la fonte per dired, ed estratto quello che pensavo avrebbe funzionato:

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

ma purtroppo questo sembra non avere assolutamente alcun effetto; il buffer viene semplicemente modificato proprio come qualsiasi altro buffer normale. Come posso ottenere una combinazione di tasti a chiave singola se non è così? (Che, a proposito, sono sicuro che ci sia qualcos'altro che sta succedendo qui.)

+0

Serve più dettagli .... Carico il pacchetto a cui si fa riferimento e funziona perfettamente. Tutti i principali collegamenti alla modalità sono disponibili (anche se non definiti). –

+0

Non definire le modalità principali con 'defun'. Usa 'define-derived-mode', che gestisce tutto il boilerplate per te, incluso uccidere le variabili locali, cambiare la mappa delle chiavi, impostare le modalità principali vars, eseguire i ganci, ecc. – lunaryorn

risposta

5

si desidera definire stack-network-mode utilizzando define-derived-mode (e renderlo derivano da special-mode, per esempio).

altri commenti circa il codice:

  • uso () piuttosto che nil per liste di argomenti vuoti.
  • stack-network-next-site deve avere (interactive) subito dopo la docstring per renderlo un comando interattivo altrimenti non funzionerà come associazione di chiavi.

Se non si desidera utilizzare special-mode, è possibile chiamare supress-keymap subito dopo la creazione del make-keymap.

+0

Ciò impedisce la modifica del buffer (grazie a' special- mode', presumo), ma i tasti non sono ancora vincolati :((Inoltre, per quanto ne so, '() === nil'.) –

+0

Se vuoi vedere il codice così com'è, è [ qui] (https://github.com/vermiculus/stack-mode/blob/71fb0081400bf71abf226fc6cb9e0382e2b7009a/elisp/stack-network-mode.el) (commit specifico collegato per conservare l'uso per riferimento futuro) –

+0

@vermiculus '() == = nil' contiene, ma è convenzione usare '()' per gli elenchi di argomenti vuoti. 'nil' in questo posto sembra disturbare la maggior parte dei programmatori Emacs Lisp. – lunaryorn

0

Hai definito una mappa dei tasti ma non l'hai usata. La variabile esiste ma non cattura alcun evento chiave.

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

Spostare la definizione di stack-network-mode-map prima della definizione della modalità. Altrimenti define-derived-mode definisce implicitamente questa variabile e defvar non modifica il valore delle variabili non nul, quindi la mappa sarà vuota in realtà.

Vedi Derived Modes:

La nuova modalità ha la propria mappa della tastiera sparse, chiamato variante -map. define-derived-mode rende la mappa dei tasti della modalità genitore la madre della nuova mappa, a meno che la variante -map sia già impostata e abbia già un genitore.

Problemi correlati