Jak wysłać C- / (czyli Slash Control) do terminala?

13

Próbuję uruchomić Emacsa w terminalu. W preferencjach terminalu włączyłem opcję „Użyj opcji jako meta”, więc około 95% działa poprawnie.

Sekwencja klawiszy ctrl- / (lub w notacji Emacsa C- /) to „cofnij”. Ta sekwencja klawiszy powoduje, że terminal dzwoni dzwonkiem. Jak to naprawić?

Kevin Peterson
źródło
FWIW, to działa w iTerm2 - iterm2.com - ale myślę, że po prostu będę się ponownie trenować, aby używać ^ _ wszędzie, aby być bardziej przenośnym.
Steven R. Loomis,
@ StevenR.Loomis jest przenośny? ani control- / ani control-_ działa pod Androidem ...
Michael
@Michael Powiedziałem przenośny, ponieważ jest reprezentatywny w ASCII (patrz zaakceptowana odpowiedź), a zatem może bez problemu przesyłać połączenia sieciowe. Ponadto wydaje się, że można go stosować na większości fizycznych klawiatur, jakie widziałem. Nie próbowałem sparować klawiatury z urządzeniem z Androidem, czy masz na myśli miękką czy twardą klawiaturę?
Steven R. Loomis
@ Oprogramowanie StevenR.Loomis ... część kontrolna wydaje się być ignorowana, co powoduje próby cofnięcia wstawienia ukośnika lub podkreślenia.
Michael

Odpowiedzi:

19

Sterowanie /nie jest częścią zestawu standardowych kodów sterujących . Nie jest bezpośrednio reprezentowany jako naciśnięcie klawisza w wielu terminalnych emulacjach. Takie naciśnięcie klawisza jest właściwie wykrywalne tylko w niektórych „trybach scancode” lub „trybie GUI” specyficznych dla platformy (gdzie API mówi dokładnie, które klucze i modyfikatory są używane). Emulator terminala wydaje sygnał dźwiękowy, ponieważ jest to właściwie nieprawidłowe naciśnięcie klawisza.

Standardowe kody kontrolne obejmują tylko wersje „Kontrolne” programu

  • @ A- Z [\]^_(ASCII 0–31), oraz
  • ? (ASCII 127)

W większości programów emulatorów terminali działających z większością układów klawiszy w USA może być konieczne naciśnięcie przycisku w Shiftcelu wygenerowania niektórych „kodów sterujących”:

  • C- @ jest ControlShift2(ponieważ @jest Shift2)
  • C- ^ jest ControlShift6(ponieważ ^jest Shift6)
  • C-_ jest ControlShift-(ponieważ _jest Shift-)
  • Jednak C-? nie zawsze może być ControlShift/(skoro ?jest Shift/); DO-? jest zwykle generowany przez albo Backspace(na klawiaturach Apple, klawisz oznaczony po prostu „usuń” bez dodatkowego symbolu ⌦) lub Delete(ten z ⌦ na klawiaturach Apple).

W Emacach opartych na tty zwykle możesz użyć C-_ undozamiast zamiast C- /.

Chris Johnsen
źródło
1
Dzięki za dokładną odpowiedź. Spróbuję grać z różnymi typami terminali, aby sprawdzić, czy uda mi się go uruchomić.
Kevin Peterson
1
„Różne typy terminali”? Czy masz na myśli różne programy emulatora terminali, czy odwołujesz się do wartości $ TERM, którą w Terminalu ustawia się w Terminalu> Preferencje> Ustawienia> [profil]> Zaawansowane> Deklarować terminal jako ? (Jedyne, co robi preferencja, to ustawienie wartości $ TERM. Nie zmienia to działania emulacji terminala.) Control- / jest funkcją X11 i nie jest obsługiwany przez Cocoa ani Terminal.
Chris Page
5

Ctrl- / wysyła 0x1f, co odpowiada Ctrl-_ od dni VT102. Istnieje wiele emulatorów VT100, ale w rzeczywistości są to emulatory VT102. iTerm2 działa, ponieważ śledzi to zachowanie.

Tylko emulatory ściśle zgodne ze specyfikacją VT100 nie mogą wysłać Ctrl- /. Wierzę, że aplikacja Terminal jest jedną z nich.

VT100 maskuje 2 najbardziej znaczące bity 7-bitowego ASCII po naciśnięciu klawisza sterującego. / to 0x2f, o to 0x6f. Gdy 2 bity są maskowane, oba mają wartość 0x0f. VT100 może wysyłać Ctrl-o, ale nie Ctrl- /.

Kenji Noguchi
źródło
To powinna być zaakceptowana odpowiedź.
ocodo