Como envio C- / (ou seja, barra de controle) para o terminal?

13

Estou tentando rodar o Emacs em um terminal. Ativei a "opção de uso como meta" nas preferências do terminal e, portanto, cerca de 95% estão funcionando corretamente.

A sequência de teclas ctrl- / (ou na notação Emacs C- /) é "desfazer". Essa sequência de teclas apenas faz com que o terminal toque uma campainha. Como faço para corrigir isso?

Kevin Peterson
fonte
FWIW, isso funciona no iTerm2 - iterm2.com - mas acho que vou me treinar novamente para usar ^ _ em todos os lugares, para ser mais portátil.
Steven R. Loomis
@ StevenR.Loomis portátil? nem control- / nem control-_ funcionam no Android ... #
Michael
@ Michael eu disse portátil porque é representável em ASCII (veja resposta aceita) e, portanto, pode transitar conexões de rede sem problemas. Além disso, parece ser utilizável na maioria dos teclados físicos que eu já vi. Não tentei emparelhar um teclado com o dispositivo Android, você está se referindo a um teclado virtual ou flexível?
Steven R. Loomis
@ StevenR.Loomis software ... a parte de controle parece ser ignorada, resultando em tentativas de desfazer a inserção de uma barra ou sublinhado.
Michael

Respostas:

19

Controle - /não faz parte do conjunto de códigos de controle padrão . Não é diretamente representável como pressionamento de tecla em muitas emulações de terminal. Esse pressionamento de tecla é detectável apenas corretamente em certos "modos de scancode" ou "modo GUI" específicos da plataforma (onde a API informa exatamente quais chaves e modificadores estão sendo usados). O emulador de terminal está emitindo um sinal sonoro, porque é efetivamente um pressionamento de tecla inválido.

Os códigos de controle padrão cobrem apenas as versões "Controle" do

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

Na maioria dos programas de emulador de terminal em execução com a maioria dos layouts de teclas dos EUA, pode ser necessário pressionar Shiftpara gerar alguns dos "códigos de controle":

  • C- @ é ControlShift2(como @é Shift2)
  • C- ^ é ControlShift6(como ^é Shift6)
  • C-_ é ControlShift-(como _é Shift-)
  • No entanto, C-? nem sempre pode ser ControlShift/(como ?é Shift/); C-? geralmente é gerado por Backspace(nos teclados da Apple, a tecla "apenas excluir" sem o símbolo adicional ⌦) ou Delete(aquela com ⌦ nos teclados da Apple).

No Emacs baseado em tty, geralmente você pode usar C-_ para em undovez de C- /.

Chris Johnsen
fonte
1
Obrigado pela resposta completa. Vou tentar jogar com diferentes tipos de terminais para ver se consigo fazê-lo funcionar.
Kevin Peterson
1
"Diferentes tipos de terminais"? Você quer dizer diferentes programas de emulador de terminal ou está se referindo ao valor $ TERM, que no Terminal é definido em Terminal> Preferências> Configurações> [perfil]> Avançado> Declarar terminal como ? (Tudo o que essa preferência faz é definir o valor de $ TERM. Isso não altera a operação da emulação de terminal.) Controle- / é um recurso do X11 e não é suportado pelo Cocoa ou pelo Terminal.
Chris Page
5

Ctrl- / envia 0x1f, que é equivalente a Ctrl-_ desde os dias do VT102. Existem muitos emuladores VT100, mas na verdade são emuladores VT102. O iTerm2 funciona porque está seguindo esse comportamento.

Somente emuladores que cumprem estritamente a especificação VT100 não podem enviar Ctrl- /. Acredito que o aplicativo Terminal seja um deles.

O VT100 mascara 2 bits mais significativos do ASCII de 7 bits quando a tecla de controle é pressionada. / é 0x2f, o é 0x6f. Quando os 2 bits são mascarados, ambos são 0x0f. O VT100 pode enviar Ctrl-o, mas não Ctrl- /.

Kenji Noguchi
fonte
Essa deve ser a resposta aceita.
Ocodo 29/04