Что такое мета ключ bash?

16

Я пытался использовать xmodmapдля сопоставления META_Lс MENUключом, но это не похоже bashна мета-ключ. Итак, мне интересно, как эти компоненты (клавиатура, X, Xterm, Bash) относятся к каждому в отношении мета- и супер-ключей. Любое объяснение будет оценено.

Позвольте мне выразить это иначе. Например, на странице руководства bash говорится, что функция yank-nth-arg связана с M-C-yней, и она работает, когда я нажимаю Esc-Control-y. Но я нахожу это немного громоздким. Итак, как я могу заставить bash принимать другой ключ как Meta(например, Menu) для всех привязок по умолчанию?

Лео
источник
Ваш MENUключ даже замечен Х? Какой оконный менеджер вы используете - некоторые из них могут помочь вам переопределить ваши ключи.
Чороба

Ответы:

11

Сопоставление клавиш клавиатуры с модификаторами, такими как Metaи Controlобрабатывается X-сервером (т. Е. Низкоуровневой частью GUI). Этим отображением можно управлять с помощью команды старого стиля xmodmapили интерфейса XKB нового стиля , или с помощью инструментов конфигурации графического интерфейса, которые используют один из них под капотом.

По умолчанию в большинстве установок Metaключ является ключом с меткой Alt. Это связано с тем, что исторически многие рабочие станции Unix имели ключ с меткой, а на MetaПК - ключ Alt. Так что если у вас есть привязка для M-C-y, нажмите Ctrl+ Alt+ Y.

Чтобы проверить текущие привязки, запустите xevпрограмму в терминале. Когда окно xev сфокусировано, нажмите клавиши; вы увидите стенограмму сгенерированных событий в терминале.

Связь между эмуляторами терминала (или терминальными устройствами, соответствующими физическим терминалам) и приложениями использует символы. Когда вы нажимаете A, терминал получает информацию « Aключ, без модификатора», но он отправляет приложению, работающему в терминале, символ a. Когда вы нажимаете функциональную клавишу, например Upили F1, соответствующего символа нет; терминал отправляет последовательность символов, начинающуюся с escape-символа (байт 27, иногда записывается \eили ^[). Когда эмулятор терминала, такой как xterm, получил событие нажатия клавиши с Metaмодификатором, он преобразует эту клавишу в escape-символ, за которым следует основная функция клавиши, например \ea(escape, нижний регистр a), когда вы нажимаете Meta+ A.

Какова точная разница между терминалом, оболочкой, tty и консолью? может быть полезным фоном.

Жиль "ТАК - прекрати быть злым"
источник
5

Ключевое событие генерируется X-сервером (в соответствии с настройками xmodmap) и отправляется в ваше X-приложение. Ваш оконный менеджер может перехватить это перед отправкой в ​​xterm. XTerm, в свою очередь, переводит событие в несколько байтов и отправляет байты в псевдо-tty, выделенный вашей оболочкой, bash.

Обратите внимание, что не все события переводятся напрямую в байты XTerm. Например, Ctrlи shiftключи, сами по себе, генерировать рентгеновские события клавиатуры, но XTerm не посылает ничего к оболочке (или другому приложению) работает в нем. Это также включает в себя Metaключ, но не Menuключ. Однако событие, генерируемое нажатием Meta- e, заставит XTerm отправить либо байт 0xE5, либо двухбайтовую последовательность 0x1B 0x65, в зависимости от параметра ресурса XTerm.VT100.metaSendsEscape.

Тедди
источник
2

В Bash ключ мета первоначально был определен как это ( lib/readline/ChangeLog):

Mon Jul 13 11:34:07 1992  Brian Fox  (bfox@cubit)
        * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
        means force the use of the 8th bit as Meta bit.  Internal variable
        is called meta_flag.

Это происходит так, как это интерпретируется с помощью ncurses и xterm . Через несколько терминалов , предусмотренных для создания этой функции факультативного (этот аспект не были широко распространен Большинство терминалов вы будете сталкиваться использовать жёстко поведение (и не очень интересно) В.. Terminfo руководств документов эти возможностей терминала:

   has_meta_key              km     km   Has a meta key
                                         (i.e., sets 8th-bit)
   meta_off                  rmm    mo   turn off meta mode
   meta_on                   smm    mm   turn on meta mode
                                         (8th-bit on)

и объясняет функцию:

Если терминал имеет «мета-ключ», который действует как клавиша Shift, устанавливая 8-й бит любого передаваемого символа, этот факт можно указать с помощью km. В противном случае программное обеспечение будет предполагать, что 8-й бит равен четности, и обычно он очищается. Если существуют строки для включения и выключения этого «мета-режима», они могут быть заданы как smmи rmm.

В Altнекоторые эмуляторы терминала была добавлена другая функция - префикс escape-символа в ответ на ключ. Bash (фактически readlineбиблиотека) документирует это использование в журнале изменений за 2004 год:

lib/readline/callback.c            
        - use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
          simulate the recursion used to decode multicharacter key sequences
          (even things like ESC- as meta-prefix

Мета является частным случаем клавиши- модификатора . Как controlи shift, вы нажимаете ее одновременно с другой клавишей и ожидаете увидеть что-то отличное от нажатия самой клавиши. X обеспечивает ключи модификаторов, назначая бит в значении модификатора, передаваемом в событии X для ключа. Нажатие клавиш может быть несколькими событиями X; X предоставляет функции для объединения этих событий с сохранением модификаторов.

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

Но «мета» - это особый случай.

У приложений X нет metaключа, кроме как по соглашению. У X нет определения мета-ключа или модификатора мета. Обычно терминалы ищут Altключ и / или один из известных модификаторов xmodmap, например mod2. Более поздняя функция xkb усложняет ситуацию (но не обеспечивает улучшения по сравнению с этим обсуждением), предоставляя другой уровень информации для поиска Altключа.

Соглашение, конечно, может привести вас только к этому, учитывая, что вы не знаете и ничего xmodmapне xkbзнаете о мета . Например, xterm настраивается, и не все пользователи хотят настраивать мета одинаково. Например, Altможет не быть намеченный мета-ключ, например, если он используется в translationресурсе. Другим ключом может быть мета-ключ, но пользователи (особенно те, которые используют escape-последовательности в bash) могут захотеть, чтобы после их нажатия был отправлен escape-символ Alt. Но имейте в виду, что, если он не настроен как модификатор, ничего этого не происходит: xterm не объединяет события самостоятельно.

У xterm есть несколько настроек ресурса (задокументировано на странице руководства ):

  • altIsNotMetaи altSendsEscape(добавлено в 2007 году ).
  • eightBitInputс 2006 года соответствует первоначальному смыслу мета-режима, и для этого определена escape-последовательность, которая обеспечивает возможности терминала ( smmи rmm/ или мета-режим).
  • eightBitInputбыл изменен в 2003 году для учета UTF-8 путем смещения декодированных значений Unicode на 128, а не необработанных входных байтов.
  • metaSendsEscapeдатируется 1999 годом
  • eightBitInputнамного старше чем metaSendsEscape. В нем реализован выбор между мета- режимом (добавление восьмого бита) или префиксом ключа с escapeX11R4 (1989). Но функция была определена при запуске: она была проверена во время инициализации, чтобы определить, был ли установлен вход для разрешения 8 бит или только 7. После этого он не изменился.

Некоторые люди приравнивают два ( 8-битный и escape-префикс), ссылаясь на последний как мета- режим. В зависимости от вашей точки зрения по этому вопросу eightBitInputнастройка ресурса xterm является частью решения для получения работоспособного мета-ключа.

Дальнейшее чтение:

Томас Дики
источник