Терминалы Unix отправляют коды ASCII ниже 32 для Ctrl+ другой клавиши и имеют по крайней мере два способа отправки "meta" (а именно, либо префикс кода 27, либо установка старшего бита символа ASCII). Есть ли прецедент для способа кодирования использования других клавиш-модификаторов, таких как "super" или клавиша с логотипом Windows или Cmdклавиша Mac?
Я хотел бы сопоставить Cmd+клавиши со стрелками в iTerm2, но не знаю, какие коды им назначить. Я уже использую клавишу Optionдля "мета" с клавишами со стрелками.
решение1
Соглашение об установке 8-го бита при нажатии meta довольно архаично и больше не используется, или вообще не используется в современных терминалах, которые поддерживают больше символов, чем просто ASCII. Соглашение о префиксе ESC также не распространено сегодня, если на то пошло.
32 управляющих символа ASCII действительно отправляются как управляющие символы ASCII (кодовые точки меньше 32), но это касается только Ctrl-@, Ctrl-A через Ctrl-Z, ESC, Ctrl-\, Ctrl-], Ctrl-^ и Ctrl-_. Все остальное, например Ctrl-4, не существует в ASCII, и нет соглашения для отправки его через терминал.
По сути, суть в следующем: все, что не может быть отправлено как обычный символ (т. е. существует в Unicode для современных терминалов, поддерживающих Unicode), должно быть отправлено как escape-последовательность. Escape-последовательности определяются действующим протоколом эмуляции терминала. Почти все протоколы эмуляции терминала, используемые сегодня, являются производными от VT100 или похожи на него, и escape-последовательности доступны для обычных клавиш, которые есть на клавиатурах, но не существуют как символы: клавиши со стрелками, функциональные клавиши и т. д.
VT100 и связанные с ним протоколы эмуляции терминала не содержат соглашений для передачи нажатий клавиш-модификаторов, даже стандартных, таких как Shift и Control. Программное обеспечение, работающее на tty, не может отличить нажатие клавиши Enter от нажатия клавиши Shift-Enter. Оно даже не может отличить нажатие клавиши Enter от нажатия клавиши Control-M.
Тот факт, что эти последовательности модификаторов не могут быть переданы через терминал, можно считать хорошим. Например, терминальное приложение MacOS может заявить о нажатии клавиши ⌘V для собственного использования (вставки), поскольку оно в любом случае не может быть отправлено на tty.