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

Я смущен тем, как 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 ?

  • Заголовок вкладки терминала не работает корректно с помощью MacPorts bash
  • Терминатор не работает!
  • perf_events over ssh (osx -> linux) замерзает и не реагирует
  • Что это за подчеркивающие команды?
  • Как я могу отменить запущенный процесс и связать его с новой оболочкой экрана?
  • Изменение цвета фона терминала GNOME на лету
  • Виртуальная консоль TTY + tmux: кажется, что ~ / .bashrc запускается более одного раза?
  • Потенциальные проблемы (если они есть) при рекурсивной замене пробелов символами подчеркивания во всех именах файлов на жестком диске
  • 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), полагая, что терминалы должны интерпретировать форму-канал. Эта функция фактически исходит от линейных принтеров и изначально редко встречалась в терминалах, даже в разнообразии печати. Для некоторых связанных дискуссий см. Мои заметки о репататоре и последующих действиях для повторного использования этой функции.

    Linux и Unix - лучшая ОС в мире.