Вы можете сделать привязки более явными, добавив то, что вы не хотите нажимать, например.~Meta
:
Ctrl ~Meta <KeyPress> I: string("^[JDI") \n\
Meta ~Ctrl <KeyPress> I: string("^[JDMI") \n\
К моменту, когда терминал передает символы по (виртуальному )проводу к хосту, нет разницы между последовательностью клавиш EscU и ключевой аккорд и #x2387; Alt + U или даже последовательность составных ключей & #x2388; Управление + [U .
Все они кодируются как символ ␛
, за которым следует символ u
. Оболочка Z не видит разницы во входном потоке символов, поступающем с терминала, и не может сделать различий. Терминальные приложения ввода/вывода видят символы, а не клавиши.
Как сказал @JdeBP , в наши дни терминалы отправляют ту же последовательность символов, когда пользователь нажимает Escape , за которой следует u , как и при нажатии u , удерживая клавишу Alt :U+001B U+0075(\eu
).
Однако в случае Alt + u отправляют оба символа сразу, а в случае Escape , u В этом случае между отправкой символов \e
и u
возникает задержка, потому что пользователи не нажимают оба символа одновременно, поэтому приложения обычно могут определить разницу.
В случае со строковым редактором zsh
при наличии привязки клавиш как для x
, так и для xy
, клавиша для x
срабатывает, когда y
не получен в течение $KEYTIMEOUT
сантисекунд после получения x
или получения символа, отличного от y
.
Значение по умолчанию для $KEYTIMEOUT
равно 40, т. е. 0,4 секунды. Это значение позволяет пользователям вводить многосимвольные привязки -вручную, но вы можете сделать его достаточно маленьким, чтобы люди не могли вводить последовательности клавиш так быстро, чтобы гарантировать, что многосимвольные привязки -срабатывают только тогда, когда генерируется при нажатии комбинации клавиш -или функциональных клавиш.
Например, если вы измените $KEYTIMEOUT
на 1 (0,01 секунды ), вам нужно будет ввести u очень быстро после Escape для вашего \eu
привязка к триггеру.
Это не ограничивается zsh. Большинство интерактивных терминальных приложений, допускающих настраиваемые привязки клавиш, имеют эквивалентную настройку. Например, вreadline
(строковый редактор, используемый bash
, python
, gdb
... ), это keyseq-timeout
переменная (0,5 секунды по умолчанию ); с ncurses
, см. переменную ESCDELAY
и переменную среды (1 секунду по умолчанию ); с vim
, см. опции tm
/ ttm
(1 секунда по умолчанию ).