2009-11-24 9 views
26

In emacs, voglio associare un comando a C-i. Così ho inserito (global-set-key "\C-i" 'forward-word)Come si associa un comando a C-i senza modificare il TAB?

nel mio file .emacs. Funziona, tranne che ora il tasto TAB è associato a 'forward-word pure.

Come si associa un comando a C-i senza modificare il TAB?

risposta

29

In breve, questo dovrebbe risolvere il problema per voi:

(setq local-function-key-map (delq '(kp-tab . [9]) local-function-key-map)) 
(global-set-key (kbd "C-i") 'forward-word) 

Longer versione:

Dalle Emacs Lisp documentazione su function keys:

in ASCII, Ci e < TAB> sono lo stesso carattere. Se il terminale può distinguere tra , Emacs trasmette la distinzione ai programmi Lisp rappresentando il primo come l'intero 9 e il secondo come scheda simbolo .

Nella maggior parte dei casi, non è utile per distinguere i due. Quindi normalmente la chiave di posizione locale (vedere Keymap di traduzione) è impostata per mappare la scheda in 9. Pertanto, un legame chiave per il codice carattere 9 (il carattere C-i) si applica anche alla scheda. Allo stesso modo per gli altri simboli in questo gruppo. La funzione read-char converte anche questi eventi in caratteri.

Quindi, una volta che fate quanto segue, si può vedere la differenza nelle combinazioni di tasti:

(setq local-function-key-map (delq '(kp-tab . [9]) local-function-key-map)) 

;; this is C-i 
(global-set-key (kbd "C-i") (lambda() (interactive) (message "C-i"))) 
;; this is <tab> key 
(global-set-key (kbd "<tab>") (lambda() (interactive) (message "<tab>"))) 

nota, ogni modalità imposta i vari TAB attacchi modo diverso, quindi potrebbe essere necessario personalizza per modalità che ti interessa.

Dipendenza Versione:

I lavori di cui sopra per Emacs 23.1. Dal file NEWS: sequenze di tasti

funzione sono ora mappati usando `locale-funzione-chiave-map', una nuova variabile. Questo eredita dalla variabile globale key-map-chiave, che non viene più utilizzata direttamente.

Il che significa, nelle versioni 22 e precedenti, è possibile ottenere lo stesso effetto utilizzando la variabile function-key-map. Ho provato questo e l'ho trovato a lavorare con Emacs 21.

(setq local-function-key-map (delq '(kp-tab . [9]) function-key-map)) 
(global-set-key (kbd "C-i") 'forward-word) 
+0

Quando provo questo codice, ottengo un errore che la mappa-chiave-chiave locale è nullo. Qualche idea sul perché sarebbe nullo? – Steve

+0

@Steve La variabile è definita in Emacs 23, ho aggiornato la risposta con una versione per 22 e precedenti. –

+3

Questo non ha funzionato esattamente per me. Senza alcuna modifica il tasto 'tab' è stato lasciato unbounrd. Ho provato a fare un secondo "global-set-key" per , che ha parzialmente risolto il problema, ma ho impedito il completamento della scheda nel minibuffer. L'uso della soluzione di Caio in basso sembrava fare il trucco. – mksuth

23

ho trovato questa soluzione, dopo tanto dolore, ha perso negli archivi dei messaggi.E 'semplice, evita i conflitti con altri modi, ed è l'unico che ha funzionato per me:

;; Translate the problematic keys to the function key Hyper: 
(keyboard-translate ?\C-i ?\H-i) 
(keyboard-translate ?\C-m ?\H-m) 
;; Rebind then accordantly: 
(global-set-key [?\H-m] 'delete-backward-char) 
(global-set-key [?\H-i] 'iswitchb-buffer) 
1

Questa soluzione, che è una sorta di combinazione dei due precedenti, ha lavorato per me. In questo caso particolare, ho voluto riassegnare C-i alla linea precedente. Questa soluzione conserva la funzionalità di TAB nel minibuffer. Si noti che TAB ha bisogno di essere raffinato a livello locale per le modalità che si utilizzano con un gancio:

; As mentioned in the other solution, C-i and TAB are the same character in ASCII. 
; We have to differentiate between the two and reassign each in a roundabout way. 

; differentiate tab from C-i 
(setq local-function-key-map (delq '(kp-tab . [9]) function-key-map)) 

;; Translate the problematic key to the function key Hyper: 
(keyboard-translate ?\C-i ?\H-i) 

;; Rebind accordingly 
(global-set-key [?\H-i] 'previous-line) 

; Finish by redefining tab for c-mode. 
(defun my-c-mode-common-hook() 
(local-set-key (kbd "<tab>") 'indent-for-tab-command) 
    ) 

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook) 
+0

Nessuno dei metodi descritti in questo thread funziona per me. C-i è ancora legato alla scheda. Qualche idea del perché? – user69818

12

vi consiglio il seguente:

(define-key input-decode-map (kbd "C-i") (kbd "H-i")) 
(global-set-key (kbd "H-i") 'whatever-you-want) 

Dovrebbe funzionare da almeno Emacs 23.

Questo è simile alla tecnica di traduzione da tastiera nella risposta di Caio, ma opera a un livello leggermente più alto.

Lo svantaggio di tastiera-translate è che viene attivato anche quando Emacs non è in esecuzione lettura chiave-sequenza, e in particolare C-q C-i non funzionerà come un modo per inserire un carattere di tabulazione letterale.

Modifica locale-funzione-chiave-map non funziona bene, perché in genere volete che il tasto <tab> di continuare a fare ciò che la modalità corrente è definito per TAB.

+0

Questo ha funzionato per me quando volevo ricollegare C-i. Non ho potuto ottenere il metodo suggerito nella risposta accettata che funziona perfettamente, ma in questo modo l'ho capito. – nonex

1

Forse questo può aiutare, in quanto mi ha aiutato:

Invece di:

; differentiate tab from C-i (setq local-function-key-map (delq '(kp-tab . [9]) function-key-map))

Prova:

(define-key local-function-key-map [tab] nil)

+0

Questo lavoro per me a Emacs 24. – tom

0

mi si avvicinò con la mia soluzione prima vedendo questa domanda:

(define-key input-decode-map [#x2000009] [#x6000069]) ; C-S-i 
(define-key input-decode-map [#x200000d] [#x600006d]) ; C-S-m 
(define-key input-decode-map "\C-i" [#x4000069]) 
(define-key input-decode-map "\C-m" [#x400006d]) 
(define-key input-decode-map "\C-[" [#x400005b]) 

Il motivo per cui funziona è, il codice chiave che il tasto della lettera genera il codice di accesso "reale" [a sinistra], mentre il codice chiave che scheda, entrare, fuga generano sono i simboli dei tasti funzione. I simboli dei tasti funzione sono già mappati in input-decode-map con gli stessi simboli che le lettere generano naturalmente e continueranno a funzionare.

I codici chiave che li ho mappati a utilizzano lo stesso meccanismo dei codici di accesso per C-0, ecc. [Ad es. chiavi che non hanno codici di controllo in ASCII]. Quindi, sono descritti ad es. C-i (poiché sono esclusi dall'involucro speciale che li descrive come TAB/etc) e hanno ancora modificatori di eventi/tipo-evento-base (controllo) /? I.

Lo svantaggio è che sono un po 'più difficili da utilizzare: è necessario utilizzare i numeri, poiché non verranno generati da (kbd) e non è possibile chiamare una funzione o una variabile all'interno di un vettore letterale . Se si lega Ci o Cm a una funzione di movimento, funzionerà con la selezione dello spostamento (poiché anche se sono tasti "falsi" la modalità sa ancora che CSm è spostato e che è equivalente normale è Cm)

NOTA: questo avrà un impatto terminali di testo, quindi se si utilizza terminali di testo sarà necessario rilevare se la GUI è in esecuzione con (when window-system ...) - se si utilizza l'Emacs Demone con finestre grafiche si consiglia di mettere questo in una finestra-setup-hook.

Problemi correlati