2009-05-27 20 views
32

Sto provando a impostare un legame a Ctrl + TAB in Emacs. Ho usato la seguente chiamata:Emacs global-set-key per C-TAB

(global-set-key (read-kbd-macro "C-TAB") 'my-func) 

Tuttavia, ogni volta che lo uso, ho un messaggio di errore

<C-tab> is undefined 

. Cercando di impostare il binding su "C-tab" si ottiene un messaggio di errore.

Come posso impostare l'associazione a C-TAB?

risposta

37
(global-set-key [C-tab] 'my-func) 
+0

grazie la sintassi [] è stato dove ho sbagliato –

3

Invece di utilizzare read-kbd-macro, provare a utilizzare la sintassi più semplice?

;(global-set-key [(control tab)] 'my-func) 

Forse la sintassi più semplice farà la differenza?

Ulteriori informazioni su read-kbd-macro e global-set-key.

+1

Il grande vantaggio di utilizzare '(KBD)' è che si può utilizzare la stessa sintassi che i rendimenti di Emacs quando chiamate 'describe-key', il che rende completamente banale (come dimostrato dalla risposta di Trey). – phils

11

È perché si sta utilizzando read-kbd-macro in modo errato. Quando si vede ciò che è legato ad un tasto:

C-h k C-TAB 

Emacs ti dice:

<C-tab> is undefined. 

è necessario includere il <> nella vostra invocazione read-kbd-macro.

(global-set-key (read-kbd-macro "<C-tab>") 'my-func) 

E, non so come generare <C-TAB>, ma non è la stessa di <C-tab>.

(equal (kbd "<C-TAB>") (kbd "<C-tab>")) 
-> 
nil 
45

A differenza di altri hanno suggerito, è una buona idea usare kbd (o read-kbd-macro che è fondamentalmente la stessa cosa) nel caso in cui vi capitasse di voler utilizzare gli stessi file di configurazione in altre versioni di Emacs; kbd funziona su diverse versioni di Emacs e XEmacs, dove la rappresentazione interna delle sequenze di tasti è diversa.

(global-set-key (kbd "<C-tab>") 'my-func) 

Il formato di ingresso utilizzato da read-kbd-macro è documentato nella docstring di edmacro-mode:

  • Le parole speciali RET, SPC, TAB, DEL, LFD, ESC, e NUL rappresentano speciale caratteri di controllo. Le parole devono essere scritte in maiuscolo.

  • Una parola tra parentesi angolari, ad esempio, < ritorno>, < giù>, o < f1>, rappresenta un tasto funzione. (Notare che nella configurazione standard, il tasto funzione return> e il tasto di controllo RET sono sinonimi.) È possibile utilizzare parentesi angolari sulle parole RET, SPC, ecc., Ma non sono richieste in questo numero .

Questo è scritto un po ', purtroppo; il TAB cui fa riferimento il primo punto elenco è il carattere ASCII per TAB e l'aggiunta del modificatore di controllo non ha alcun senso. Quando premi Control-Tab, Emacs lo vede (tramite il tuo sistema di finestre, non funzionerà in un terminale di testo) come <tab> con un modificatore di Controllo, che puoi rappresentare come C-<tab> o <C-tab>.

+0

C'è una soluzione alternativa per '' in emacs in un terminale di testo? Ho chiesto su serverfault: http://serverfault.com/questions/81688/problem-with-ctrl-tab-keybinding-in-emacs-in-gnome-terminal – Tom

+0

Cosa significa kbd? grazie – why

+0

kbd è una macro documentata su http://www.gnu.org/software/emacs/manual/html_node/elisp/Key-Sequences.html e viene utilizzata per convertire il formato di keybinding utilizzato nella documentazione di Emacs in valori compresi dalle funzioni come ad esempio la chiave globale. –

6

Nota che è anche possibile chiamare in modo interattivo global-set-key. È quindi possibile vedere il comando corretto vincolante con repeat-complex-command (vedi anche KeybindingGuide):

  1. M-x: global-set-key
  2. Digitare la combinazione di tasti che si desidera
  3. Usa C-x ESC ESC (repeat-complex-command) per vedere il comando apropiate. Nel tuo caso ottengo:

    (global-set-key (quote [C-tab]) (quote my-func)) 
    
0

Negli GNU emacs LISP manuale di riferimento, la sezione 21.1 "Sequenze chiave", fanno riferimento usando \ t per rappresentare il tasto tab.

Utilizzando la sintassi mostrata nel manuale di riferimento Lisp, vorrei utilizzare il seguente comando:

(global-set-key (kbd "C-\t") 'my-func)