Quais são os caracteres impressos quando as teclas Alt + Seta são pressionadas?

13

Quando pressiono AltUp, Aimpresso na tela do terminal. A mesma coisa aconteceu quando eu pressionei, AltDownmas Bé impresso.

Outros personagens que eu percebi;

AltLeft= De AltRight=C

Qual é o objetivo desses comandos?

yfklon
fonte

Respostas:

14

Dependendo de como o terminal estiver configurado, digitar Alt+Keyé como digitar as teclas Esce Keyem sequência, para que o caractere ESC (aka \eou ^[or \033) seja seguido pelo caractere ou sequência de caracteres enviados ao pressionar esse botão Key.

Ao pressionar Up, a maioria dos emuladores de terminal envia os três caracteres \033[Aou \033OAdepende se eles estão no modo de teclado do aplicativo ou não.

O primeiro corresponde à sequência de escape que, quando enviada para o terminal, move o cursor para cima. Se você fizer:

printf '\nfoo\033[Abar\n\n'

Você verá barescrito depois de foouma linha acima. Se você fizer:

stty -echoctl; tput rmkx; read foo

Você verá que as teclas de seta movem o cursor.

Quando um aplicativo gosta zshou vilê essa sequência de caracteres do terminal, ele a interpreta como a ação "Up", porque sabe do banco de dados terminfo ( kcuu1capacidade) que é a sequência de escape enviada ao pressionar Up.

Agora, para Alt-Up, alguns terminais como rxvte seus derivados como o etermenvio \033seguido pela sequência de escape para Up(que é \033\033[Aou \033\033OA), enquanto alguns outros como xtermou gnome-terminaltêm sequências de escape separadas para esses tipos de chaves, quando utilizada com as teclas de combinação como Alt, Shift, Ctrl.

Aqueles normalmente enviar \033[1;3Aem cima Alt-Up.

Quando enviada ao terminal, essa sequência também move o cursor para cima (o segundo parâmetro (3) é ignorado). Não existe uma tecla correspondente no teclado , por isso é a mesma sequência enviada Alt-Upno modo de teclado no aplicativo ou fora dele .

Agora, seja \033\033[Aou não \033[1;3A, muitos aplicativos não sabem para que servem essas sequências. O banco de dados terminfo não os ajudará, porque não existe esse recurso que define quais caracteres essas combinações de teclas enviam.

Eles farão o possível para interpretar essa sequência. bashpor exemplo, interpretará \033[1;3como uma sequência de escape, não sabe nada sobre isso, também não faz nada, seguido por A. zsh, parará de ler assim que descobrir que não há uma sequência de caracteres correspondente conhecida. Não existe uma sequência de escape que ele saiba que começa com, \033[1portanto, pulará isso e lerá o restante: ;3Ae insira isso no editor de linha.

Muitas aplicações, como vi, zshou readlineos baseados como gdbou bash(embora tenha cuidado bashutiliza uma versão modificada readline) permitem adicionar ligações para qualquer sequência de caracteres.

Por exemplo, em zsh, você pode querer vincular Alt-Up, Alt-Downcomo:

bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward

Eles devem procurar o histórico para trás e para frente em busca de linhas de comando que iniciam como a atual até a posição atual do cursor, o que é bastante útil para recuperar comandos anteriores.

Stéphane Chazelas
fonte
3

Você pode usar Crtl+ vpara retornar os códigos de entrada do seu teclado. Se você fazer isso por teclas de seta, você receberá [[D^, [[C^, [[A^, e [[Bvalores. Não há ligações padrão para Altas teclas de seta +, portanto, parece que a ação executada está imprimindo apenas o código da letra. No entanto, se você criar sua versão local do arquivo de configuração da biblioteca readline:

$ cp /etc/inputrc ~/.inputrc

E adicione uma linha:

"\e[1;3C": "sometexthere"

Onde [1;3Cestá o código de entrada de Alt+ (você pode obtê-lo da mesma maneira que antes de usar Crtl+ vatalho) e reiniciar seu terminal, Crtl+ o atalho retornará o texto "sometexthere" e outros Altatalhos de seta + pararão de retornar caracteres.

Em vez de texto, você pode passar um comando vinculável em http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands como

"\e[1;3C": unix-line-discard

para ter o mesmo efeito como Crtl+ u(excluir linha).

Mais informações aqui: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html

Nykakin
fonte
3

A Altchave é frequentemente usada como um meta modificador. As teclas de cursor e de função são chamadas de teclas especiais, pois podem enviar vários caracteres - e os caracteres enviados podem ser alterados.

Alguns usuários, por exemplo, bashesperam que pressionar pressione Altuma tecla prefixada pelo caractere de escape. O recurso "meta" documentado (veja terminfo(5)) lida com o oitavo bit:

Se o terminal possui uma "meta-chave" que atua como uma tecla shift, configurando o 8º bit de qualquer caractere transmitido, esse fato pode ser indicado com km. Caso contrário, o software assumirá que o oitavo bit é paridade e geralmente será limpo. Se existirem cadeias para ativar e desativar esse "modo meta" , elas podem ser fornecidas como smme rmm.

bashtambém sabe disso (consulte as Perguntas frequentes sobre ncurses ), mas poucos de seus usuários estão interessados ​​no recurso. No entanto, eles estão acostumados a se referir Altcomo "meta", mesmo que o modo meta esteja desativado. O rxvt e o xterm têm esse recurso desde (pelo menos) o início dos anos 90.

Outros usuários (desde a xtermintrodução do recurso no patch 94, 1999 ) podem esperar que as informações do modificador sejam codificadas como um parâmetro na sequência de caracteres que uma chave especial enviaria. A documentação do XTerm se refere a essas teclas modificadas como teclas de função "estilo PC" para distingui-las do "estilo VT220" (que não possui modificadores). Uma chave de cursor não modificada pode enviar ESC[A, mas também é legal ter um parâmetro , por exemplo, ESC[5Aque uma aplicação deve entender como repetir que cinco vezes. A primeira versão do xterm's de estilo PC chaves usadas que '5' para denotarcontrol, e uma versão posterior a alterou para evitar confusão com a contagem de repetições. Então...

ESC[5A

sugere que o aplicativo mova o cursor para cima 5 linhas, enquanto

ESC[1;5A

sugere que ele suba uma linha, informando ao aplicativo que uma controltecla foi pressionada.

As combinações úteis estão no banco de dados terminfo ncurses desde 2004 :

# 2004-07-17
#       * add xterm-pc-fkeys -TD

O banco de dados terminfo mostra a versão atual do xterm + pcfkeys com um comentário mostrando como os modificadores são codificados:

# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
#    Code     Modifiers
#  ---------------------------------
#     2       Shift
#     3       Alt
#     4       Shift + Alt
#     5       Control
#     6       Shift + Control
#     7       Alt + Control
#     8       Shift + Alt + Control
#  ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.

(Alt e meta não são necessariamente a mesma chave). Esse é um bloco de construção (por sua vez composto por outros blocos de construção) a partir do qual a xtermdescrição do terminal é formada. Ele usa uma extensão fornecida em ncurses desde 1999, que permite nomes definidos pelo usuário. Como o termcap suporta apenas nomes de 2 caracteres e descrições de 1023 bytes, não havia razão para disponibilizar esses nomes estendidos por meio da interface termcap . Eles estão prontamente disponíveis para aplicativos usando a interface terminfo .

Agora vem uma dificuldade: existem algumas maneiras de um aplicativo determinar o que uma sequência de teclas como essa representa:

  1. analisar a sequência de caracteres completamente
  2. analise-o parcialmente e jogue fora o controlmodificador, se não for necessário
  3. basta comparar a sequência de caracteres com um dicionário, esperando determinar o significado dessa maneira.

Poucos programas fariam o primeiro; Alguns editores de texto faria o segundo (na verdade, eu fiz isso para dednos final dos anos 1980 ). Os desenvolvedores de aplicativos como basho terceiro caminho escolheram assumindo que a maioria das informações está no termocap . Como alternativa, eles poderiam ter escolhido criar uma tabela com informações termcap / terminfo e usar a interface que fornecesse as melhores informações. xtermfaz isso para o recurso tcap-query , fornecendo vimas atribuições reais das teclas de função.

Como nenhuma das seqüências que se bashcomparam às correspondências recebidas, ela pode ficar confusa, optando por correspondências parciais (como o caractere de escape por si só).

Leitura adicional:

Thomas Dickey
fonte