Ich möchte etwas Control-i
performen indent-region
(im Grunde genommen, da Xcode dieses Muskelgedächtnis bereits aufgebaut hat).
Ich erkenne das Control-i
und bin tab
im Ascii-Sinne nicht zu unterscheiden, aber im Keycode-Sinne.
Ich habe das Offensichtliche versucht:
(global-unset-key (kbd "C-i"))
(global-set-key (kbd "C-i") 'indent-region)
erfolglos - drücken Control-i
macht immer noch, was auch immer die tab
Taste im aktuellen Kontext tut. Kann ich Emacs helfen, die Tabulatortaste anders zu behandeln als Control-i
?
Update: Ich schätze, ein gleichwertiges Ergebnis wird erzielt, wenn Sie neu zuordnen können, was eine tab
/ Control-i
Presse tut, wenn eine Region ausgewählt wird.
Antworten:
Ich glaube nicht, dass dies von einem Terminal aus erreicht werden kann, aber im GUI-Modus können Sie Folgendes versuchen:
Ich mache dasselbe
C-m
damit, damit man es unterscheiden kannRET
BEARBEITEN:
Folgendes sollte funktionieren, egal ob Sie sich im GUI- oder TTY-Modus befinden:
Es ist nicht schön, aber es scheint den Job zu machen. Verfeinerungen oder Änderungen an diesem Code sind mir bei Bedarf willkommen.
quelle
<C-i>
und[C-i]
ein beliebiger Bezeichner sein könnte, wie<foobar>
und[foobar]
, und es würde immer noch funktionieren; Nennen Sie es einfach nichttab
oderbackspace
GUI-Frames
In GUI-Frames (ob X11, Windows, OSX, ...) liest Emacs die TabTaste als
tab
Funktionstaste. Da die TabTaste auf den Terminals traditionell das Zeichen^I
( Strg + I) sendet , übersetzt Emacs dietab
Funktionstaste in das Zeichen Strg + I (Zeichen 9), das als angezeigt wirdTAB
. Diese Übersetzung erfolgt überfunction-key-map
.Eine ähnliche Übersetzung erfolgt mit einigen anderen Funktionstasten. ( BackspaceUnd Deletees handelt sich um einen heiklen Fall, auf den ich hier nicht näher eingehen werde.)
Wenn Sie sich Tabvon Ctrl+ trennen möchten I, entfernen Sie die Bindung von
function-key-map
:Dies ist jedoch nicht sehr nützlich, da Einträge in
function-key-map
durch Bindungen in modusspezifischen Keymaps oder in der globalen Zuordnung überschrieben werden. Wenn Sie also eine andere Bindung definieren möchtentab
, tun Sie dies einfach (in Elisp, nicht interaktiv, da die Eingabeaufforderung zum Lesen des Schlüssels diefunction-key-map
Übersetzung anwendet, sodass Sie erneut bindenTAB
und nichttab
):Alle Standardmodi, die die Aktion der TabTaste ändern, ändern dazu die Taste. Dies
TAB
ist ein Kurzname für dasC-i
durch die Tastenkombination Ctrl+ erzeugte Zeichen I. Wenn Sie Standard - Bindings anwenden möchtentab
als vielmehrC-i
, verlassenfunction-key-map
und Modus keymaps allein und stattdessen Umleitung Ctrl+ Izu einem anderen Schlüssel.Jetzt wird Emacs Ctrl+ Ials "
<control-i>
(übersetzt vonTAB
)" melden . Das ist nicht schön, aber es ist unvermeidlich: das schöne Drucken von Zeichen 9, wieTAB
es im Emacs-Quellcode enthalten ist.Terminalrahmen
In Terminal-Frames ist das Problem schwerer und oft unmöglich. Terminals übertragen keine Schlüssel, sie übertragen Zeichen (genauer gesagt, sie übertragen Bytes). Die TabTaste wird als Tabulatorzeichen übertragen - das ist Strg + I, genau wie das, was die Tastenkombination Ctrl+ Ierzeugt. Funktionstasten, die kein entsprechendes Zeichen enthalten (z. B. Cursortasten), werden als Escape-Sequenzen übertragen, dh Sequenzen von Zeichen, die mit
ESC
= Strg + [beginnen (weshalb Emacs escapeals Präfix-Taste definiert -ESC
muss ein Präfix sein). Siehe Wie funktionieren Tastatureingaben und Textausgaben? für mehr hintergrund.Es gibt einige Terminals, die so konfiguriert werden können, dass sie unterschiedliche Tastenfolgen für Funktionstasten senden, aber nicht viele. Dies wird sowohl von LeoNerds libtermkey / libtickit als auch von Thomas Dickeys xterm (seit Version 216) unterstützt. In Xterm ist die Funktion optional und wird über die
modifyOtherKeys
Ressource aktiviert . Ich kenne jedoch keinen anderen beliebten Terminal-Emulator als xterm, der dies unterstützt, insbesondere die vielen Emulatoren, die auf libvte basieren . Bei einigen Terminal-Emulatoren können Sie dies manuell über eine benutzerdefinierte Entsprechung von Tastenkombinationen zu Escape-Sequenzen ausführen.Mit diesem Mechanismus können viele Tastenkombinationen unterschieden werden, nicht nur tab / Ci, return / Cm und escape / C- [. Eine ausführlichere Beschreibung finden Sie unter Probleme mit der Tastaturbelegung bei Verwendung des Terminals .
Die grundlegende xterm-Funktion wird seit Emacs 24.4 unterstützt. Allerdings sind die Grundlagen (insbesondere Tab, Return, Escape, Backspace) nach wie vor die traditionellen Steuerzeichen senden, weil das, was Anwendungen erwarten. Es gibt einen Modus, in dem Ctrl+ letteranstelle des Steuerzeichens eine Escape-Sequenz sendet. CtrlUm die Funktionstasten von den Kombinationen in Emacs 24.4 zu unterscheiden, ändern Sie die Unterstützung für
modifyOtherKeys
diesen Modus, indem Sie die Ressource auf 2 statt auf 1 setzen.quelle