Bash: appuyer sur escape 4 fois

11

Lorsque j'appuie sur Échap 4 fois dans un terminal bash, il affiche quelque chose comme ceci:

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

Quelle est cette fonction et comment ces entrées sont-elles trouvées? (Au deuxième appui sur esc, le terminal émet une alerte sonore.)

flow2k
la source

Réponses:

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

Cela montre que la liaison par défaut des touches Meta+Esc(et Ctrl+i) en mode d'édition de ligne de commande Emacs est la fonction Readline complete. La Metaclé se trouve généralement Escsur les claviers sans Metaclé explicite . La documentation Readline pour cette fonction indique

Essayez d'effectuer l'achèvement du texte avant le point. L'achèvement réel effectué est spécifique à l'application. Bash, par exemple, tente de terminer le traitement du texte comme une variable (si le texte commence par $), un nom d'utilisateur (si le texte commence par ~), un nom d'hôte (si le texte commence par @) ou une commande (y compris les alias et les fonctions) tour à tour. Si aucun de ces éléments ne produit de correspondance, la complétion du nom de fichier est tentée. Gdb, d'autre part, permet l'achèvement des fonctions et des variables du programme, et ne tente l'achèvement du nom de fichier que dans certaines circonstances.


Concernant votre commentaire à la réponse d' Anthon : Non, appuyer Escdeux fois n'est pas la même chose qu'en appuyant Tabgénéralement (sauf si c'est dans un programme qui les mappe tous les deux à la même action, comme Readline le fait par défaut). Cependant Ctrl+i est identique à Tab, tout comme Ctrl+[est identique à Esc. Cela signifie que vous pouvez effectuer l'achèvement avec Ctrl+[ Ctrl+[in bashsi vous le souhaitez, tant que double Escest lié à la completefonction Readline . C'est pratique si vous travaillez sur un terminal VT220, par exemple, qui n'a pas la touche Échap:

Clavier allemand VT220

Kusalananda
la source
Kusalananda, merci pour cette réponse en profondeur. À propos de votre dernier point: pourquoi la pression Escdeux fois (ou \M-\e) n'est-elle pas la même que Tabdans bash, si les deux se terminent?
flow2k
1
@ flow2k Il en est de même si Esc-Esc et Tab sont liés à la completefonction, ce qu'ils sont par défaut, mais pas en général (c'est-à-dire que les pressions sur les touches ne sont pas "les mêmes"). Vous ne pouvez pas remplacer Tab par Esc-Esc partout, uniquement dans les programmes capables de lecture. Cependant, vous pouvez remplacer Tab par Ctrl-i ou Esc par Ctrl- [n'importe où.
Kusalananda
Un suivi si je peux: je ne vois pas Tabdans la sortie de bind -p. Pourquoi donc? Peut-être parce qu'il Tabest "codé en dur" et ne peut pas être lié?
flow2k
1
@ flow2k Non, Tab est identique à Ctrl-i. Cherchez \C-i. Il s'agit d'une équivalence au niveau matériel.
Kusalananda
8

C'est ce qu'on appelle l'achèvement de fichier, et si vous n'avez aucune commande précédente sur la ligne de commande, bash vous proposera d'exécuter toutes les 2837 commandes qu'il connaît, à la fois intégrées et celles trouvées dans votre PATH

Les sont présentés dans l'ordre trié

Anthon
la source
1
Intéressant - c'est la même chose que d'appuyer deux fois sur tab. Peut-être 2 échappements = 1 tab?
flow2k