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

42

Por exemplo:

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

Sei apenas pedaços, como \esuportes para escape e C-para Ctrl, mas quais são esses números ( 1) e letras ( Z)? Quais são as ;, [e -indicações para?

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

erro
fonte
2
Uma dica adicional para listar as ligações reais da linha de leitura do shell é bind -p.
1
A maioria desses códigos é interpretada pelo seu terminal; leia sobre os códigos de escape ANSI na Wikipedia para obter uma lista grande.
Chepner # 21/13
stty -a exibe as configurações de linha do terminal
bug

Respostas:

52

Essas são seqüências de caracteres enviadas pelo seu terminal quando você pressiona uma tecla específica. Nada a ver com bash ou linha de leitura propriamente dita, mas você desejará saber qual sequência de caracteres uma determinada tecla ou combinação de teclas envia se desejar configurar readlinepara fazer algo após pressionar uma tecla.

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

A melhor maneira de descobrir o que uma tecla ou combinação de teclas envia para o seu terminal é executar sed -n le digitar seguido pelo Enterteclado. Então você verá algo como:

$ sed -n l
^[[1;5A
\033[1;5A$

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

A segunda linha é emitida 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 tenha pressionado) enviar os 6 caracteres ESC, [, 1, ;, 5e A(0x1b 0x5b 0x31 0x3b 0x35 0x41)

O terminfobanco de dados registra várias sequências para várias chaves comuns para vários terminais (com base no $TERMvalor).

Por exemplo:

TERM=rxvt tput kdch1 | sed -n l

Diria qual sequência de escape é enviada rxvtao pressionar a Deletetecla.

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

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

Combinações de teclas como Ctrl-Upnão possuem entradas correspondentes no terminfobanco de dados; portanto, para descobrir o que elas enviam, leia a fonte ou a documentação do terminal correspondente ou tente com o sed -n lmétodo descrito acima.

Stéphane Chazelas
fonte
Esta é uma ótima explicação, obrigado! Agora tudo cai no lugar, \e-1\C-ié um guia para trás, porque controle iinsere uma guia e escapeseguido por -1diz bash para fazê-lo para trás uma vez (I arregalou isso e encontrei algumas coisas sobre digit-arguments).
bug
$ sed -n 1 sed: -e expression #1, char 1: missing command
Cnvzmxcvmcx
3
@vib. Isso é minúsculo L não dígito 1
Stéphane Chazelas
1
@ user367890, esse é o modo do teclado . Você provavelmente descobrirá que depois tput smkx, seu terminal envia \e[OD( kcub1) e depois tput rmkx, \e[D( cub1, o mesmo código da sequência que move o cursor para a esquerda, para que o eco dessas teclas mova o cursor. Tente stty -echoctl; tput rmkx; sleep infe você verá as teclas de seta movem o cursor quando não estão no modo de teclado ).
Stéphane Chazelas
1
@ user367890, pelo que Thomas (mantenedor do ncurses e do xterm) diz na resposta que você vincula, sim, deve funcionar. o modo do teclado ou do aplicativo se refere à mesma coisa; portanto (novamente, de acordo com Thomas), as principais especificações no banco de dados terminfo são para quando o smkx está ativado.
Stéphane Chazelas
4

É fornecido via biblioteca gnu readline. você deve consultar o readline do man 3 para descobrir sua descrição.

Parece que você também precisa de informações sobre o que significa os códigos escspe liks \[A. Você pode encontrar essas informações no artigo de código da ANSI esacape da wikipedia .

pressa
fonte
Isso não explica meus exemplos.
bug
Parece que foi um pouco incompreendido. Por favor, olhe a atualização da resposta.
rush
Não há informações sobre meus exemplos específicos no artigo. Uma pesquisa de página por "[A" também não retornou nada.
bug
1
@ bug leia com atenção o artigo. \[Aestá na tabela "códigos CSI" na linha: "CSI n A"
rush
Graças apressar, mas onde posso encontrar explicações sobre [Z, [1;5Cou -1?
bug
3

Esses códigos são da mesma fonte? O último parece uma ligação de linha de leitura GNU. É isso que o usuário envia para uma festança (veja a resposta do rush). As duas primeiras, no entanto, parecem mais com seqüências de controle terminal (mesmo que a primeira seja mal formada). É isso que o bash ou outro programa envia de volta ao emulador de terminal, a fim de controlar os movimentos do cursor, as cores do texto e similares.

Uwe
fonte
Eu encontrei "\ e [1; 5C" para ser usado no movimento das palavras com a seta para a frente pressionada com a tecla Ctrl e "\ e [Z" e "\ e-1 \ Ci" para o menu completo para trás em outros tutoriais. Todos eles foram usados ​​dentro do arquivo .inputrc.
bug
OK, se eles são interpretados pela linha de leitura, deve haver algum emulador de terminal em que essas seqüências de controle estejam ligadas a alguma combinação de ctrl, alt e / ou shift com as teclas de função ou seta. (Eu não sei qual.) #
314 Uwe
0

A maneira mais fácil que encontrei para verificar qual sequência de escape é gerada por uma tecla ou combinação de teclas é pressionar Ctrl+ vem um terminal e, em seguida, pressionar a tecla / combinação que você deseja conhecer.

Você vai ter uma seqüência como ^[Oae você vai ter que traduzir o ^[em \eou \033ou \x1bou qualquer outra representação sua espera sistema KeyBinding para o caractere de escape.

Começou como uma função do Emacs denominada quoted-inserte, como as teclas padrão do Bash e Zsh imitam o Emacs, eles também a copiaram.

O Bash obtém através da biblioteca de entrada GNU Readline que outras coisas, como o import rlcompleteraprimoramento do Python, também usam.

Aqui está a descrição do manual Readline :

quoted-insert( C-qou C-v)

Adicione o próximo caractere digitado na linha literalmente. Isto é como inserir seqüências de teclas como C-q, por exemplo.

Isso deve funcionar em qualquer coisa baseada no GNU Readline.

Quanto ao Zsh, que usa sua própria alternativa chamada ZLE, ele apenas respeita a C-qligação original do Emacs quando está no modo Vi, ironicamente, mas C-vainda funciona no modo de entrada padrão do tipo Emacs. (Procure quoted-insertnas zshzlepáginas de manual ou zshall` e o segundo par de resultados deve listar as teclas de atalho padrão.)

Para um mnemônico, aconselho pensar em Ctrl+ vcomo pedir isso v erbatim.

ssokolow
fonte