Wie sende ich C-/ (d. h. Control-Slash) an das Terminal?

Ich versuche, Emacs in einem Terminal auszuführen. Ich habe die Option "Option als Meta verwenden" in den Terminaleinstellungen aktiviert und es funktioniert zu etwa 95% richtig.

Die Tastenfolge ctrl-/ (oder in Emacs-Notation C-/) ist "undo". Diese Tastenfolge bewirkt lediglich, dass das Terminal klingelt. Wie behebe ich das?

FWIW, das funktioniert in iTerm2 - iterm2.com - aber ich denke, ich werde mich einfach umschulen, um überall ^_ zu verwenden, um tragbarer zu sein.
@StevenR.Loomis tragbar? weder control-/ noch control-_ funktionieren unter Android...
@Michael Ich sagte tragbar, weil es in ASCII darstellbar ist (siehe akzeptierte Antwort) und daher Netzwerkverbindungen problemlos übertragen kann. Außerdem scheint es auf den meisten physischen Tastaturen verwendbar zu sein, die ich gesehen habe. Ich habe nicht versucht, eine Tastatur mit dem Android-Gerät zu koppeln. Beziehen Sie sich auf eine weiche oder harte Tastatur?
@StevenR.Loomis Software ... der Kontrollteil scheint ignoriert zu werden, was zu Versuchen führt, das Einfügen eines Schrägstrichs oder Unterstrichs rückgängig zu machen.

Antworten (4)

Control- /ist nicht Teil des Satzes von Standard-Control-Codes . Es ist in vielen Terminalemulationen nicht direkt als Tastendruck darstellbar. Ein solcher Tastendruck ist nur in bestimmten plattformspezifischen „Scancode-Modi“ oder „GUI-Modus“ (wo die API Ihnen genau sagt, welche Tasten und Modifikatoren verwendet werden) richtig erkennbar. Ihr Terminal-Emulator piepst, weil es sich effektiv um einen ungültigen Tastendruck handelt.

Die Standard-Steuercodes decken nur „Steuer“-Versionen von ab

  • @ AZ [\]^_(ASCII 0 - 31) und
  • ?(ASCII-127)

In den meisten Terminalemulatorprogrammen, die mit den meisten US-Tastenlayouts laufen, müssen Sie möglicherweise drücken Shift, um einige der „Steuercodes“ zu generieren:

  • C-@ ist ControlShift2(seit @ist Shift2)
  • C-^ ist ControlShift6(seit ^ist Shift6)
  • C-_ ist ControlShift-(seit _ist Shift-)
  • C-&agr; muss nicht immer sein ControlShift/(da ?ist Shift/); C-? wird normalerweise entweder durch Backspace(auf Apple-Tastaturen die Taste mit der Bezeichnung „Löschen“ ohne das zusätzliche Symbol ⌦) oder Delete(die mit ⌦ auf Apple-Tastaturen) generiert.

In tty-basierten Emacs können Sie normalerweise C-_ undoanstelle von C-/ verwenden.

Danke für die gründliche Antwort. Ich werde versuchen, mit verschiedenen Terminaltypen zu spielen, um zu sehen, ob ich es zum Laufen bekomme.
"Unterschiedliche Endgerätetypen"? Meinen Sie verschiedene Terminalemulatorprogramme oder beziehen Sie sich auf den $TERM-Wert, der in Terminal über Terminal > Einstellungen > Einstellungen > [Profil] > Erweitert > Terminal deklarieren als festgelegt wird ? (Alles, was diese Einstellung tut, ist den Wert von $TERM zu setzen. Sie ändert nicht die Operation der Terminal-Emulation.) Control-/ ist eine Funktion von X11 und wird von Cocoa oder Terminal nicht unterstützt.

Ctrl-/ sendet 0x1f, was seit den Tagen von VT102 äquivalent zu Ctrl-_ ist. Es gibt viele VT100-Emulatoren, aber sie sind eigentlich VT102-Emulatoren. iTerm2 funktioniert, weil es diesem Verhalten folgt.

Nur Emulatoren, die strikt der VT100-Spezifikation entsprechen, können kein Ctrl-/ senden. Ich glaube, die Terminal-App ist eine davon.

VT100 maskiert die 2 höchstwertigen Bits von 7-Bit-ASCII, wenn die Steuertaste gedrückt wird. / ist 0x2f, o ist 0x6f. Wenn die 2 Bits maskiert sind, sind sie beide 0x0f. VT100 kann Ctrl-o senden, aber nicht Ctrl-/.

Dies sollte die akzeptierte Antwort sein.
Wie wäre es mit Strg-\, das muss man wirklich wissen.

Zu Ihrer Information, mein Problem ist, zu wissen, wie man Keymaps erstellt, Ctrl+\und es stellt sich heraus, dass dies hilfreich ist: https://www.physics.udel.edu/~watson/scen103/ascii.html .

Sie können dies als Beispiel verwenden, um zu finden, was Sie wollenCtrl+/

Danke für diese Antwort: https://apple.stackexchange.com/a/260566/472959 , fügen Sie diesen Inhalt hinzu zu ~/Library/KeyBindings/DefaultKeyBinding.dict:

{
    "^/" = "noop:";
}

dann neu starten, diese lästige Glocke verschwindet.