Вопрос о поведении контрольных клавиш

Я смущен тем, как Ctrl-key работают в терминале. В man-странице bash существуют различные комбинации, такие как:

  • Ce – перейти к концу линии
  • Cf – перейти на один символ вперед

и т.п.

Но есть некоторые недокументированные ярлыки, такие как:

  • Cj (OR Cm ) для ключа возврата.
  • Ch для backspace
  • Ci для вкладки и т. Д.

Являются ли эти ярлыки просто забытыми для документирования? Или, потому что

  • CjLF
  • Cm является CR
  • CiTab

в ASCII, это как-то «поведение по умолчанию»? Другими словами, является ли поведение Cj , Cm и Ci не реализованным bash, а чем-то другим?

Другой вопрос, когда я Cv и стрелку влево, ^[[D появляется на экране. Т.е., ESC-[-d . Но когда я нажимаю ESC-[-d , курсор не перемещается влево. Что является причиной этого?

РЕДАКТИРОВАТЬ:

Первоначально я думал, что когда я 00001010 Cj , клавиатура напрямую отправляет 00001010 в ядро. Но потом я решил, что это не так, потому что, используя такие программы, как xev или evtest , я заметил, что evtest клавиши Control и j появляется как разные события. Поэтому, когда я 00001010 Cj , клавиатура не отправляет 00001010 , но, вероятно, несколько байтов. Затем, где выполняется преобразование этих нескольких байтов в 00001010 ?

2 Solutions collect form web for “Вопрос о поведении контрольных клавиш”

Поведение Cm , Ci и т. Д. Реализуется bash, но тот факт, что они такие же, как Return , Tab и т. Д., Обусловлен поведением терминала. Все терминалы ведут себя так, потому что все терминалы всегда вели себя так, и это то, что ожидают приложения. Интерфейс между терминалом и приложением основан на символах (фактически, байтах), а не на ключах, поэтому ключи, которые не отправляют печатные символы и комбинации клавиш, должны каким-то образом кодироваться. См. Как работают ввод с клавиатуры и вывод текста? для получения дополнительной информации по этой теме. См. Также https://emacs.stackexchange.com/questions/1020/problems-with-keybindings-when-using-terminal

TAB – это символ табуляции в ASCII , и это то же самое, что и символ Ctrl + I в ASCII. Аналогично другим клавишам. Терминалы отправляют этот символ, когда пользователь нажимает Tab и когда пользователь нажимает Ctrl + I. То же самое для RET (CR) и Cm , для LFD и Cj (что у большинства клавиатур нет), а для ESC и C-[ . Есть также BackSpace, который отправляет либо Ch либо C-? , это проблема сама по себе.

Конфигурация терминала (настройки stty ) может дополнительно входить в игру, и это влияет на некоторые настройки bash (например, после stty erase @ , bash будет обрабатывать нажатие @ качестве BackSpace), но не Cm и Cj для отправки текущей строки.

^[[DEsc [ D , но с капиталом D Если вы нажмете Esc [ D , bash видит левую клавишу, из-за объявления escape-последовательностей клавиш курсора в базе данных termcap или terminfo . Не существует привязки по умолчанию для Esc [ d (это не escape-последовательность, которую посылают общие терминалы).

Два вопроса, два вопроса:

  • control / J , control / M и control / I – обычные ASCII-элементы управления, которые большинство программ допускают. bash просто упрощает повторную привязку к readline.
  • большинство программ, которые принимают специальные клавиши, такие как стрелка влево, обеспечивают способ распознавания ключа эвакуации, отличного от этих специальных ключей по времени . Вероятно, вы не можете набирать достаточно быстро, чтобы вводить символы (за исключением особых случаев, таких как emacs, которые не учитывают время).

    Поскольку вы не набираете так быстро, программа видит отдельные символы, которые не будут перемещать курсор. Отдельные персонажи могут делать что-то интересное.

Независимо от этого (замечая комментарий о опечатке, которую я пропустил в вопросе), ESC [ d является стандартной управляющей последовательностью, которая, если она отправляется на терминал, переместит курсор в верхнюю строку экрана:

 CSI Pm d Line Position Absolute [row] (default = [1,column]) (VPA). 

Так как xterm реализует это , все, что притворяется точно так же, как xterm, будет делать то же самое, конечно. Консоль Linux тоже делает это. Однако bash обычно не выполняет контрольные последовательности: поведение, которое вы наблюдаете, было бы тем, что bash делает с экранами, которые он не распознает.

Что касается форм-фидов (комментарий предполагает, что они являются частью вопроса): использование bash формы (для ввода ) для очистки экрана путает некоторых людей (включая разработчиков PuTTY), полагая, что терминалы должны интерпретировать форму-канал. Эта функция фактически исходит от линейных принтеров и изначально редко встречалась в терминалах, даже в разнообразии печати. Для некоторых связанных дискуссий см. Мои заметки о репататоре и последующих действиях для повторного использования этой функции.

  • Греп против внимания на mac
  • Виртуальная консоль TTY + tmux: кажется, что ~ / .bashrc запускается более одного раза?
  • Как запустить программу, перенаправить ее вывод и отобразить вывод на экране?
  • Сценарий информационной системы реального времени с использованием ncurses и диалога
  • Закрыть / убить / скрыть одно окно терминала в bash on 'process complete'
  • Ctrl-C не работает с сеансом pppd без отсоединения
  • Каково влияние подчеркивания в *?
  • Сценарий интерпретатора сценариев CentOS 7
  • Как открыть первые 10 файлов в папке, начиная с определенной буквы или цифры?
  • Предотвращать передачу SSH-клиента переменной TERM на сервер?
  • Как я могу получить более красивые шрифты в моем терминале (URxvt)?
  • Как видеть пароль при вводе текста
  • Linux и Unix - лучшая ОС в мире.