Антон меня тут озадачил вопросом: почему сочетание Ctrl+J используется для папки Downloads в браузере, ведь буквы J в слове «download» нет? И оказалось, что это не случайно — J ассоциируется со стрелкой вниз, которая символизирует загрузку (всё-таки она DOWNload).
Чтобы понять связь Ctrl+J со стрелкой, нужно обратиться к истории компьютеров и таблицам символов. Я нашел таблицу ASCII 1967 года в редком представлении, которое позволяет с одного взгляда понять всю эту кухню.
В этой таблице каждый символ кодируется 7 битами. Первые 32 символа (строки 0 и 1) — управляющие, у них нет печатного представления, они использовались для управления устройствами. Клавиатуры терминалов, созданные по образцу печатных машинок, должны были как-то вводить эти управляющие символы, сохраняя привычную раскладку. Для этого добавили клавишу с ожидаемым названием CTRL (control — управление, управляющий). Удержание клавиши CTRL обнуляло два старших бита нажимаемой буквы, что позволяло вводить управляющие символы путем комбинации клавиш. Для удобства кнопки некоторых клавиатур даже маркировали специально аббревиатурами этих команд. Обратите внимание: клавиша DELETE стоит справа внизу — там же, где она находится и в таблице.
Кому интересно, под спойлер я поместил расшифровку этих команд.
Символ | Расшифровка | Перевод |
---|---|---|
SOH | start of heading | начало заголовка |
STX | start of text | начало текста |
ETX | end of text | конец текста |
EOT | end of transmission | конец передачи |
ENQ | enquiry | «Прошу подтверждения!» |
ACK | acknowledgement | «Подтверждаю!» |
BEL | bell | звуковой сигнал* |
BS | backspace | возврат на один символ |
HT | horizontal tab | горизонтальная табуляция |
LF | line feed | перевод строки |
VT | vertical tab | вертикальная табуляция |
FF | form feed | «прогон страницы», новая страница |
CR | carriage return | возврат каретки |
SO | shift out | «Переключиться на другую ленту (кодировку)» |
SI | shift in | «Переключиться на исходную ленту (кодировку)» |
DLE | data link escape | «Экранирование канала данных» |
XON | transmission ON | Буфер свободен, можно посылать данные |
DCn | device control n | N-й символ управления устройством |
XOFF | transmission OFF | Буфер заполнен, притормози с передачей |
NAK | negative acknowledgement | «Не подтверждаю!» |
SYN | synchronous idle | синхронное ожидание |
ETB | end of transmission block | конец блока передаваемых данных |
CAN | cancel | «Отмена» |
EM | end of medium | «Конец носителя» |
SUB | substitute | «Подставить» |
ESC | escape | экранирование |
DEL | delete | «Забой», стереть последний символ |
*Bell — подача звукового сигнала. Моя любимая команда. Когда ты сидишь в режиме терминала с удаленным компьютером, Ctrl+G издавало звук на другом конце соединения. Так можно было позвать собеседника, если он куда-то отошел. Сегодня очень не хватает такой функции в современных мессенжерах.
Итак, нажатая CTRL изменяла код нажимаемой буквенной клавиши. Например (посмотрите в таблицу):
- Ctrl+H (^H) превращала 100 1000 в 000 1000 — это
BS
, Backspace (возврат на один символ ←). - Ctrl+J (^J) превращала 100 1010 в 000 1010 — это
LF
, Line Feed (перевод строки ↓).
Так эти символы стали ассоциироваться с направлениями: H — влево, J — вниз, ну а K и L в силу соседства с первыми двумя приобрели ассоциацию с направлением вверх и вправо.
Поскольку на клавиатурах того времени не было специального блока стрелок, производители терминалов стали использовать эти сочетания для управления курсором, а некоторые (как на терминале ADM-3A) даже наносили изображения стрелок на клавиши с этими буквами.
Посмотрите на эту клавиатуру. Ну какое еще сочетание клавиш делать для Downloads! Да тут и альтернативы-то нет! И вы понимаете теперь, почему сегодня для ввода ссылки используется комбинация Ctrl+K?! Еще одно открытие, правда? :)
И неудивительно, что автор первого полностраничного редактора для терминалов — программы vi, написанной в середине 70-х — использовал для перемещения курсора по экрану именно эти сочетания клавиш.
Кстати, глядя на таблицу ASCII, становится понятна логика дизайнеров клавиатуры, которые расположили клавишу CTRL над клавишей SHIFT — ведь CTRL делает сдвиг в верхних линейках таблицы, а SHIFT — в нижних. Всё логично!
А вот так выглядит этот терминал целиком.
P.S. Обнаружил, что программа-терминал PuTTY, которой я пользуюсь сегодня (из песни слова не выкинешь), по Ctrl+J как раз посылает код LF, то есть вводит команду. Это до сих пор работает! :)
P.P.S. С разного рода физическими терминалами мне пришлось пообщаться достаточно. В середине 80-х мне довелось много работать на ЕС ЭВМ 1033 («аналоге» IBM System/360) через польский терминал с чешской клавиатурой, построенной аж на датчиках Холла (!!!). Стрелки на ней уже были, хотя и располагались ужасно неудобно. Обратите внимание, что стрелок на этой клавиатуре не четыре, а пять. Но главное — это латинские буквы: присмотритесь, ничего общего с раскладкой QWERTY они не имеют — они расположены по фонетическому принципу. Вы где-нибудь видели подобное! Привыкаешь, правда, быстро, ведь никаких персоналок еще нет и твоя моторика не испорчена никакими другими раскладками.
Машинный зал резонно располагался на первом этаже, а терминалы — на третьем в старом здании на Васильевском острове (сейчас там находится один из факультетов универа). Ох я набегался!
А диплом я писал уже на CМ-1420 («аналог» DEC PDP-11) — за 20 лет развития ЭВМ системные блоки уменьшились настолько, что всё оборудование стояло уже в одной комнате.
Сисадмином был бородатый юноша по имени Миша Фрадкин, страшно вредный, документация к редактору была написана так, что хотелось ее авторов побить, никаких специальных клавиш в терминале для редактора не было, всё, абсолютно всё было построено на таинственных горячих клавишах, любое действие вызывало боль, Миша, который сидел за соседним столом, помогать отказывался («разбирайся сам!»), а терминал — в тот момент, когда ты уже был готов его от отчаяния разбить — выводил на экран какую-нибудь издевательскую надпись типа: «А давайте мы будем вместе нажимать на клавиши — вы только скажите, на какие!» или «Эй, поосторожней, я могу и обидеться!». Это все страшно бесило и выводило из себя. Со временем, конечно, освоился.