Existem terminais Linux que podem 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 pode lidar com algumas combinações de teclas - por exemplo, C-<RET>ou C-M-%. Eu sei que isso ocorre porque a maioria dos terminais emula um VT-100, que não possui essas combinações. Existem terminais Linux (de preferência KDE) que podem lidar com essas combinações de teclas, ou isso é uma limitação fundamental de todos os terminais?

Respostas:


15

Quando você pressiona uma tecla ou combinação de teclas em um terminal, ele é transmitido ao aplicativo em execução no terminal como uma sequê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(aka ^M(pronunciado “control-emm”), também conhecido como número 13, aka \rou \015). As combinações de teclas envolvidas Altsão normalmente transmitidas como o caractere ESC(também ^[conhecido como \eou \033) seguido pela sequência da combinação de teclas ou teclas sem Alt. As teclas de função e outras combinações de teclas são transmitidas como seqüências de escape começando com \e[ou \eO.

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

Você pode ver o que o seu terminal envia para uma combinação de teclas pressionando Ctrl+ Vseguido dessa combinação de teclas em um prompt de shell ou C-qouC-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 tecla. Em Xterm, isso é feito através de recursos X . A maioria das configurações lê recursos desde o ~/.Xresourcesinício do X, e você pode carregar o arquivo manualmente com xrdb -merge ~/.Xresources.

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

Uma convenção comum usa seqüências de escape do formulário ESC [ number1 ; number2 ~para teclas de função com modificadores. number1indica a tecla de função ( 15para 24para F5a F12- por razões históricas, F1 a F4ter sequências de escape diferentes) e number2indica o modificador ( 2para Shift, 5para Ctrl, 3para Meta, 8para Ctrl+ Meta, e adicione 1 para +Shift - não, não é muito consistente).

O Emacs converte seqüências de escape em sua representação de chave interna através input-decode-mapoulocal-function-key-map (ou function-key-mapantes do Emacs 23).

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])

Portanto, se entendi corretamente, preciso primeiro definir uma sequência de escape no meu terminal que corresponda a alguma combinação de teclas. Então, no emacs, preciso mapear a sequência de escape de volta para a combinação de teclas. A sequência de escape pode ser arbitrária, desde que não entre em conflito com as definidas em infocmp $TERM?
Yossarian

2
@ Yossarian Sim. Além de não conflitar, as seqüências de escape precisam ser inequívocas, ou seja, nenhuma sequência de escape deve ser o prefixo de outra. Na prática, isso significa que o primeiro caractere deve ser ESC(a menos que você queira tentar um caractere ≥128, mas isso restringirá as possíveis codificações de entrada) e o segundo caractere deve ser algo para o qual você não deseja ESC foovincular.
Gilles 'SO- stop be evil'

Acabei de tentar o que você sugeriu. Deveria local-set-keyser mesmo define-key? O primeiro gera um erro (número errado de argumentos), enquanto o último funciona, pelo menos para <kbd> C-Enter </kbd>. Parece que o konsole ainda tem problemas para enviar <kbd> CM-% </kbd>.
Yossarian

@ Yossarian De fato, deveria ser define-key. Não sei se as chaves de escape do Konsole podem ser configuradas, o xterm é provavelmente mais personalizável do que qualquer outra alternativa.
Gilles 'SO- stop be evil'

1
Observe que o xterm de Thomas Dickey está em desenvolvimento ativo. Com o XTerm*modifyOtherKeys: 2recurso, ele gerará seqüências exclusivas, mesmo para C-M-combinações, mas com essa configuração, você precisará fornecer muitos mapeamentos personalizados ( XTerm*modifyOtherKeys: 1é menos capaz, mas muito mais funcional, pronto para uso). Para um exemplo (ainda que não funcionou para mim), consulte a xterm-extras.elbiblioteca e os arquivos .Xresourcese associados .inputrcno download do easymacs .
phils

1

Para um conjunto limitado mas significativo de chaves, assumindo o konsole do KDE, pode-se fazer o seguinte para ter combinações de teclas complexas e funcionais no emacs -nw:

Vou usar minha implementação de começar S-<RET>a trabalhar como exemplo:

  1. Abra um novo konsole, vá para configurações -> perfil atual -> teclado -> editar
  2. Pressione Adicionar e faça uma nova entrada para Return+Shifte dê uma sequência de teclas útil (eu escolhi\E[27;3 qual eu acho que é a sequência de teclas enviada por X quando estava mexendo com o xev, mas isso pode estar errado - o importante é fazer certifique-se de que tenha uma fuga adequada e não entre em conflito com mais nada).
  3. Brinque com ele na pequena área de teste na parte inferior para garantir que está funcionando.
  4. Reinicie o konsole.
  5. Inicie emacs -nwe, no buffer temporário, avalie:

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

    depois 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 com que o emacs execute essa linha, ele deve dizer o que você colocou entre aspas e esperar que você digite algo.
  6. Deve citar uma sequência de teclas que você pode vincular.
    (Ele retornou [27 91 50 55 59 51]para mim, em oposição ao velho e chato [13]antes de eu mexer com o atolamento 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 emacs -nwem 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)
    

0

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

A resposta um pouco mais longa é que, mesmo que alguém crie um terminal que faça o que você deseja, o próprio Emacs exigiria grandes alterações para trabalhar com esse terminal hipotético.


Esse é um bom ponto sobre o emacs, que nem me ocorreu. Acho que vou começar a usar a GUI.
Yossarian

Isto é o que eu faço.
Hruvulum

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.