2013-01-23 14 views
6

sto scrivendo una funzione elisp che si lega in modo permanente una data chiave per un dato comando nella mappa tastiera del modo maggiore corrente. Ad esempio,Nome Emac della keymap locale corrente?

(define-key python-mode-map [C-f1] 'python-describe-symbol) 

Il comando e la sequenza di tasti sono raccolti in modo interattivo dall'utente. Tuttavia, sto riscontrando problemi nel produrre il nome di KEYMAP (ad esempio "python-mode-map") che corrisponde alla modalità principale corrente.

ho provato la funzione (corrente-local-mappa), ma questa funzione restituisce l'oggetto mappa di tastiera in sé, piuttosto che il suo nome.

Capisco che molte delle principali mappe di tasti di modalità sono denominate in base alla convenzione '' nome-modalità-modalità '' modalità-mappa ', tuttavia, questo non è sempre il caso (ad esempio, python-shell-map), quindi preferirei che il mio codice non si basasse su questa convenzione. (Non sono nemmeno sicuro di come accedere al nome della modalità principale corrente).

Il (define-key ...) deve essere aggiunto ad un file di inizializzazione, quindi anche se

(define-key (current-local-map) key command)

sembra funzionare, non funziona come codice su un file di inizializzazione.

+0

Perché stai scrivendo codice che genera altro codice? Qual è il problema più profondo che stai cercando di risolvere? Potresti forse scrivere alcune librerie che altri potrebbero semplicemente "richiedere"? Sareste in grado di scrivere una singola modalità che fa questo tipo di funzioni 'magicamente-descrivi-simbolo' che fa la cosa giusta in base alla modalità corrente? ecc –

+0

Il mio punto/domanda è, se è possibile aggiungere programatically questi, si potrebbe essere in grado di risolvere in modo più generale, più elegante - uno che non comporta un mucchio di frammenti di codice che sembrano quasi identici tranne che per la mappa delle modalità ... –

+1

@TreyJackson Quei "grappoli di frammenti" potrebbero essere pezzi di codice che appartengono al proprio ".emacs" (entro un numero ragionevole, ovviamente). Il codice che genera altro codice non è accigliato in Lisp. – user4815162342

risposta

9

Non esiste un modo diretto per trovare il nome della keymap locale corrente, più precisamente il simbolo al quale è associato il suo valore, poiché la mappa di tasti non deve nemmeno essere associata a un simbolo. Tuttavia, le keymap della modalità in genere sono associate a un simbolo globale, e si può trovare quale è iterando attraverso tutti i simboli e fermandosi su quello il cui valore è eq sull'oggetto keymap.

Questo deve esaminare tutti i simboli (anche se funziona con minimo ciascuno), ma ha il vantaggio di non fare affidamento su qualsiasi particolare convenzione di denominazione.

(defun keymap-symbol (keymap) 
    "Return the symbol to which KEYMAP is bound, or nil if no such symbol exists." 
    (catch 'gotit 
    (mapatoms (lambda (sym) 
       (and (boundp sym) 
        (eq (symbol-value sym) keymap) 
        (not (eq sym 'keymap)) 
        (throw 'gotit sym)))))) 


;; in *scratch*: 
(keymap-symbol (current-local-map)) 
==> lisp-interaction-mode-map 
+0

Grazie. Ho pensato di provare questo come ultima risorsa, ma speravo che ci fosse un altro modo (anche, non ero sicuro contro quali simboli abbinare).La prestazione non è un problema, dal momento che il codice viene eseguito solo una volta, quindi questa è una soluzione per me. – erjoalgo

1

Forse si potrebbe provare:

(define-key (concat (symbol-name major-mode) "-map") [C-f1] 'python-describe-symbol)

edit: Anche se questo produrrebbe l'STRING corretta, dovrebbe ancora essere riconvertito in un simbolo.

+0

Grazie. Come ho detto, non voglio fare affidamento su questa convenzione, ma questa è una buona ipotesi! Penso che le principali modalità seguano la convenzione. – erjoalgo

+1

Tornando a questo dopo un paio di anni di aggiustamenti elisp, si sarebbe solo '(intern (concat ...)))' internare la stringa come un simbolo – erjoalgo

2

La funzione local-set-key esiste allo scopo di tasti vincolante nella corrente keymap locale.

+1

Grazie. Ne ero consapevole. Tuttavia, come ho detto, il mio scopo è generare codice che verrà aggiunto a un file di inizializzazione. Pertanto, al momento dell'inizializzazione, la "chiave set-locale" non associa la chiave alla mappa-chiave desiderata. – erjoalgo