Я пытался использовать xmodmap
для сопоставления META_Lс MENUключом, но это не похоже bash
на мета-ключ. Итак, мне интересно, как эти компоненты (клавиатура, X, Xterm, Bash) относятся к каждому в отношении мета- и супер-ключей. Любое объяснение будет оценено.
Позвольте мне выразить это иначе. Например, на странице руководства bash говорится, что функция yank-nth-arg связана с M-C-yней, и она работает, когда я нажимаю Esc-Control-y. Но я нахожу это немного громоздким. Итак, как я могу заставить bash принимать другой ключ как Meta(например, Menu) для всех привязок по умолчанию?
MENU
ключ даже замечен Х? Какой оконный менеджер вы используете - некоторые из них могут помочь вам переопределить ваши ключи.Ответы:
Сопоставление клавиш клавиатуры с модификаторами, такими как
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 и консолью? может быть полезным фоном.
источник
Ключевое событие генерируется X-сервером (в соответствии с настройками
xmodmap
) и отправляется в ваше X-приложение. Ваш оконный менеджер может перехватить это перед отправкой в xterm. XTerm, в свою очередь, переводит событие в несколько байтов и отправляет байты в псевдо-tty, выделенный вашей оболочкой, bash.Обратите внимание, что не все события переводятся напрямую в байты XTerm. Например, Ctrlи shiftключи, сами по себе, генерировать рентгеновские события клавиатуры, но XTerm не посылает ничего к оболочке (или другому приложению) работает в нем. Это также включает в себя Metaключ, но не Menuключ. Однако событие, генерируемое нажатием Meta- e, заставит XTerm отправить либо байт 0xE5, либо двухбайтовую последовательность 0x1B 0x65, в зависимости от параметра ресурса XTerm.VT100.metaSendsEscape.
источник
В Bash ключ мета первоначально был определен как это (
lib/readline/ChangeLog
):Это происходит так, как это интерпретируется с помощью ncurses и xterm . Через несколько терминалов , предусмотренных для создания этой функции факультативного (этот аспект не были широко распространен Большинство терминалов вы будете сталкиваться использовать жёстко поведение (и не очень интересно) В.. Terminfo руководств документов эти возможностей терминала:
и объясняет функцию:
В
Alt
некоторые эмуляторы терминала была добавлена другая функция - префикс escape-символа в ответ на ключ. Bash (фактическиreadline
библиотека) документирует это использование в журнале изменений за 2004 год:Мета является частным случаем клавиши- модификатора . Как 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 является частью решения для получения работоспособного мета-ключа.Дальнейшее чтение:
источник