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

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

Quando pressiono AltUp, Aimprimo na tela do terminal. A mesma coisa aconteceu quando pressionei, AltDownmas Bem vez disso foi impresso.

Outros personagens que percebi;

AltLeft= De AltRight=C

Qual é o propósito desses comandos?

Responder1

Dependendo de como o terminal está configurado, digitar Alt+Keyé como digitar as teclas Esce Keyem sequência, então ele envia o caractere ESC (também conhecido como \eou ^[ou \033) seguido pelo caractere ou sequência de caracteres enviados ao pressionar aquele Key.

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

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

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

Você verá barescrito após foouma linha acima. Se você fizer:

stty -echoctl; tput rmkx; read foo

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

Quando uma aplicação gosta zshou vilê essa sequência de caracteres do terminal, ela a interpreta como a ação "Up", pois sabe pelo banco de dados terminfo ( kcuu1capacidade) que é a sequência de escape enviada ao pressionar Up.

Agora, para Alt-Up, alguns terminais gostam rxvte seus derivados, como send etermseguido \033pela sequência de escape for Up(ou seja, \033\033[Aou \033\033OA), enquanto outros gostam xtermou gnome-terminaltêm sequências de escape separadas para esses tipos de chaves quando usadas com teclas de combinação como Alt,,, .ShiftCtrl

Eles normalmente serão enviados \033[1;3Aem Alt-Up.

Quando enviada ao terminal, essa sequência também moverá o cursor para cima (o segundo parâmetro (3) é ignorado). Não há correspondentetecladochave, então é a mesma sequência enviada para Alt-Updentro ou para foramodo de teclado do aplicativo.

Agora, seja \033\033[Aou \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 tal capacidade que defina quais caracteres essas combinações de teclas enviam.

Eles farão o possível para interpretar essa sequência. bashpor exemplo, será interpretado \033[1;3como uma sequência de escape, não sabe nada sobre isso, então não faz nada, seguido por A. zsh, interromperá a leitura assim que descobrir que não há nenhuma sequência de caracteres correspondente conhecida. Não há nenhuma sequência de escape que ele saiba que começa, \033[1então ele irá pular isso e ler o resto: ;3Ae inserir isso no editor de linha.

Muitos aplicativos como vi, zshou readlinebaseados em gdbou bash(embora cuidado, bashuse uma versão modificada de 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 servem para pesquisar no histórico para frente e para trás em busca de linhas de comando que comecem como a atual até a posição atual do cursor, o que é bastante útil para recuperar comandos anteriores.

Responder2

Você pode usar Crtl+ vpara retornar códigos de entrada do seu teclado. Se você fizer isso com as teclas de seta, obterá os valores [[D^, [[C^, [[A^e [[B. Não há ligações padrão para Altteclas de seta +, então parece que a ação executada é imprimir 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 Alt+ (você pode obtê-lo da mesma maneira que antes usando Crtl+ vatalho) e reinicie seu terminal, então Crtl+ atalho retornará o texto "sometextthere" e outros Altatalhos de seta pararão de retornar caracteres.

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

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

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

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

Responder3

A Altchave é frequentemente usada comometamodificador. As teclas de cursor e de função são referidas comochaves especiaisjá que podem enviar vários caracteres - e os caracteres enviados podem ser alterados.

Alguns usuários, por exemplo, bashesperam que pressionar Altenviará uma tecla prefixada pelo caractere de escape. O recurso "meta" documentado (vejaterminfo(5)) trata do oitavo bit:

Caso o terminal possua uma "meta-chave" que atua como tecla shift, configurando o 8º bit de qualquer caracter transmitido, este fato pode ser indicado comkm. Caso contrário, o software assumirá que o 8º bit é paridade e normalmente será apagado. Se existirem strings para transformar isso"metamodo" ligado e desligado, eles podem ser dados comosmmermm.

bashtambém sabe disso (vejaPerguntas 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 meta modo esteja desativado. Tanto o rxvt quanto o xterm possuem esse recurso desde (pelo menos) o início dos anos 1990.

Outros usuários (desde que xtermintroduziram o recurso empatch #94, 1999) pode 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 referiu-se a essas chaves modificadas como"Estilo PC"teclas de função para distingui-los de"Estilo VT220"(que não tinha modificadores). Uma tecla de cursor não modificada pode enviar ESC[A, mas também é legal ter umparâmetro, por exemplo, ESC[5A, que um aplicativodeveentenda como repetir isso cinco vezes. A primeira versão de xterm'sEstilo PCas teclas usaram aquele "5" para denotar controle uma versão posterior o alterou para evitar confusão com a contagem de repetições. Então...

ESC[5A

sugere que o aplicativo mova o cursor 5 linhas para cima, 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 ncurses terminfo desde2004:

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

O banco de dados terminfo mostra a versão atual doxterm+pcfkeyscom 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). Aquilo é umbloco de construção(por sua vez composto por outros blocos de construção) a partir dos quais oxterma descrição do terminal é formada. Ele usa uma extensão fornecida em ncursesdesde 1999que 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 através dotermcapinterface. Eles estão prontamente disponíveis para aplicativos que usam oinformações do termointerface.

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

  1. analise 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, na esperança de determinar o significado dessa forma.

Poucos programas fariam o primeiro; alguns editores de texto fariam o segundo (na verdade, eu fizesseparadednofinal da década de 1980). Os desenvolvedores de aplicativos como o bashescolheram o terceiro caminho, assumindo que a maior parte da informação está emtermcap. Alternativamente, eles poderiam ter optado por fazer uma tabela com informações termcap/terminfo e usar a interface que fornecesse as melhores informações. xtermfaz isso paraconsulta tcaprecurso, fornecendo vimas atribuições reais das teclas de função.

Como nenhuma das strings bashcomparadas corresponde às strings recebidas, ele pode ficar confuso, optando por correspondências parciais (como o caractere de escape por si só).

Leitura adicional:

informação relacionada