Quando pressiono AltUp, A
impresso na tela do terminal. A mesma coisa aconteceu quando eu pressionei, AltDownmas B
é impresso.
Outros personagens que eu percebi;
AltLeft= D
e AltRight=C
Qual é o objetivo desses comandos?
fonte
Quando pressiono AltUp, A
impresso na tela do terminal. A mesma coisa aconteceu quando eu pressionei, AltDownmas B
é impresso.
Outros personagens que eu percebi;
AltLeft= D
e AltRight=C
Qual é o objetivo desses comandos?
Dependendo de como o terminal estiver configurado, digitar Alt+Keyé como digitar as teclas Esce Keyem sequência, para que o caractere ESC (aka \e
ou ^[
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[A
ou \033OA
depende 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á bar
escrito depois de foo
uma 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 zsh
ou vi
lê essa sequência de caracteres do terminal, ele a interpreta como a ação "Up", porque sabe do banco de dados terminfo ( kcuu1
capacidade) que é a sequência de escape enviada ao pressionar Up.
Agora, para Alt-Up, alguns terminais como rxvt
e seus derivados como o eterm
envio \033
seguido pela sequência de escape para Up(que é \033\033[A
ou \033\033OA
), enquanto alguns outros como xterm
ou gnome-terminal
tê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;3A
em 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[A
ou 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. bash
por exemplo, interpretará \033[1;3
como 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[1
portanto, pulará isso e lerá o restante: ;3A
e insira isso no editor de linha.
Muitas aplicações, como vi
, zsh
ou readline
os baseados como gdb
ou bash
(embora tenha cuidado bash
utiliza 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.
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 [[B
valores. 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;3C
está 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
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, bash
esperam 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 comosmm
ermm
.
bash
també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 xterm
introduçã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 xterm
descriçã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:
Poucos programas fariam o primeiro; Alguns editores de texto faria o segundo (na verdade, eu fiz isso para ded
nos final dos anos 1980 ). Os desenvolvedores de aplicativos como bash
o 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. xterm
faz isso para o recurso tcap-query , fornecendo vim
as atribuições reais das teclas de função.
Como nenhuma das seqüências que se bash
comparam às correspondências recebidas, ela pode ficar confusa, optando por correspondências parciais (como o caractere de escape por si só).
Leitura adicional: