Bash: pressionando escape 4 vezes

11

Quando pressiono escape 4 vezes em um terminal do bash, ele exibe algo como isto:

-bash-4.1$
Display all 2837 possibilities? (y or n)
:
!
./
[
[[
]]
{
}
411toppm
a2p
ac
accept
accton
aclocal
aclocal-1.11
acpi_listen

O que é esse recurso e como essas entradas são encontradas? (Na segunda pressão esc, o terminal emite um alerta sonoro.)

flow2k
fonte

Respostas:

11
$ bind -p | grep 'complete$'
"\C-i": complete
"\M-\e": complete

Isso mostra que a ligação de teclas padrão de Meta+Esc(e Ctrl+i) no modo de edição da linha de comando do Emacs é a função Readline complete. A Metachave geralmente está Escem teclados sem uma Metachave explícita . A documentação do Readline para esta função diz

Tente executar a conclusão do texto antes do ponto. A conclusão real realizada é específica do aplicativo. Bash, por exemplo, tenta concluir tratando o texto como uma variável (se o texto começa com $), nome de usuário (se o texto começa com ~), nome do host (se o texto começa com @) ou comando (incluindo aliases e funções) por sua vez. Se nada disso produzir uma correspondência, a conclusão do nome do arquivo será tentada. O Gdb, por outro lado, permite a conclusão das funções e variáveis ​​do programa e apenas tenta a conclusão do nome do arquivo em determinadas circunstâncias.


Em relação ao seu comentário à resposta de Anthon : Não, pressionar Escduas vezes não é o mesmo que pressionar Tabgeralmente (a menos que esteja em um programa que mapeie os dois para a mesma ação, como o Readline faz por padrão). No entanto, Ctrl+i é o mesmo que Tab, assim como Ctrl+[é o mesmo que Esc. Isso significa que você pode concluir com Ctrl+[ Ctrl+[in bashse desejar, desde que double Escesteja vinculado à completefunção Readline . Isso é útil se você estiver trabalhando em um terminal VT220, por exemplo, sem a tecla Escape:

Teclado VT220 alemão

Kusalananda
fonte
Kusalananda, obrigado por esta resposta profunda. Sobre o seu último ponto: por que pressionar Escduas vezes (ou \M-\e) não é o mesmo que Tabno bash, se os dois fazem a conclusão?
flow2k
1
@ flow2k É o mesmo se Esc-Esc e Tab estiverem ligados à completefunção, que são por padrão, mas geralmente não (por exemplo, as teclas não são "iguais"). Você não pode substituir o Tab pelo Esc-Esc em qualquer lugar, apenas em programas compatíveis com readline. No entanto, você pode substituir Tab com Ctrl-i ou Esc com Ctrl- [em qualquer lugar.
Kusalananda
Um acompanhamento, se eu puder: eu não vejo Tabna saída de bind -p. Por que é que? Talvez porque Tabseja "codificado" e não possa ser vinculado?
flow2k
1
@ flow2k Não, o Tab é idêntico ao Ctrl-i. Procure \C-i. Esta é uma equivalência no nível do hardware.
Kusalananda
8

Isso é chamado de conclusão de arquivo e, se você não tiver nenhum comando anterior na linha de comando, o bash oferecerá a você a conclusão de todos os 2837 comandos que ele conhece, tanto internos quanto os encontrados em seu PATH

Eles são apresentados em ordem classificada

Anthon
fonte
1
Interessante - portanto, é o mesmo que pressionar a tecla tab duas vezes. Talvez 2 escapes = 1 guia?
flow2k