Onde encontro uma lista de códigos de teclas de terminal para remapear atalhos no bash?

37

Por exemplo:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

Eu só sei bits e peças, como \e significa escape e C- para Ctrl , mas quais são esses números ( 1 ) e letras ( Z )? Quais são os sinais ; , [ e - ?

Existe apenas tentativa e erro, ou existe uma lista completa de códigos de chave bash e uma explicação de sua sintaxe?

    
por bug 21.05.2013 / 12:25

3 respostas

48

Essas são sequências de caracteres enviados pelo seu terminal quando você pressiona uma determinada tecla. Nada a ver com bash ou readline por si só, mas você vai querer saber qual seqüência de caracteres uma determinada chave ou combinação de teclas envia se você quiser configurar readline para fazer algo em uma determinada tecla pressionada.

Quando você pressiona a tecla A , geralmente os terminais enviam o caractere a (0x61). Se você pressionar <Ctrl-I> ou <Tab> , geralmente envie o caractere ^I , também conhecido como TAB ou \t (0x9). A maioria das teclas de função e navegação geralmente envia uma seqüência de caracteres que começa com ^[ (control- [), também conhecido como ESC ou \e (0x1b, 033 octal), mas a seqüência exata varia de terminal para o terminal.

A melhor maneira de descobrir o que uma chave ou combinação de teclas envia para o seu terminal, é executar sed -n l e digitá-lo seguido por Enter no teclado. Então você verá algo como:

$ sed -n l
^[[1;5A
3[1;5A$

A primeira linha é causada pelo terminal local echo feito pelo dispositivo terminal (pode não ser confiável, pois as configurações do dispositivo terminal o afetariam).

A segunda linha é gerada por sed . O $ não deve ser incluído, é apenas para mostrar onde está o fim da linha.

Acima, isso significa que Ctrl-Up (que eu pressionei) envia os 6 caracteres ESC , [ , 1 , ; , 5 e A (0x1b 0x5b 0x31 0x3b 0x35 0x41)

O banco de dados terminfo registra um número de seqüências para um número de chaves comuns para um número de terminais (com base no valor $TERM ).

Por exemplo:

TERM=rxvt tput kdch1 | sed -n l

Diria a você qual sequência de escape é enviada por rxvt ao pressionar a tecla Excluir .

Você pode procurar qual chave corresponde a uma determinada sequência com seu terminal atual com infocmp (aqui assumindo ncurses infocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

As combinações de teclas como Ctrl-Up não possuem entradas correspondentes no banco de dados terminfo , portanto, para descobrir o que elas enviam, leia a fonte ou a documentação do terminal correspondente ou tente com o método sed -n l descrito acima.

    
por 21.05.2013 / 17:00
4

É fornecido através da biblioteca readline do gnu. você deve procurar em man 3 readline para descobrir sua descrição.

Parece que você também precisa de informações sobre o que os códigos escspe gostam \[A mean. Você pode encontrar essas informações na Wikipédia artigo do código esacape da ANSI .

    
por 21.05.2013 / 12:57
3

Esses códigos vêm da mesma fonte? O último se parece com uma ligação de linha de leitura GNU. Isso é o que o usuário envia para uma festa (veja a resposta de rush). Os dois primeiros, no entanto, parecem mais com seqüências de controle do terminal (mesmo que o primeiro seja um problema -formado um). Isso é o que o bash ou outro programa envia de volta ao emulador de terminal para controlar os movimentos do cursor, cores de texto e afins.

    
por 21.05.2013 / 13:06