Как эмуляторы терминала обрабатывают Shift + FKeys?

Как сказано здесь , вы можно использовать systemctl --failed

3
13.04.2017, 15:51
2 ответа

Интерфейс между терминалом и приложением отправляет байты, а не ключи. Печатные символы интерпретируются как последовательность байтов, соответствующая кодировке символов терминала. Функциональные клавиши кодируются как escape-последовательности. Для этих escape-последовательностей существуют общие соглашения, но они не полностью стандартизированы.

Более общие сведения см. В Как работают ввод с клавиатуры и вывод текста? . Для получения дополнительной информации см. Также Есть ли причина, по которой я получаю ^ [[A, когда я нажимаю стрелку вверх на экране входа в консоль? и таблица привязок клавиш?

Все escape-последовательности для функциональных клавиш начинаются с escape-символа , и большинство из них заканчивается на ~ . Vim распознает ряд управляющих последовательностей на основе настроек времени компиляции и информации, которую он имеет на терминале. Если Vim не распознает escape-последовательность, он игнорирует ее, но Vim не знает, какова длина escape-последовательности (он не предполагает, что последним символом является ~ , это не всегда так). Часто после той части, которую распознает Vim, есть паразитные ~ , иногда даже больше.

Вы можете точно увидеть, что отправляет терминал, нажав сначала Ctrl + V , либо в оболочке, либо в режиме вставки Vim.

Вы можете сообщить Vim о функциональной клавише, соответствующей escape-последовательности, с помощью : set , например

:set <S-F8>=^[[19;2~

(замените часть после ^ [ на то, что фактически отправляет ваш терминал).

3
27.01.2020, 21:16

Несколько ключей используются в качестве модификаторов ( shift , control являются наиболее используемый). Эмуляторы терминала получают серию событий X , которые вы можете увидеть с помощью xev . Эмулятор терминала объединяет некоторые из этих событий, такие как shift a , используя библиотеки X, чтобы получить A . Для других случаев, таких как функциональные клавиши и клавиши курсора (называемые «специальными клавишами» ), библиотеки X не имеют предопределенного преобразования. Эмулятор терминала решает, следует ли и когда использовать эти модификаторы для создания различных управляющих последовательностей, отправляемых специальными клавишами.

Различные эмуляторы терминала могут использовать для этого разные правила: не существует стандарта для последовательностей, которые могут быть отправлены. Есть только соглашения , например, решение имитировать определенные терминалы или расширять вещи путем создания новых последовательностей, чего не делает ни один другой терминал.

И rxvt, и xterm используют эти модификаторы для предоставления различных последовательностей функциональных клавиш, позволяя программам, работающим на терминалах, действовать так, как если бы у вашего терминала было несколько десятков функциональных клавиш.

Однако - терминалы также могут иметь режим , установленный управляющими последовательностями от приложения к терминалу, которые изменяют управляющие последовательности, отправляемые для функциональных клавиш. Эти последовательности управления переключением режимов обычно используются в полноэкранных программах (таких как vim).Итак, вы видите различия.

Поскольку не существует стандарта , для каждого терминала существует описание , которое описывает его поведение (с использованием переменной среды TERM ). Для большинства терминалов описание инициализирует терминал для использования прикладного режима (как для клавиатуры, так и для клавиш управления курсором). Полноэкранные приложения используют эти последовательности инициализации и используют функциональные клавиши и клавиши курсора, перечисленные в этих описаниях, чтобы обеспечить согласованное поведение.

Не все терминалы отправили escape-последовательности для функциональных клавиш. Например, рабочая станция altos использовала символ вставки, wyse-85 поддерживал 8-битный режим с использованием \ 233 вместо \ 033 [ (CSI), qnx использовал \ 377 . Но большинство начиналось с escape-символа ASCII. Финальные персонажи - это отдельная история. Около половины измененных функциональных клавиш rxvt оканчиваются символом, отличным от тильды ASCII ~ (в ncurses FAQ есть таблица, иллюстрирующая это). Из-за этих различий важно, чтобы описание терминала соответствовало фактическому терминалу.

В текущей версии vim (7.3) я не вижу проблем. Он распознает смещенный F8 . Несколько лет назад возникла проблема. Проверка vim на функциональные клавиши не ожидала точки с запятой, как это было отправлено xterm. Как только он заключил точку с запятой, он перестал распознавать функциональную клавишу.У вас может быть старая версия vim или некоторые сопоставления клавиш, которые мешают ему распознавать ключи. vim теперь может (в любой версии, которую вы используете), но не смотрел описание терминала для расширенных ключей, а полагался на свои собственные таблицы. Чтобы усложнить ситуацию, vim может использовать функцию xterm (называемую tcap-query ) для получения фактических ключевых последовательностей, отправленных xterm.

С другой стороны, vim, вероятно, имеет отображение, которое дает разные результаты для последовательностей ключей rxvt. Нет особого различия между его сдвинутым F6 ( \ E [29 ~ ), сдвинутым F7 ( \ E [31 ~ ) и сдвинул F8 ( \ E [32 ~ ).

Дополнительная литература:

3
27.01.2020, 21:16

Теги

Похожие вопросы