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?
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.
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).
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:
Abra um novo konsole, vá para configurações -> perfil atual -> teclado -> editar
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).
Brinque com ele na pequena área de teste na parte inferior para garantir que está funcionando.
Reinicie o konsole.
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.
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.)
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.
infocmp $TERM
?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 desejaESC foo
vincular.local-set-key
ser mesmodefine-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>.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.XTerm*modifyOtherKeys: 2
recurso, ele gerará seqüências exclusivas, mesmo paraC-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 axterm-extras.el
biblioteca e os arquivos.Xresources
e associados.inputrc
no download do easymacs .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:Return+Shift
e 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).Inicie
emacs -nw
e, no buffer temporário, avalie:(read-key-sequence-vector "Type your new key:")
depois digite sua nova combinação de teclas.
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.)Adicione à sua configuração do emacs:
Eu testei
emacs -nw
em uma sessão de tela usando:fonte
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.
fonte
Existem alguns esforços para estender o protocolo VT de forma a permitir a entrada sem perda de teclado (entre outros recursos, como gráficos).
Um exemplo é notty: https://github.com/withoutboats/notty
fonte