Existe algum terminal Linux que possa lidar com todas as combinações de teclas?

11

Eu gosto de usar o emacs no modo terminal ( -nw ), mas parece que a maioria dos terminais (todos?) não consegue lidar com algumas combinações de teclas - por exemplo, C-<RET> ou C-M-% . Eu sei que isso é porque a maioria dos terminais emulam um VT-100, que não tinha essas combinações. Existem quaisquer terminais Linux (preferencialmente o KDE) que possam lidar com essas combinações de teclas, ou isso é uma limitação fundamental de todos os terminais?

    
por Yossarian 14.06.2013 / 10:36

4 respostas

14

Quando você pressiona uma tecla ou combinação de teclas em um terminal, ela é transmitida para o aplicativo em execução no terminal como uma seqüência de um ou mais caracteres. Por exemplo, quando você pressiona a , o aplicativo recebe a . Quando você pressiona Enter , o aplicativo recebe o caractere CR (a.k.a. ^M (pronuncia-se "control-emm"), a.k.a. o caractere número 13, a.k.a. \r ou 5 ). As combinações de teclas que envolvem Alt são normalmente transmitidas como o caractere ESC (a.ka. ^[ aka \e ou 3 ) seguido pela sequência da combinação de teclas ou chaves sem Alt . Teclas de função e outras combinações de teclas são transmitidas como seqüências de escape iniciando com \e[ ou \eO .

As seqüências de escape não são totalmente padronizadas e os terminais normalmente ignoram certos atributos para determinadas chaves. Por exemplo, Ctrl + Shift + letra é freqüentemente transmitido exatamente como Ctrl + letra por padrão.

Você pode ver o que o seu terminal envia para uma combinação de teclas pressionando Ctrl + V seguido por essa combinação de teclas em um prompt de shell ou C-q ou C-h c seguido pela combinação de teclas no Emacs.

Com alguns emuladores de terminal, você pode configurar as seqüências de escape para cada chave. No Xterm, isso é feito através de recursos X . A maioria das configurações lê recursos de ~/.Xresources quando o X é iniciado e você pode carregar o arquivo manualmente com xrdb -merge ~/.Xresources .

Term.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <key>Return: string("3[73;5~") \n\
    Ctrl Shift ~Meta <key>percent: string("3[37;6~")

Uma convenção comum usa seqüências de escape da forma ESC [ number1 ; number2 ~ para teclas de função com modificadores. number1 indica a tecla de função ( 15 to 24 para F5 para F12 - por razões históricas, F1 a F4 têm diferentes seqüências de escape) e number2 indica o modificador ( 2 para Shift , 5 para Ctrl , 3 para Meta , 8 para Ctrl + Meta , e adicione 1 para + Shift - não, não é muito consistente).

O Emacs traduz seqüências de escape em sua representação de chave interna por meio de input-decode-map or local-function-key-map (ou function-key-map antes do Emacs 23).

(define-key local-function-key-map "3[73;5~" [(control return)])
(define-key local-function-key-map "3[37;6~" [(control ?L)])
    
por 16.06.2013 / 04:02
1

Para um conjunto limitado mas significativo de chaves, assumindo o Konsole do KDE, pode-se fazer o seguinte para ter atalhos de teclado complexos e funcionais no emacs -nw:

Eu usarei minha implementação de obter S-<RET> para funcionar como um exemplo:

  1. Abra um novo konsole, vá para configurações - > perfil atual - > teclado - > editar
  2. Clique em Adicionar e crie uma nova entrada para Return+Shift e dê a ela uma sequência de teclas útil (escolhi \E[27;3 , que acho que é a sequência-chave enviada por X quando eu estava bisbilhotando xev, mas isso pode estar errado - O importante a fazer é garantir que ele tenha uma fuga adequada e não entre em conflito com qualquer outra coisa).
  3. Jogue com ele na pequena área de teste na parte inferior para garantir que esteja funcionando.
  4. Reinicie o konsole.
  5. Inicie emacs -nw e, no buffer de avaliação, avalie:

    (read-key-sequence-vector "Type your new key:")

    digite sua nova combinação de teclas.

    • Se você não estiver familiarizado com isso, escreva a linha, deixe o cursor no final da linha e pressione Cx Ce para fazer o emacs rodar a linha, ele deve dizer para você o que quer que você coloque entre aspas e esperar para você digitar algo.
  6. Ele deve cuspir uma seqüência de teclas que você pode ligar.
    (Ele retornou [27 91 50 55 59 51] para mim ao invés do velho e chato [13] antes de eu mexer no atalho de teclas do konsole.)

  7. Adicione à sua configuração do emacs:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. Eu testei com emacs -nw em uma sessão de tela usando:

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    
por 14.03.2018 / 22:37
0

A resposta curta é que é uma limitação fundamental de todos os terminais.

A resposta um pouco mais longa é que, mesmo que alguém tenha criado um terminal que faça o que você quer, o próprio Emacs exigiria grandes mudanças para trabalhar com esse terminal hipotético.

    
por 15.06.2013 / 06:04
0

Existem alguns esforços para estender o protocolo VT de forma a permitir a entrada do teclado sem perdas (entre outros recursos, como gráficos).

Um exemplo é notty: link

    
por 29.03.2016 / 14:09