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

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

  • Печать на X-терминал быстрее, чем печать на tty?
  • Установка Steam на Debian Wheezy
  • IO и другие команды оболочки, когда программа не запускается терминалом
  • Создание межтерминальных приложений для Linux-систем
  • Копировать / вставить через vim без X
  • Сценарий интерпретатора сценариев CentOS 7
  • Заголовок вкладки терминала не работает корректно с помощью MacPorts bash
  • Странное поведение значения терминала PS1 в Mac против Ubuntu
  • 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), полагая, что терминалы должны интерпретировать форму-канал. Эта функция фактически исходит от линейных принтеров и изначально редко встречалась в терминалах, даже в разнообразии печати. Для некоторых связанных дискуссий см. Мои заметки о репататоре и последующих действиях для повторного использования этой функции.

    Interesting Posts

    Есть ли способ использовать апострофы в командах sed?

    Для чего я должен использовать `O_PATH` и как?

    Читатели PDF не основаны на poppler?

    перенаправить в тот же файл, что и исходный файл, обработанный командой

    Относительный путь к чему-либо, что не работает (во время работы от initramfs)

    Поддержка ядра Linux для USB-геймпадов?

    Скопируйте файл, если ошибка не возникла, иначе удалите скопированную часть

    Почему manpage не показывает доступные варианты?

    Раскройте и разблокируйте файл .tar.gz, используя cat, tar и gzip в одной командной строке

    Как найти только исполняемые файлы, используя «locate»?

    Случайное удаление важных библиотек

    Быстрое переключение между внешним и внутренним экраном

    Что делает опция -b при использовании команды `at`, если что?

    Кросс-компилировать библиотеку libzdb для архитектуры ARM9

    Как получить IP-адрес с помощью сценария оболочки?

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