Portanto, estou bastante confuso com o conceito de sequências de escape em um terminal (ou emulador de terminal para ser mais preciso) e como elas se relacionam com o bindkey
comando screen. Estava olhando algum .screenrc
arquivo de exemplo que encontrei na internet onde vi a seguinte configuração:
# switch windows with F3 (prev) and F4 (next)
bindkey "^[OR" prev
bindkey "^[OS" next
# switch layouts with Ctrl+F3 (prev layout) and Ctrl+F4 (next)
bindkey "^[O1;5R" layout prev
bindkey "^[O1;5S" layout next
Não faço ideia de por que, por exemplo, a sequência ^[0R
significa F3
e a sequência ^[01;5R
significa Ctrl+F3
. Existe uma tabela para tais sequências?
Além disso, essas sequências me lembram as sequências usadas para configurar as cores em um prompt de terminal (por exemplo, usando a $PS1
variável env), como \[\033[0m\]
para redefinir e \[\033[30m\]
para preto de primeiro plano. Existe realmente alguma relação entre essas duas "sequências de código" ou é apenas minha pura imaginação?
Boa pergunta.
Sim, esses são códigos de escape ANSI.
Você pode ver uma lista de códigos de escape ANSI para VT100 aqui: http://www.braun-home.net/michael/info/misc/VT100_commands.htm mas há uma maneira mais rápida - em seu emulador de terminal, pressione Control- ve depois Control- F3por exemplo e você verá isto:
Nele
man bash
diz:Observe que
^[
ele mesmo está Escapena saída dequoted-insert
e você pode estudar esta resposta https://unix.stackexchange.com/a/108014/72304 para saber de onde vem essa notação.Para entender melhor - como você já sabe, existem alguns códigos de escape ANSI para selecionar cores que usam a
Escape
chave. Existem vários métodos para inserir um literalEscape
- podemos, por exemplo, usar a notação octal, pois sabemos queEscape
é \033 na tabela ASCII:Também podemos usar
\e
o escape de barra invertida que algumas implementações deprintf
entendem:Mas você também pode usar
quoted-insert
para inserir um literalEscape
- aponte o cursor no lugar de\e
, remova-o, pressione Control- ve pressione Escape. Você obterá isto:Observe que quando você fizer isso, seu emulador de terminal
^[
será tratado como um único caractere. Copiar a linha acima e colar em seu emulador de terminal não funcionará, pois você obterá 2 caracteres separados em vez de um.