Проблема с пониманием привязок ключей

У меня есть настройки и сеанс zsh

~ bindkey | grep help "^[H" run-help "^[h" run-help 

Почему, когда я нажимаю «Control + [+ h» слово под курсором, удаляется, и ничего не происходит, но если я нажимаю «Alt + h», страница пользователя открывается правильно?

^[ самом деле означает Escape character. Отметьте здесь: https://en.wikipedia.org/wiki/ASCII

В вашем случае кажется, что ваш ключ ALT работает как синоним ключа Escape: https://en.wikipedia.org/wiki/Alt_key

Попробуйте нажать Control + [ сразу после h .

Клеммы не посылают нажатия клавиш непосредственно в оболочку (как при нажатии и отпускании управления). Вместо этого терминал отправляет последовательности символов в зависимости от нажатых клавиш. Ключи в последовательности должны быть нажаты – хорошо – последовательно, а не все одновременно. Большим исключением из этого являются клавиши Control и клавиши Alt, которые одновременно нажимаются на другие клавиши для создания определенной последовательности.

Как вы уже знаете / заметили ^ используется как символ для клавиши Control , но он имеет это значение только в сочетании со следующим символом. ^A означает Control + a или Control + A , последовательность клавиш одинакова для символов верхнего и нижнего регистра в сочетании с Control (это также причина, почему терминалы часто используют Control + Shift + SOMEKEY для своих собственных, а не связанных с оболочкой ярлыки).

^[ буквально означает Control + [ . Он также отправляется Escape . Итак, ^[a означает Control + последующим (в нижнем регистре!). Кроме того, Alt -key также отправляет ^[ последовательность, за которой следует клавиша, с которой она была нажата. Поэтому Alt + a также отправляет ^[a . Alt + Shift + a посылает ^[A


Таким образом, для вашего примера вы можете нажать любую из них («+» означает «одновременно», «,» означает «в последовательности»):

  • для ^[h
    • Alt + h
    • Побег , ч
    • Control + [ , h
  • для ^[H
    • Control + [ , Shift + h
    • Alt + Shift + h
    • Escape , Shift + h

Специальные клавиши, такие как PgUp , Backspace , Return или KP_Enter, также отправляют последовательности клавиш. Они часто зависят от эмулятора терминала. Вы можете использовать виджеты с кавычками quoted-insert или vi-quoted-insert чтобы отобразить последовательность клавиш. По умолчанию они привязаны к ^V в своих соответствующих режимах. Таким образом, нажатие Ctrl + v, за которым следует соответствующая комбинация клавиш, отобразит последовательность, которую вы можете использовать для bindkey . Для termite на моей машине я получаю:

  • PgUp : ^[[5~ , который также является Control + [ , [ , 5 , ~ или Escape , [ , 5 , ~ или Alt + [ , 5 , ~
  • Backspace : ^? , который также является Control + ?
  • Return : ^M , который также является Control + m
  • KP_Enter : ^[OM , который также является Control + [ , Shift + o , Shift + m или Alt + Shift + o , Shift + m

Теоретически ключевые последовательности могут быть сколь угодно длинными и сложными. Например:

 bindkey '^[xfooba^r' run-help 

Alt + x , f , o , o , b , a , Control + r запускает виджет run-help .

Существует немного предел, поскольку zsh только ждет определенное время для другого символа, прежде чем он примет многосимвольную последовательность. Этот таймаут можно настроить в параметре KEYTIMEOUT за сотые секунды. Значение по умолчанию – 40 , поэтому 0,4 секунды.