2012-05-18 20 views
5

Questo s-espressione nel mio .emacs di file non produce il risultato desiderato:Come si associa C- = in emacs?

(define-key global-map (kbd "C-=") 'djhaskin987-untab-to-tab-stop) 

Perché non è possibile associare un comando per Ctrl +=?

EDIT di chiarimenti:

Sto usando emacs23-nox sulla costruzione standard urxvt-256colors per Debian, se non che hanno ricompilato con --disable-iso405776 (o qualcosa in tal senso), in modo che Ctrl + Maiusc non fa la strana cosa 'inserisci carattere'. Non so se questo influisce su qualcosa. Ad esempio, C-M-i manda M-TAB, che non capisco.

EDIT II:

Mi scuso per non aver chiarito questo punto. La funzione djhaskin987-untab-to-tab-stop contiene la riga (interactive). Questa parte funziona.

+1

C-i è generalmente tradotto come 'TAB' in emacs. Quindi non sono sorpreso se 'C-M-i' è tradotto come' M-TAB' – kindahero

risposta

6

In un terminale, TAB è rappresentata dalla stessa sequenza di byte come C-i. E tipicamente il terminale ha alcuna speciale byte-sequenza C- =, quindi sarà sufficiente inviare una =. Non c'è niente che Emacs possa fare al riguardo. Ma si potrebbe essere in grado di insegnare il vostro emulatore di terminale per inviare qualche particolare sequenza di byte di vostra scelta (controllare la documentazione del proprio emulatore di terminale per quello), dopo di che si può insegnare Emacs a riconoscere come un C = (con qualcosa come (define-key input-decode-map "...thebytes..." [?\C-=])).

+1

grazie Stefan .. è molto utile .. Ad esempio, in questo pacchetto qualcuno ha impiegato molto dolore per rendere xterm funzionante meglio con emacs. http://www.dur.ac.uk/p.j.heslin/Software/Emacs/Download/xterm-extras.el (vedi il commento per il file .Xresource) – kindahero

+0

+1 Grazie per avermi aiutato a risolvere il mio problema. Posso vedere questa è la strada da percorrere. – djhaskin987

+0

Forse è meglio modificare nella soluzione reale: il file collegato viene compresso e il collegamento potrebbe facilmente interrompersi. È 'C- =' speciale nei terminali? La strategia generale sembra essere quella di tradurre le chiavi X in sequenze di escape del terminale inutilizzate e quindi definire le chiavi di emacs per questi e altri escape di terminale precedentemente non definiti (e quindi associare quei tasti alle funzioni). –

0

La funzione che si sta impegnando deve essere interattiva. Prova:

(define-key global-map (kbd "C-=") 
    (lambda() (interactive) (djhaskin987-untab-to-tab-stop))) 
+0

Non ho paura, ma grazie per il suggerimento. Quando uso questa linea (o la mia) e premo CTRL + =, scrive solo un '=' nel buffer. – djhaskin987

1

Il problema è che si utilizza emacs nel terminale. Il terminale non consente "C- =". Prova la tua funzione nel grafico emacs e funzionerà. Dovrai trovare un'altra combinazione di tasti per il terminale.

+1

Mi rendo conto di questo, ma ai fini delle preferenze personali (in modo che possa accedere a emacs anche tramite SSH, e così tutte le mie cose sono nel terminale), voglio fare C- = lavorare anche nel terminale. – djhaskin987

5

La risposta accettata in combinazione con il link in the first comment to it è sufficiente per iniziare una soluzione completa. I passi sono:

  1. rendere i codici di uscita di escape del terminale per il tasto
  2. rendere Emacs riconoscono i codici di escape come la pressione dei tasti standard di
  3. legano la pressione del tasto in una mappa modalità

La prima è molto terminale e/o dipendente dal sistema operativo.

Il collegamento nel primo commento mostra alcuni esempi per X Window System. I nomi dei tasti sono disponibili in /usr/X11R6/include/X11/keysymdef.h (o provare locate keysymdef.h), con prefisso XK_ (che deve essere rimosso per i nostri scopi).Ho letto che i nomi simbolici sono preferiti rispetto ai letterali chiave.

Io attualmente non corro X, ma penso che dovrebbe assomigliare a questo nel tuo caso:

XTerm.VT100.Translations: #override \ 
Ctrl ~Meta ~Shift <Key> equal:   string(0x1b) string("[emacs-C-=")\n 

La prima stringa è la fuga, il secondo è di tua scelta.

In iTerm è possibile utilizzare Preferences->Keys e scegliere Send Escape Sequence come Action. Ad esempio, ho:

iTerm key mappings

Emacs Wiki lists some configuration methods per altri terminali.

Ora è possibile insegnare a Emacs a riconoscerlo come C- =. Prima define-key in input-decode-map. Ho un paio di funzioni di supporto:

(defun my/global-map-and-set-key (key command &optional prefix suffix) 
    "`my/map-key' KEY then `global-set-key' KEY with COMMAND. 
PREFIX or SUFFIX can wrap the key when passing to `global-set-key'." 
    (my/map-key key) 
    (global-set-key (kbd (concat prefix key suffix)) command)) 

(defun my/map-key (key) 
    "Map KEY from escape sequence \"\e[emacs-KEY\." 
    (define-key function-key-map (concat "\e[emacs-" key) (kbd key))) 

Dunque:

(my/global-map-and-set-key "C-=" 'some-function-to-bind-to) 

Alcuni tasti (attualmente: ()\|;'`"#.,) avrà bisogno di fuggire nella stringa, come C-\..

Problemi correlati