Bash: нажатие на выход 4 раза

11

Когда я нажимаю escape 4 раза в терминале bash, он отображает что-то вроде этого:

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

Что это за функция и как эти записи найдены? (При втором нажатии esc, терминал выдает звуковой сигнал.)

flow2k
источник

Ответы:

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

Это показывает, что связывание клавиш по умолчанию Meta+EscCtrl+i) в режиме редактирования командной строки Emacs - это функция Readline complete. MetaКлюч, как правило , Escна клавиатурах без явного Metaключа. Документация Readline для этой функции говорит

Попытайтесь выполнить завершение над текстом до точки. Фактическое выполненное завершение зависит от приложения. Bash, например, пытается завершить обработку текста по очереди как переменная (если текст начинается с $), имя пользователя (если текст начинается с ~), имя хоста (если текст начинается с @) или команда (включая псевдонимы и функции). Если ни один из них не приводит к совпадению, выполняется попытка завершения имени файла. Gdb, с другой стороны, позволяет завершать программные функции и переменные и только пытается завершить имя файла при определенных обстоятельствах.


Относительно вашего комментария к ответу Anthon : Нет, Escдвойное нажатие - это не то же самое, что Tabобщее нажатие (если только это не в программе, которая отображает их оба на одно и то же действие, как Readline делает по умолчанию). Однако Ctrl+i это так же , как Tab, так же , как Ctrl+[та же Esc. Это означает, что вы можете выполнить завершение с помощью Ctrl+[ Ctrl+[in, bashесли хотите, если double Escсвязан с completeфункцией Readline . Это удобно, например, если вы работаете с терминалом VT220, в котором отсутствует клавиша Escape:

Немецкая клавиатура VT220

Кусалананда
источник
Кусалананда, спасибо за этот подробный ответ. О вашем последнем замечании: почему нажатие Escдважды (или \M-\e) не такое, как Tabв bash, если оба выполняют завершение?
flow2k
1
@ flow2k То же самое, если и Esc-Esc, и Tab связаны с completeфункцией, которой они являются по умолчанию, но не обычно (т.е. нажатия клавиш не «одинаковы»). Вы не можете заменить Tab на Esc-Esc везде, только в программах с поддержкой readline. Однако вы можете заменить Tab на Ctrl-i или Esc на Ctrl- [где угодно.
Кусалананда
Продолжение, если можно: я не вижу Tabв выводе bind -p. Это почему? Может быть потому, что Tabон «жестко закодирован» и не может быть связан?
flow2k
1
@ flow2k Нет, Tab идентичен Ctrl-i. Ищите \C-i. Это эквивалент на аппаратном уровне.
Кусалананда
8

Это называется завершением файла, и если у вас нет какой-либо предыдущей команды в командной строке, bash предложит вам выполнить все 2837 известных ему команд, как встроенных, так и найденных в вашем. PATH

Представлены в отсортированном порядке

Энтон
источник
1
Интересно - это то же самое, что дважды нажать вкладку. Возможно 2 выхода = 1 вкладка?
flow2k