Почему "shift-tab" приводит к "Escape" в терминале?

В упаковке debian, control файл содержит детали о двоичных пакетах, которые произведет исходный пакет. Необходимо будет указать и зависимого дуги и автономные блоки дуги в файле управления.

Используя debhelper, Вы захотите, чтобы система сборки Вашего программного обеспечения установила на debian/tmp. Как Вы делаете это будет зависеть от системы сборки программного обеспечения. Например, если система сборки программного обеспечения использует GNU autotools, Вы использовали бы следующее для debhelper короткие правила:

override_dh_auto_configure:
        ./configure \
        --prefix=/tmp

Оттуда, Вы хотите использовать dh_install перемещать те файлы в соответствующие каталоги для упаковки. Чтобы сделать это, Вам нужен файл для каждого двоичного названного пакета <package_name>.install. Файл должен содержать имена файлов или шаблоны, которые будут включены в пакет.

Вот пример, обеспеченный dh_install страница справочника:

EXAMPLE
   Suppose your package's upstream Makefile installs a binary, a man page,
   and a library into appropriate subdirectories of debian/tmp. You want
   to put the library into package libfoo, and the rest into package foo.
   Your rules file will run "dh_install --sourcedir=debian/tmp". Make
   debian/foo.install contain:

     usr/bin
     usr/share/man/man1

   While debian/libfoo.install contains:

     usr/lib/libfoo*.so.*

   If you want a libfoo-dev package too, debian/libfoo-dev.install might
   contain:

     usr/include
     usr/lib/libfoo*.so
     usr/share/man/man3
4
25.10.2015, 04:08
2 ответа

Shift+Tab на нескольких терминалах посылает последовательность экранирования, подобную этой

ESC [ Z

Она была частью консольного терминала Linux с 1995 года, частью xterm с 2002 года, и с тех пор используется в терминалах, эмулирующих один или другой из них.

В описании terminfo это выражается как

kcbt=\E[Z,

а kcbt документирован в terminfo(5):

key_btab                  kcbt   kB   back-tab key

С точки зрения разбора, нет никакой разницы между этим и нажатием какой-либо функциональной клавиши. В readline есть специальные случаи для нескольких клавиш редактирования (видно после вызова tgetent в lib/readline/terminal.c в bash), но termcap "kB" не является частью этого.

6
27.01.2020, 20:49

может показаться, что его интерпретация как клавиши Esc находится на более базовом уровне, чем bash. Возможно, в строке чтения?

Это даже ниже. Это фундаментальное свойство работы терминалов в Unix и Unix-подобных операционных системах. Операционная система рассматривает ввод-вывод терминала как последовательность 8-битных (или даже 7-битных) символов. Функциональные клавиши и расширенные клавиши передаются как многосимвольные escape-последовательности.

В реальных терминалах эти escape-последовательности генерируются встроенным ПО в самом терминале. В программах эмулятора терминала эмулятор терминала превращает данные нажатия клавиш (которые он получил через любой пользовательский интерфейс, который он использует для общения с клавиатурой, будь то система X Window, USB-устройство hid или устройство событий Linux) в escape-последовательности.

Такие приложения, как vim и различные библиотеки редактирования строк, пытаются отличить их от простого нажатия клавиши Esc по (фактически) времени между чтением escape-символа. и читая следующие символы. Если символы прибывают достаточно быстро один за другим, они рассматриваются как escape-последовательность.

Где я могу найти это задокументированное?

Обработка тайм-аута управляющих последовательностей во входных данных задокументирована в vim в : help ttimeout и для ZLE Z Shell в zshzle страница руководства. Основная идея о том, что терминалы генерируют escape-последовательности, широко документирована.

Сложнее найти документацию по конкретным генерируемым escape-последовательностям.Многие, а в настоящее время, возможно, большинство терминалов (в частности, эмулируемые терминалы) произносят управляющие последовательности, которые произносились терминалами DEC VT (когда они находятся в том, что Digital называет «режимом ANSI») в течение многих лет. DEC предоставляет документацию для своих терминалов, и вы можете найти ее в явном обсуждении того, что Shift + Tab закодировано, как в главе 8 документа VT525 Programmer Information.

Однако: если вы используете виртуальный терминал ядра в Linux или BSD, где программа эмулятора терминала является частью ядра операционной системы, соблюдение соглашений DEC VT заметно нечеткое, когда дело доходит до input управляющих последовательностей. Частично это связано с тем, что операционные системы, такие как FreeBSD, фактически придерживаются соглашений о виртуальных терминалах SCO XENIX по умолчанию, здесь. В результате получается странная смесь DEC VT и SCO XENIX, не имеющая отношения ни к одному реальному терминалу.

Примесь - это не просто несоответствие между эмуляциями входных и выходных терминалов. Это дополнительно усугубляется тем фактом, что современные конфигурации пытаются переопределить настройки SCO XENIX по умолчанию для последовательностей управления вводом, но делают это лишь частично.Так, например: в последних версиях FreeBSD можно обнаружить, что F6 - это управляющая последовательность DEC VT CSI 1 7 ~ , а не SCO XENIX последовательность, которая скомпилирована в эмулятор терминала ядра, но Shift + F6 по-прежнему является скомпилированной управляющей последовательностью SCO XENIX CSI d , а не Управляющая последовательность DEC VT CSI 1 7 ; 2 ~ .

И ничего из этого вообще нет в документации FreeBSD.

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

3
27.01.2020, 20:49

Теги

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