2012-05-18 9 views
5

Dieser s-Ausdruck in meiner .emacs Datei nicht das gewünschte Ergebnis:Wie binde ich C- = in Emacs?

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

Warum kann ich nicht binden, um einen Befehl zu Ctrl +=?

EDIT zur Klarstellung:

I emacs23-nox auf dem Standard-Build von urxvt-256colors für Debian bin mit der Ausnahme, dass ich mit --disable-iso405776 (oder etwas in diesem Sinne) neu kompiliert habe es so, dass Ctrl + Umschalttaste macht nicht das seltsame Ding "einfügen". Ich weiß nicht, ob das irgendwas betrifft. Zum Beispiel, C-M-ich sendet M-TAB, die ich nicht verstehe.

EDIT II:

Ich entschuldige mich für diese klare nicht machen. Die Funktion djhaskin987-untab-to-tab-stop hat die Zeile (interactive) drin. Dieser Teil funktioniert.

+1

C-i wird im Allgemeinen als "TAB" in Emacs übersetzt. Ich bin also nicht überrascht, wenn 'C-M-i' mit' M-TAB' übersetzt wird. – kindahero

Antwort

6

In einem Terminal, TAB wird durch die gleiche Bytefolge als C-i dargestellt. Und typischerweise hat das Terminal keine spezielle Byte-Sequenz für C- =, so dass es nur eine = senden wird. Es gibt nichts, was Emacs dagegen tun kann. Sie können Ihrem Terminal-Emulator jedoch vielleicht beibringen, eine spezielle Byte-Sequenz Ihrer Wahl zu senden (sehen Sie dazu in der Dokumentation Ihres Terminalemulators nach). Danach können Sie Emacs lehren, sie als C- = (mit etwas) zu erkennen wie (define-key input-decode-map "...thebytes..." [?\C-=])).

+1

danke Stefan .. das ist sehr nützlich .. Für zB .. in diesem Paket hat jemand viel Schmerzen genommen, um xterm besser mit Emacs arbeiten zu lassen. http://www.dur.ac.uk/p.j.heslin/Software/Emacs/Download/xterm-extras.el (siehe Kommentar für .Xresource-Datei) – kindahero

+0

+1 Danke, dass Sie mir geholfen haben, mein Problem zu lösen. Ich kann sehen, dass dies der richtige Weg ist. – djhaskin987

+0

Vielleicht ist es besser, in der tatsächlichen Lösung zu bearbeiten - die verknüpfte Datei kommt komprimiert und die Verbindung könnte leicht brechen. Ist 'C- =' speziell in Terminals? Die allgemeine Strategie scheint darin zu bestehen, X-Schlüssel in unbenutzte Terminal-Escape-Sequenzen zu übersetzen und dann Emacs-Schlüssel für diese und andere zuvor nicht definierte Terminal-Escapes zu definieren (und diese dann an Funktionen zu binden). –

0

Die Funktion, die Sie binden, muss interaktiv sein. Versuchen Sie:

+0

Ich fürchte nicht, aber danke für den Tipp. Wenn ich diese Zeile (oder meine) benutze und STRG + = drücke, schreibt sie einfach ein '=' in den Puffer. – djhaskin987

1

Das Problem ist, dass Sie Emacs im Terminal verwenden. Das Terminal lässt "C- =" nicht zu. Versuchen Sie Ihre Funktion in den grafischen Emacs und es wird funktionieren. Sie müssen eine andere Tastatur für das Terminal finden.

+1

Ich realisiere das, aber aus persönlichen Gründen (damit ich auch über SSH auf Emacs zugreifen kann, und damit alle meine Sachen im Terminal sind), möchte ich C- = sogar im Terminal arbeiten lassen. – djhaskin987

5

Die akzeptierte Antwort in Kombination mit der link in the first comment to it reicht aus, um mit einer Komplettlösung zu beginnen. Die Schritte sind:

  1. Terminalausgang Escape-Codes machen für den Schlüssel
  2. Emacs machen die Escape-Codes als Standard keypress
  3. binden die keypress in einem Modus Karte erkennen

der ersten ist sehr terminal und/oder Betriebssystem abhängig.

Der Link im ersten Kommentar zeigt einige Beispiele für X Window System. Die Schlüsselnamen sind in /usr/X11R6/include/X11/keysymdef.h verfügbar (oder versuchen Sie locate keysymdef.h) mit dem Präfix XK_ (das für unsere Zwecke entfernt werden sollte).Ich habe gelesen, dass symbolische Namen den Schlüsselliteralen vorgezogen werden.

ich derzeit nicht X laufen, aber ich denke, es ist, wie dies in Ihrem Fall aussehen sollte:

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

Der erste String ist die Flucht, die zweite ist Ihrer Wahl.

In iTerm können Sie Preferences->Keys verwenden und Send Escape Sequence als Action wählen. Zum Beispiel habe ich:

iTerm key mappings

Emacs Wiki lists some configuration methods für andere Endgeräte.

Jetzt können Sie Emacs lehren, es als C- = zu erkennen. Zuerst define-key in input-decode-map. Ich habe ein paar Hilfsfunktionen:

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

Also:

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

Einige Tasten (aktuell: ()\|;'`"#.,) müssen in der Zeichenfolge zu entkommen, wie C-\..