Por que o Emacs rodando em um terminal não consegue distinguir Ctrl +; de ";"?


8

Esta questão surgiu da minha pergunta anterior no emacs beta . Em resumo, quero vincular C-;a uma função do Emacs em um terminal, mas parece que algo captura essa tecla antes de chegar ao Emacs: o Emacs acha que eu pressionei ;.

O suspeito óbvio é o emulador de terminal, mas verifiquei muitos deles (xterm, gnome-terminal, terminator, terminologia) e nenhum deles funciona. Provavelmente, posso excluir o gerenciador de janelas, porque na versão GUI do Emacs, a chave C-;funciona muito bem. Tentei também duas conchas diferentes: bash e zsh, mas novamente sem sucesso.

O que mais posso tentar?


De acordo com sua pergunta no Emacs , pressione Ctrl +; envia ;para o Emacs, então nada está capturando , o que está acontecendo é que Ctrl +; e nua; envie a mesma informação. Qual é: captura (por exemplo, o Emacs não recebe nada) ou perda de informações (por exemplo, o Emacs recebe ;)?
Gilles 'SO- stop be evil'

não há código padrão para C-;no terminal. O que acontece se você digitar C-v C-;bash simples?
Art #

@Gilles vejo ;na emacs -nwindependentemente se eu acertar ;ou C-;.
WeSenseASoulInSearchOfAnswers

@artm, bashassim como as impressões do emacs, simplesmente vazias ;.
WeSenseASoulInSearchOfAnswers

Respostas:


11

Talvez sua confusão resulte de não ter usado um terminal real. Quando computadores sérios eram do tamanho de vários refrigeradores verticais, um terminal se comunicava com um computador central por um cabo serial usando apenas caracteres e caracteres. Os caracteres faziam parte de alguns conjuntos de caracteres padronizados, por exemplo, ASCII ou EBCDIC, mas geralmente ASCII. O ASCII possui 33 caracteres de controle e o operador do terminal os enviou pressionando uma tecla especial (como DEL) ou mantendo pressionada a tecla CTRL e pressionando outra tecla. O computador central viu apenas o caractere de controle resultante; não sabia quais teclas foram pressionadas para produzir o personagem.

Um programa de emulação de terminal, como o xterm, imita esse comportamento. O emulador de terminal fornece uma maneira de enviar todos os 33 caracteres de controle ASCII e o Emacs receberá esses caracteres se forem enviados. Mas o Emacs é como o computador central na descrição acima - ele não tem como saber quais teclas foram realmente pressionadas quando você o executa em um emulador de terminal. Portanto, se você pressionar CTRL e ponto e vírgula, a menos que o programa de emulação de terminal tenha mapeado essas teclas para algum caractere ASCII, o Emacs não saberá que algo foi digitado.

Emuladores de terminal normalmente usam os seguintes mapeamentos para gerar caracteres de controle :

pressionar ASCII
--------------------
ESCAPE 27
DELETE 127
BACKSPACE 8
CTRL + ESPAÇO 0
CTRL + @ 0
CTRL + A 1
CTRL + B 2
CTRL + C 3
etc ...
CTRL + X 24
CTRL + Y 25
CTRL + Z 26
CTRL + [27
CTRL + \ 28
CTRL +] 29
CTRL + ^ 30
CTRL + _ 31

Observe que CTRL +; não aparece nessa lista. Terminais geralmente basta enviar o carácter de impressão atribuído a chave se CTRL + chave não está mapeado para um caractere de controle. Então, o que seu emulador de terminal está dizendo a você enviando; sozinho é que ele não sabe o que fazer quando você pressiona CTRL + ;.

Tudo isso se aplica apenas se você estiver usando um terminal ou um programa de emulação de terminal. Se você estiver executando o Emacs como um aplicativo nativo em algum sistema de janelas, o Emacs terá acesso total aos eventos de pressionamento de tecla e não apenas aos caracteres. Assim, o Emacs pode ver que você pressionou CTRL e ponto e vírgula juntos e permite atribuir uma ação a esse par de pressionamentos de tecla.

† Os terminais geralmente têm teclas de função e teclas de seta que também geram seqüências de caracteres que incluem caracteres de controle. Essas seqüências geralmente começam com o código ASCII 27 (ESCAPE).


3

Os terminais transmitem caracteres (mais precisamente: bytes), não chaves. Quando você pressiona uma tecla ou um teclado como Ctrl+ ;, essas informações devem ser codificadas em uma sequência de bytes. Keychords que representam um personagem, como Aou Shift+ Aou À, são enviados como esse personagem: a, A, à(sendo o último um ou dois bytes dependendo codificação de caracteres do terminal).

Os acordes de teclas que envolvem teclas de função não possuem caractere correspondente; portanto, eles são enviados como seqüências de escape: uma sequência de bytes começando com o caractere de escape ( \eem uma string Emacs, aparecendo em ciano ^[se inserido literalmente em um buffer). Algumas teclas de função possuem bytes correspondentes, que são caracteres de controle .

O keychord Ctrl+ ;não possui uma sequência de escape padrão; portanto, a maioria dos emuladores de terminal gera o caractere ;. Isso perde as informações que o Ctrlmodificador foi pressionado.

Para definir uma ligação para Ctrl+ ;, você precisará configurar o emulador de terminal para enviar uma sequência de escape diferente. Eu não acho que você pode fazer isso com o terminal Gnome (o Gnome raramente é configurável). Você pode fazer isso com o Xterm. Consulte Existem terminais Linux que podem lidar com todas as combinações de teclas? para instruções.

O shell que você pode executar no terminal não está envolvido. Uma GUI Emacs não tem problema porque a GUI (X11) transmite eventos de entrada de uma forma que codifica chaves e modificadores, não como uma mera sequência de caracteres.

Consulte Como funcionam a entrada do teclado e a saída de texto? para obter informações mais detalhadas sobre como a entrada é transferida do teclado para o aplicativo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.