Как определить Compose Key в терминале (без рабочего стола)?

17

Я хотел бы определить composeключ в моей системе (Debian Sid "Wheezy"). У меня нет Xorg (и я не хочу никакой рабочей среды). Только в терминале.

Я хотел бы установить его на свой Alt-Grключ (справа Alt). Я пытался некоторое время, но я не могу понять, как его настроить.

Я расследовал и нашел несколько направлений:

  • $ showkeyдает мне код моего Alt-Grключа (# 100)

  • $ dumpkeysи $ dumpkeys --compose-onlyвывести «текущее содержимое драйвера клавиатуры» в формате, указанном в keymapsсоответствии со manстраницей

  • $ loadkeys загрузить таблицу перевода клавиатуры

Я уверен, что это не так сложно, но я скучаю, как с этим справиться ...

cedbeu
источник
Хм, я не слежу за 100%, что бы вы хотели, чтобы Alt-Gr сделал, когда вы нажмете на него?
Эмануэль Берг
Я хотел бы, чтобы это был Compose Key . На самом деле, я просто хотел бы где-нибудь определить Compose Key, и, поскольку я привык иметь его на своем Alt-Gr, я бы хотел определить его там. Это очень легко настроить с графическим интерфейсом , но я должен быть в состоянии определить его в режиме чистой консоли, так как у меня не установлена ​​система X (это не вариант). Я просто не могу понять, как.
cedbeu

Ответы:

10

В более новых системах Debian и Ubuntu ваши настройки клавиатуры вводятся /etc/default/keyboardи совместно используются X и консолью. Просто беги

sudo dpkg-reconfigure keyboard-configuration

и выберите Compose key: Right Alt (AltGr) на соответствующем экране.

Вы могли бы также поставить XKBOPTIONS=compose:ralt в /etc/default/keyboardи запустить

sudo dpkg-reconfigure console-setup

В старых системах по умолчанию на консоли есть ключ Compose. В usмакете нажатие обеих Alt клавиш действует как Compose.1

Например: Alt+ AltGr, ",A => а

Если вы предпочитаете AltGrтолько быть Compose, вам нужно изменить

alt keycode 100 = Compose

в вашей активной карте клавиатуры

keycode 100 = Compose

Самый простой способ сделать это - внести вышеуказанные изменения в /lib/kbd/keymaps/i386/include/linux-with-alt-and-altgr.inc .

Лучшим способом является создание нового файла, названного /lib/kbd/keymaps/i386/include/altgr-is-compose.incс помощью приведенной выше строки, создание новой раскладки клавиш, которая включает ее, и установка в нее раскладки клавиш по умолчанию.

  1. PrtScnтакже действует как Composeпо умолчанию.
Mikel
источник
Я не получаю это на работу. dpkg-reconfigureМастер действительно спрашивает о ключе создания письма, но он говорит , что не работает в режиме «Unicode» (?). Кроме того, когда он не находится в этом режиме, он говорит, что Control + period работает как ключ композиции. Но я не заставлю это работать.
Эмануэль Берг
Я думаю, что это предупреждение относится к unicode_start. Для меня это все еще работает, если я бегу, setupconкак dpkg-reconfigureговорит.
Микель
Когда я запускаю setupconсвой терминал X ( urxvt), он говорит: «Мы не на консоли, консоль остается ненастроенной». Также showkeyжалуется «Не удалось получить дескриптор файла на консоль». В ttyобоих случаях это работает, но showkeyговорит (первое), что «режим kb был UNICODE», так что, возможно, именно поэтому он не работает. Но, период Control + работает в tty. ОК, теперь это имеет смысл.
Эмануэль Берг
Ваш вопрос сказал, что у вас нет X? Вам необходимо запустить setupconвиртуальную консоль Linux, например, Ctrl + Alt + F1.
Микель
1
Похоже console-setup, не поддерживает очень много составных последовательностей по умолчанию. Вы можете бежать, dumpkeys --compose-onlyчтобы увидеть, какие из них. Вы должны быть в состоянии изменить console-setupсценарий инициализации, чтобы добавить дополнительные правила создания, где он выполняется loadkeys.
Микель
2

«compose» на консоли позволяет набирать два символа, но выводить третий.

проблема в том, что в составных определениях используются байты как в качестве двух входных данных (то есть вы не можете определить compose в терминах типизированных ключей, но только в терминах типизированных символов), так и для выходных данных.

чтобы заставить его работать в UTF-8, который является многобайтовым (по крайней мере, от 1 до 4 байтов), потребуются значительные изменения в способе обработки ввода с консоли и замена простого массива char, используемого в настоящее время чем-то более сложным. Кажется, что нет планов сделать это (консенсус среди разработчиков ядра состоит в том, что консоль должна оставаться консолью, что-то простое, используемое только для последнего пересмотра; если вам действительно нужен юникод, то вам, вероятно, также нужны bidi, shaping и т. Д .; лучше запустить графический терминал (полноэкранный xterm на X11; но есть и другие возможности).

Так что, действительно, это не работает и не будет работать с многобайтовыми символами на консоли. НО, это все еще работает, если вы ограничиваете составные определения простым ASCII.

И я также обнаружил, что это также работает, если вывод находится в ISO-8859-1 (что соответствует значениям Unicode до 0x00ff); для этого вы можете вставить в некоторый стартовый скрипт строку:

    loadkeys / somepath / somefile

и поместите в этот файл нужные вам составные определения (будьте осторожны, сохраняйте файл в кодировке ISO-8859-1 и используйте в качестве выходных данных символы больше 0x7f), синтаксис такого файла очень прост, такие строки:

    составьте 'somechar' 'somotherchar' для 'требуемого выхода'

например:

    составьте «а» «а» к «å»
    составьте «а» «е» к «æ»

Апостроф должен быть спасен.

в этом файле также определяется действие мертвых диакритических ключей; для dead_acute + a вы определяете строку вроде:

    составьте '\' '' a 'к' á '

dead_grave использует backtick (`), dead_diaeresis использует двойную кавычку ("), dead_circumflex использует roundflex (^), а dead_tilde использует тильду (~).

Пабло Саратчага
источник
Спасибо, получил это на работу. Только, мне пришлось изменить compose 'a' 'a' to 'å'в compose 'o' 'a' to U+00E5противном случае loadkeysжаловались синтаксической ошибки.
Эмануэль Берг
когда вы использовали 'å', вы писали файл в iso-8859-1 (не utf-8)?
Пабло Саратчага
Я не знаю. Как мне это проверить?
Эмануэль Берг
проверить, находится ли файл в utf-8: iconv -f utf-8 -t utf-8 filename если нет ошибок, он находится в utf-8
Pablo Saratxaga
Это похоже на файл cat, но нет, по echo $?крайней мере, нет ошибок и нет вывода в stderr. Кроме того, fileговорит мне, что это UTF-8, так что это имеет смысл.
Эмануэль Берг