Как правило, модификатор control воздействует на символы ASCII, удаляя все последние 5 битов. Это отображает несколько разных символов в диапазон 0..31
, используемый для управляющих символов ASCII.
Исходя из этого правила, можно было бы ожидать, что они будут отображаться в 031, используя модификатор control :
037 31 1F US (unit separator)
077 63 3F ?
137 95 5F _
177 127 7F DEL
, а они не будут:
057 47 2F /
117 79 4F O
157 111 6F o
В качестве альтернативы модификатор control может применяться только к символам в диапазоне 32..63
, используя аналогию с клавишей shift , которая полезна в ASCII для отображения диапазона От 64..94
до 96..126
(буквы верхнего / нижнего регистра). В этом случае они могут отображаться на 031
:
037 31 1F US (unit separator)
057 47 2F /
077 63 3F ?
и (это было давно) наблюдение @aprogrammer звучит знакомо. Но в инструкции к VT100 этого нет. В главе 3 он указывает на таблицу, в которой задокументированы ключи и их контрольные эквиваленты. При этом используются коды из полного диапазона 95 символов (32..126), но документируется только один регистр для каждого управляющего символа. Все остальные возможные персонажи недокументированы. Но обратите внимание, что таблица контролирует ? . На моей клавиатуре ? - это сдвинутая клавиша.На фотографиях, которые я обнаружил с клавиатурой VT100, она не изображена как несмещенная клавиша. И (неудивительно) несмещенный код для этого конкретного ключа - / . DEC могла задокументировать их на основе существующих ключей от более раннего терминала, но, возможно, они сделали это, чтобы таблица была короткой.
Однако преобразование не полностью зависит от xterm
. Он получает события X, которые имеют определенные коды клавиш вместе с информацией о модификаторах. Вообще говоря, эти коды клавиш соответствуют буквам, отображаемым на клавиатуре, в то время как модификаторы, такие как shift и control , передаются отдельно. xterm
использует функцию времени выполнения X, такую как Xutf8LookupString
или XmbLookupString
, чтобы объединить некоторые события (например, shift ). Именно здесь и принимается решение о переводе этих управляющих символов. xterm
позже уточняет / изменяет информацию для специальных клавиш (например, backspace
), но большая часть преобразования выполняется в библиотеках X с использованием конфигурации клавиатуры.
Дополнительная литература: