Создайте сочетание клавиш, включающее «Alt», чтобы оно не запускалось нажатием «Escape»

Вы можете сделать привязки более явными, добавив то, что вы не хотите нажимать, например.~Meta:

Ctrl ~Meta <KeyPress> I: string("^[JDI")  \n\
Meta ~Ctrl <KeyPress> I: string("^[JDMI") \n\
1
14.02.2020, 17:38
2 ответа

К моменту, когда терминал передает символы по (виртуальному )проводу к хосту, нет разницы между последовательностью клавиш EscU и ключевой аккорд и #x2387; Alt + U или даже последовательность составных ключей & #x2388; Управление + [U .

Все они кодируются как символ , за которым следует символ u. Оболочка Z не видит разницы во входном потоке символов, поступающем с терминала, и не может сделать различий. Терминальные приложения ввода/вывода видят символы, а не клавиши.

1
28.04.2021, 23:23

Как сказал @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 секунда по умолчанию ).

4
28.04.2021, 23:23

Теги

Похожие вопросы