shikhalev.org
Раскладка клавиатуры с третьим и четвертым уровнями

Оригинал этого поста в «Технобложике» оказался самым популярным ма­те­ри­а­лом — на него заходят и заходят из поисковиков, ссылаются на фо­ру­мах и так далее. Поэтому к его переносу я подошел максимально ответственно, пере­про­ве­рив все рекомендации в современных дистрибутивах и внеся до­пол­не­ния. Та­ким образом, этот пост получил некоторую добавочную ценность к ори­ги­на­лу. Осо­бен­но совершенно новый раздел о том, как можно добавить свои соб­с­т­вен­ные символы в раскладку.

На эту тему в интернетах написано немало. Я лишь хочу в этом посте собрать и обобщить некоторую часть информации, чтобы рекомендовать друзьям – новичкам в Linux. Итак, этот пост для тех, кто работает с текстом в Linux, дабы они поняли свое счастье.

Вообще говоря, ввод каких бы то ни было символов с клавиатуры можно организовать разными путями, некоторые из ко­то­рых (например, определение собственной раскладки) доступны и в оффтопичной системе от MS. Однако, удобных спо­со­бов существенно меньше. Собственно, я буду говорить о двух, простых как в использовании, так и в настройке: «третий уровень» и Compose Key.

Общие принципы

«Третий уровень»

Это как бы дополнительный [Shift] — добавочный ряд символов на клавишах: нажимаете назначенную для этого клавишу вместе с какой-то алфавитно-цифровой и получаете специальный символ. Руки очень быстро «запоминают» такое сочетание. Использовать не сложнее, чем [Shift] оригинальный, разве что у того клавиши широкие на боль­шин­с­т­ве клавиатур… Причем можно зажать и назначенную нами клавишу третьего уровня (в дальнейшем — [L3]) и [Shift], получив тем самым «четвертый уровень»… Но вряд ли это особо понадобится.

Пример: длинное тире («—») вводится как [L3]+[-].

Compose Key

Тут принцип другой — нажимаете (и отпускаете) назначенную для этого клавишу, затем нажимаете последовательно не­с­коль­ко (две–три обычно) алфавитно-цифровых клавиш, чтобы получить их «сочетание». Например, значок ко­пи­рай­та («©») можно ввести так: [Compose]→[o]→[c] (а можно — [Compose]→[c]→[o]). Здесь я стрелочками подчеркиваю, что клавиши нажимаются последовательно, а не одновременно. Кстати, сами стрелочки я ввожу посредством [Com­po­se]→[-]→[>].

Уточнение от 2021 года. Умолчательные сочетания клавиш могут различаться от дистрибутива к дистрибутиву и от версии к версии. Сейчас у меня сочетание [Compose]→[o]→[c] действительно выдает значок копирайта, но вот [Com­po­se]→​[c]→[o] — уже другой символ — «ǒ». Кроме того, стрелочку вправо я сейчас предпочитаю вводить через третий уровень — [L3]+[0], хотя вариант через Compose также рабочий.

Эти два способа совершенно друг другу не мешают. Лично я их использую оба, применяя Compose Key для тех символов, ко­то­рые отсутствуют в наборе «третьего уровня».

Базовая настройка

KDE 4 и 5

Модуль настройки клавиатуры в KDE

У меня стоит версия KDE 4.5.4, в других версиях названия каких-то пунктов могут отличаться, но вряд ли существенно.

Год 2021. Использую KDE 5, версия Plasma — 5.21.3, KDE Applications — 20.12.3. В от­но­ше­нии настройки клавиатуры по сути ничего не поменялось — см. ил­люс­т­ра­цию.

Итак, открываем «Параметры системы» и находим там раздел «Об­о­ру­до­ва­ние» → «Устройства ввода» → «Кла­ви­а­ту­ра». Открываем вкладку «До­пол­ни­тель­но». Если попалась непереведенная версия, по-английски это будет «Sys­tem Set­tings» → «Hardware» → «Input Devices» → «Keyboard» → «Ad­van­ced». Там следует отметить (если еще не отмечена) галочку «Настроить па­ра­мет­ры кла­ви­а­ту­ры» («Configure keyboard options»), после чего станут доступны соб­с­т­вен­но настройки. Нам понадобятся следующие:

  • «Клавиша для выбора 3-го ряда» («Key to choose 3rd level») — нужно отметить один из вариантов. Лично я использую кла­ви­ши [Win] (те, на которых нарисован флажок MS), поскольку: а) их две, а мы помним, что настраиваем как бы до­пол­ни­тель­ный [Shift] — тоже парный; б) по-умолчанию никакой полезной нагрузки в Linux они не несут, со­от­вет­с­т­вен­но, ничего нужного мы таким образом не испортим. В общем, мой выбор — «Любая клавиша Win» («Any Win key»).

    Сейчас у меня клавиатура с закосом под игровую, и справа вместо [Win] — ненужная мне [Fn], на которую, увы, ничего не на­с­т­ро­ить. Поэтому в дополнение к вышесказанному отметил еще и правый [Alt] — все-таки очень привык к L3 с обеих сто­рон.

  • «Разные параметры совместимости» → «Включить дополнительные типографские символы» («Mis­cel­la­ne­ous com­pa­ti­bi­li­ty options» → «Enable extra ty­po­gra­phic characters»). Этим мы собственно «заполняем» подключенный предыдущим пун­к­том «третий уровень».

  • «Клавиша пробела используется для ввода символа неразрывного пробела» → «Символ неразрывного пробела в треть­ем ряду, символ тонкого неразрывного пробела в четвёртом ряду» («Using space key to input non-breakable space cha­rac­ter» → «Non-breakable space character at third level, thin non-breakable space character at fourth level»). Пробел, на ко­то­ром запрещен разрыв строки принято использовать, например, после инициалов, а также перед тире. Установка дан­ной опции позволит вводить его быстро и логично. Что же до тонкого неразрывного пробела… Использовать его не обя­за­тель­но, однако по-хорошему для инициалов должен использоваться именно он. Сравним: «Ф. М. Достоевский» и «Ф. М. До­сто­ев­с­кий» (не говоря уж об кошмарном, но часто используемом, варианте «Ф.М. Достоевский»). Еще его можно использовать между запятой/точкой и тире. Правда, эффект сильно зависит от шрифта, причем в шрифте может вообще не оказаться такого символа и мы получим на его месте знак вопроса или квадратик… Хотя в последнее время все шриф­ты (с которыми мне доводилось иметь дело) содержат подобные символы.

  • «Положение клавиши Compose» («Compose key position»). Лично я в качестве [Compose] использую [Caps Lock], по­с­коль­ку ее штатное действие приносит исключительно вред. Если же вы не можете от нее отказаться, можно выбрать столь же бесполезную (однако, безвредную) [Scroll Lock], хотя на мой взгляд, ее расположение не столь удобно.

Итого — нам понадобилось поставить четыре галочки.

GNOME и Cinnamon

Настройка клавиатуры в Ubuntu

В GNOME есть (должен быть) подобный модуль центра управления для на­с­т­рой­ки клавиатуры. Ввиду эстетического неприятия, сейчас GNOME на мо­ем ком­пью­те­ре отсутствует, а ставить его только ради того, чтобы посмотреть, как там настраивается раскладка клавиатуры — это уж слишком. Ищите по клю­че­вым словам «третий уровень», «типографские символы» и «Compose Key»…

На этот раз я не поленился и посмотрел разные дистрибутивы и DE в вир­ту­ал­ках.

Настройка клавиатуры в среде Cinnamon (Linux Mint)

GNOME не подвел — «из коробки» там ничего нет, чтобы получить третий уровень и Compose, нужно ставить GNO­ME Tweak Tool. Впрочем, как я понимаю, это нужно практически для все­го. Еще интересный момент, что настройка Compose Key («ком­по­зи­ци­он­ной кла­ви­ши») вынесена на первый экран настроек клавиатуры (см. скриншот спра­ва), тогда как третий уровень нужно задавать в диалоговом окне, от­кры­ва­ю­щем­ся по кноп­ке «Дополнительные параметры раскладки».

А вот Cinnamon держит настройки вместе. И место это «Параметры сис­те­мы» → «Клавиатура» → «Раскладки» → кнопка «Параметры…» — см. скрин­шот слева.

В общем-то, не проблема найти, все логично. Галочки в списках в обеих системах те же самые, что и вышеописанные KDE-шные, так что см. предыдущий пункт.

Xfce и все-все-все…

Настройки клавиатуры в среде Xfce

Почему «и все-все-все…»? Потому что Xfce не умеет настраивать подобные средства — его возможности настройки клавиатуры сильно ограничены… Поэтому сейчас мы рассмотрим универсальный для всех иксов способ настройки — через конфиги. Способ именно что уни­вер­саль­ный — у меня и KDE работает с заданными таким образом сис­тем­ны­ми настройками, однако для его использования нужно иметь доступ от root’а, да и кон­фи­ги править — это вам не галочки мышкой щелкать — это гораздо проще.

Что ж, вот и хорошие новости: за прошедшие 10 лет Xfce таки расширил возможности настройки клавиатуры. Частично. Теперь можно штатным средствами включить Compose Key, см. скриншот. А вот доступа к третьему уровню не прибавилось, таким образом на­с­то­я­щий раздел актуальности не утратил.

Тут есть только одна загвоздка — расположение нужных настроек зависит от версии сер­ве­ра иксов…

Как это выглядит у меня: отдельный файл /etc/X11/xorg.conf.d/20-keyboard.conf со­дер­жит следующее:

Section "InputClass"
  Identifier "Keyboard Defaults"
  MatchIsKeyboard "yes"
  Option "XkbLayout" "us,ru"
  Option "XkbOptions" "grp:alt_shift_toggle,grp_led:scroll,compose:caps,lv3:win_switch,nbsp:level3n,misc:typo"
EndSection

Эту секцию можно и просто вписать в файл /etc/X11/xorg.conf. Однако есть вероятность того, что это не сработает — на ста­рых версиях Xorg, насколько я помню, устройства по классам не фильтровались… В общем, если не получилось так, то нуж­но отыскать в /etc/X11/xorg.conf строку Option "XkbOptions" и изменить ее значение на вышеуказанное. Если же xorg-server работает с клавиатурой через HAL, то ему следует скормить файл /etc/hal/fdi/policy/10-x11-input.fdi, о ко­то­ром я уже писал когда-то, добавив туда «lv3:win_switch,nbsp:level3n,misc:typo» в опции.

Кроме указания всех этих опций так или иначе в параметрах X-сервера, придется их еще и активировать программой setxkbmap (без каких-либо ключей или параметров). В Xfce ее просто нужно задать в автозапуск.

И снова хорошие новости: ни в Xfce (по крайней мере в Xubuntu), ни в LXQt (Lubuntu соответственно), больше не надо ничего прописывать в автозапуск — в Xfce следует отметить флажок «Использовать системные параметры», ну а LXQt и вовсе ничего такого настраивать не умеет, и использует настройки Xorg без каких-либо флажков (точнее, не мешает их использовать).

Еще в Lubuntu обнаружился один момент — там окружение перехватывает клавишу [Win] и обрабатывает ее в духе Win­dows. На третий уровень, получается, эти клавиши назначить нельзя. Но сам третий уровень работает, например, если назначить правый [Alt], или еще какую-нибудь клавишу, которую не жалко.

Использование

Собственно, как этим пользоваться, я написал в самом начале. Ниже подробности — как ввести наиболее часто нужные сим­во­лы.

Третий уровень

Вместо старой таблицы я наконец-то сделал красивую схему клавиатуры с третьим и четвертым уровнями. Самому такую па­мят­ку давно хотелось, да все как-то руки не доходили. На небуквенных клавишах в верхней части слева — простое нажатие, спра­ва — с [Shift], на буквенных — собственно буква в верхнем регистре, как обычно на самой клавиатуре изображается. Ниж­ний ряд везде (где оно есть): слева — третий уровень, т.е. при зажатой клавише [L3], справа — четвертый, т.е. [Shift]+​[L3]. Желающие распечатать в максимальном качестве могут скачать архив с SVG.

Как я уже говорил, что-то может меняться от дистрибутива к дистрибутиву и от версии к версии. Сейчас у меня схема имен­но такая, от текущей раскладки (rus/eng) она не зависит.

Раскладка клавиатуры с третьим и четвертым уровнями

Некоторые символы, пожалуй, требуют пояснений, их-то я и вынесу в таблицу:

Сочетание Сим. Unicode Комментарий
[L3]+[-] U+2014 EM DASH Длинное тире — собственно тире в русской пунктуации.
[L3]+[Shift]+[-] U+2013 EN DASH Короткое тире — в классической русской пунктуации не использовалось. Сейчас начинает применяться для диапазонов.
[L3]+[P] ´ U+00B4 ACUTE ACCENT Это просто символ, не путать с U-0301, он же [L3]+[A].
[L3]+[Shift]+[P] ˝ U+02DD DOUBLE ACUTE ACCENT  
[L3]+[A] U+0301 COMBINING ACUTE ACCENT Знак ударе́ния. Ставится над предыдущим символом, а не на отдельное знакоместо. Для иллюстрации я поместил на картинке светло-серую букву «a», но вообще это может быть любой нормальный символ.
[L3]+[D] ° U+00B0 DEGREE SIGN Знак градуса — на картинке это может быть не очень заметно, но размещается в верхней части строки. «Сегодня -5°C», например.
[L3]+[J]
[L3]+[Shift]+[J]
[L3]+[K]
[L3]+[Shift]+[K]
[L3]+[L]
[L3]+[Shift]+[L]





U+201E DOUBLE LOW-9 QUOTATION MARK
U+201A SINGLE LOW-9 QUOTATION MARK
U+201C LEFT DOUBLE QUOTATION MARK
U+2018 LEFT SINGLE QUOTATION MARK
U+201D RIGHT DOUBLE QUOTATION MARK
U+2019 RIGHT SINGLE QUOTATION MARK
Это правильные символы кавычек-лапок, двойных и ординарных. Причем сочетание, соответствующее J-K, принято в русской пунктуации, а K-L — в английской (то есть русская закрывающая кавычка является английской открывающей).
[L3]+[;]
[L3]+[']

U+2018 LEFT SINGLE QUOTATION MARK
U+2019 RIGHT SINGLE QUOTATION MARK
Да-да, дублируют символы из предыдущего блока, только на третьем уровне, а не на четвертом1.
[L3]+[Shift]+[;] U+2032 PRIME Используется для обозначения угловых минут и футов2.
[L3]+[Shift]+['] U+2033 DOUBLE PRIME Используется для обозначения угловых секунд и дюймов.
[L3]+[Shift]+[X] U+22C5 DOT OPERATOR Это математический символ. Для умножения в формулах предпочтительно с позиций типографики использовать именно его, а не обычную звездочку или какую-то из множества центральных точек.
[L3]+[M] U+2212 MINUS SIGN Знак минуса. Математический опять же. В отличие от обычного дефиса, к которому все привыкли, этот знак в шрифтах должен по высоте, ширине и толщине соответствовать знаку плюса.
[L3]+[Shift]+[M] U+2022 BULLET А этот символ в противоположность U+22C5 не нужно использовать в математических формулах, а предназначен он для списков и прочего как маркер.
[L3]+[ ]   U+00A0 NO-BREAK SPACE Неразрывный пробел.
[L3]+[Shift]+[ ]   U+202F NARROW NO-BREAK SPACE Тонкий неразрывный пробел.

Проверяя последний пункт, обнаружил баг в своей системе, но об этом позже.

Compose Key

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

Сочетание Сим. Unicode Комментарий
[Compose]→[^]→[1] ¹ U+00B9 SUPERSCRIPT ONE Верхний индекс — так же работает для всех цифр, скобок, плюса, минуса и равно.
[Compose]→[_]→[1] U+2081 SUBSCRIPT ONE Нижний индекс — аналогично предыдущему.
[Compose]→[(]→[1]→[)] U+2460 CIRCLED DIGIT ONE Цифра в кружочке — для всех цифр работает.
[Compose]→["]→[a] ä U+00E4 LATIN SMALL LETTER A WITH DIAERESIS Для всех гласных латиницы.
[Compose]→[']→[a] á U+00E1 LATIN SMALL LETTER A WITH ACUTE Аналогично предыдущему.
[Compose]→[s]→[s] ß U+00DF LATIN SMALL LETTER SHARP S Заглавный эсцет тоже есть — из заглавных S соответственно.
[Compose]→[#]→[b] U+266D MUSIC FLAT SIGN  
[Compose]→[#]→[f] U+266E MUSIC NATURAL SIGN  
[Compose]→[#]→[#] U+266F MUSIC SHARP SIGN  
[Compose]→[P]→[P] U+00B6 PILCROW SIGN Он же «paragraph sign».
[Compose]→[a]→[e] æ U+00E6 LATIN SMALL LETTER AE Аналогично для заглавных. Так же работает для некоторых рас­прост­ра­нен­ных лигатур, например , но не для всех.
[Compose]→[:]→[)] U+263A WHITE SMILING FACE  
[Compose]→[:]→[(] U+2639 WHITE FROWNING FACE  
[Compose]→[<]→[3] U+2665 BLACK HEART SUIT  
[Compose]→[N]→[o] U+2116 NUMERO SIGN Если вдруг нет русской раскладки, а знак номера очень хочется…
[Compose]→[o]→[x] ¤ U+00A4 CURRENCY SIGN  
[Compose]→[s]→[m] U+2120 SERVICE MARK  
[Compose]→[<]→[=]
[Compose]→[>]→[=]

U+2264 LESS-THAN OR EQUAL TO
U+2265 GREATER-THAN OR EQUAL TO
Вид нижней черты — горизонтальная или наклонная — зависит от шрифта.

Кроличья нора

Этот раздел новый. В 2011 году я так глубоко не закапывался. Тем не менее, конечно, хотелось бы уметь добавлять про­из­воль­ные символы для клавиатурного ввода. Это ж Linux, здесь кастомизируется, если не все, то очень многое… По­про­бу­ем.

~/.XCompose

Самое простое — это добавить свои сочетания для Compose Key. Для начала идем в файл, расположенный (скорее всего) по пути /usr/share/X11/locale/en_US.UTF-8/Compose и смотрим, чего уже есть, ну и формат описания. Не от­вле­ка­ясь на раз­но­об­раз­ные <dead_tilde> можно увидеть множество строк, начинающихся с <Multi_key> — последовательность имен сим­во­лов в уголках, двоеточие, нужный символ в кавычках, его название или номер в юникоде и комментарий. На­з­ва­ние или юни­код необязательны, как и комментарий.

А затем создаем в своем домашнем каталоге файл .XCompose следующего, например, содержания:

include "/usr/share/X11/locale/en_US.UTF-8/Compose"

<Multi_key> <h> <o> <m> <e> : "🏠" U1F3E0 # HOUSE BUILDING

Выходим и заходим (нужно переинициализировать сеанс иксов), и вуаля — последовательность [Compose]→​[h]→​[o]→​[m]→[e] выдает символ домика 🏠3. Главное тут следить, чтобы одни последовательности не перекрывали другие — иначе более короткая не позволит использовать более длинную.

Ввод через Compose Key легко настраивается, но, на мой взгляд, для условно обычных, идущих в потоке, символов не очень удо­бен. То есть (лично у меня, по крайней мере) такой способ ввода из потока выбивается. Поэтому символы «дополнительной пун­к­ту­а­ции» или что-то из базовой математики стоит вывести на третий/четвертый уровень, который (опять же лично у меня) нажимается автоматически и из потока текста не выделяется. Что же до Compose, то тут можно оставить символы-пик­то­грам­мы (как собственно и сделано в примере), эмодзи, или что-то уж совсем редко используемое.

Еще один момент, касающийся потока — это раскладки. Compose работает на уровне символов, а не нажатий клавиш, поэтому чтобы ввести заданную нами последовательность, придется переключаться из русской (например) раскладки в английскую. Это, впрочем, можно поправить, задав аналогичную последовательность с соответствующими русскими буквами, правда, вы­гля­деть такая строка будет страшновато и немнемонично сама по себе:

<Multi_key> <Cyrillic_er> <Cyrillic_shcha> <Cyrillic_softsign> <Cyrillic_u> : "🏠" U1F3E0 # HOUSE BUILDING

В обсуждениях в интернете видел, что файл ~/.XCompose обрабатывается не у всех. Я честно не знаю, в каких случаях бы­ва­ют проблемы, и что с этим делать, поскольку сам не сталкивался — у меня работает прекрасно.

Кастомизируем раскладку

Можно было назвать этот подраздел настройкой третьего уровня, но на самом деле изменения в нем и изменения в основной раскладке клавиатуры ничем не отличаются. Хотя я основную часть менять и не буду (чтобы не вырабатывать вредных при­вы­чек, мешающих затем работе с произвольно взятым посторонним компьютером — частая проблема у любителей кас­том­ных раскладок).

Второй момент: все изменения будем делать на уровне пользователя (так же, как и выше ~/.XCompose). Это позволит, в слу­чае неудачного эксперимента, не остаться хотя бы без экрана логина… Да и вообще.

Итак. За раскладки, дополнительные символы и вообще за ввод с клавиатуры в рамках X.org отвечает проект XKB, по ссылке мож­но почитать документацию, которая лично мне помогла примерно никак… К счастью, за прошедшие 10 лет материалов в се­ти на эту тему существенно прибавилось, и кое-что найти можно. Больше всего мне помогли:

Чтобы добавить символы на третий/четвертый уровень, можно:

  1. Создать полностью собственную раскладку, унаследовав от существующей.

  2. Создать расширение раскладки, которое будет независимо подключаться к основной, так же, как штатные «До­пол­ни­тель­ные типографские символы».

Второй вариант, конечно, предпочтительней. Сразу скажу, что совсем так же не получилось — мой блок дополнительных сим­во­лов не виден в настройках DE и, что более печально, не получилось оформить его как опцию… Кроме того, включение рас­клад­ки делается через явный вызов setxkbmap и xkbcomp скриптом-однострочником (который, впрочем, прекрасно по­ме­ща­ет­ся в автозагрузку DE). Почему не все получилось? Ну, возможно, я что-то упускаю, а возможно, все дело в том, что под­дер­ж­ка на­с­т­рой­ки XKB в X.org неполная, и для того, чтобы все сделать красиво и по мануалу, нужно переходить на Wayland (который у ме­ня пока что-то не приживается) — см. пост того же Who-T «No user-specific XKB configuration in X».

Тем не менее, файл с нашими добавочными символами имеет смысл расположить в соответствии с инструкциями — в ка­та­ло­ге $XDG_CONFIG_HOME/xkb/symbols/, вдруг вскорости проблема исправится… (Если переменная $XDG_CONFIG_HOME не за­да­на, следует считать ее равной $HOME/.config) Имя файла может быть любое, хотя лучше не использовать уже имеющиеся в сис­тем­ном /usr/share/X11/xkb/symbols/, чтоб не перекрыть чего нужного. Для данного примера я решил не умничать и на­звать его custom. Содержимое файла у меня такое:

default partial alphanumeric_keys
xkb_symbols "typo" {
    include "typo(base)"
    include "nbsp(level3n)"

    key <AB08> { [ NoSymbol, NoSymbol, NoSymbol,    U2039 ] };  // "‹"
    key <AB09> { [ NoSymbol, NoSymbol, NoSymbol,    U203A ] };  // "›"
    key <BKSL> { [ NoSymbol, NoSymbol,      bar, NoSymbol ] };  // "|"
};

Случай простой — один блок определений символов. default означает, что он должен использоваться, если указан только файл, т.е. +custom(typo) и +custom — одно и то же. partial — что это частичное определение, добавляемое к основе, а не са­мо­сто­я­тель­ная раскладка. alphanumeric_keys показывает, какую область клавиш мы определяем (я, честно говоря, не уве­рен, что это влияет на результат). Ну, а xkb_symbols "typo" собственно говорит нам, что это за блок.

Далее мы включаем два стандартных набора — типографские символы и неразрывный пробел с тонким неразрывным про­бе­лом на четвертом уровне. Выше я писал, что обнаружил баг на своей системе, а сейчас его обхожу. Дело в том, что сам «ти­по­граф­с­кий» набор вводит неразрывный пробел как на третьем уровне, так и на четвертом, а опция nbsp:level3n по идее должна его перекрывать. Но порядок подключения этих модулей не определяется их порядком в списке опций (а чем опре­де­ля­ет­ся, неизвестно), и у меня typo перекрывает nbsp, а не наоборот. Импортируя их в своем файле, я убиваю двух зай­цев: мне не нужно будет указывать их отдельно (или прописывать их содержимое себе), и порядок импорта определен жестко по­ряд­ком строк в файле.

Далее строки определения символов. Начинаются они с ключевого слова key и кода клавиши, а затем идет список символов.

Коды клавиш определяются файлами в каталоге /usr/share/X11/xkb/keycodes/ и зависят от системы. В моем случае, и в боль­шин­ст­ве современных Linux-систем, надо смотреть файл evdev. Вкратце, основные алфавитно цифровые клавиши ко­ди­ру­ют­ся как A (Alphanumeric), ряд буквой от A — пробел, до E — цифры (но при этом ряд пробела кодируется весь от­дель­ны­ми именами, и сам пробел — это <SPCE>), и номер клавиши в ряду двумя цифрами (при этом для нумерации иг­но­ри­ру­ют­ся мо­ди­фи­ка­то­ры и клавиша перед цифрами, где русская «Ё» — эта клавиша имеет отдельный код — <TLDE>); гуляющая по ря­дам в разных клавиатурах клавиша с обратным слэшем кодируется как <BKSL>. Таким образом у меня прописаны опре­де­ле­ния клавиш < (Б), > (Ю) и уже упомянутого обратного слэша.

В списке очевидным образом идут символы по уровням — от первого (клавиша без модификаторов) и далее — вообще уровней может быть много, но я использую только до четвертого, чего и всем желаю. Напомню, что второй уровень — это клавиша с [Shift], модификатор для третьего задается опциями XKB, а четвертый — это [L3]+[Shift].

Коды символов могут использоваться как зашитые в недрах системы (их список можно увидеть в файле /usr/include/X11/keysymdef.h), так и обыкновенный юникод. Но есть и два специальных значения: NoSymbol означает, что в данной позиции мы символ не перекрываем, т.е. должен использоваться определенный где-то ранее; а VoidSymbol означает отсутствие символа — при нажатии ничего не вводится. Как можно видеть, я использую NoSymbol в большинстве позиций, чтобы там остались старые значения. В первых двух случаях на третьем уровне находятся кавычки-елочки, они же двойные угловые кавычки, и на четвертый уровень я добавляю их одиночные вариации. В последней строке на третий уровень добавляется вертикальная черта, которая вообще-то на этой клавише уже есть на втором… но только в английской раскладке. А теперь, на третьем она будет и в русской раскладке тоже4.

Теперь наше определение символов нужно подключить. Вот такой скрипт у меня вызывается из автозапуска KDE:

#!/bin/sh

setxkbmap -layout "us+custom,ru:2+custom" \
  -option "" -option "grp:alt_shift_toggle,lv3:win_switch,lv3:ralt_switch,compose:caps" \
  -print | xkbcomp -I$HOME/.config/xkb - "${DISPLAY%%.*}"

Увы, мне не удалось заставить setxkbmap обрабатывать созданные мной правила (их я приводить здесь не буду, раз они все равно не рабочие), а без них эта программа отказывается устанавливать раскладку самостоятельно, почему и приходится использовать команду -print и передавать созданный xkb_keymap в xkbcomp. В принципе, его можно было б и сохранить, выглядит он так:

xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+us+custom+ru:2+custom:2+inet(evdev)+group(alt_shift_toggle)+level3(ralt_switch)+level3(win_switch)+compose(caps)"   };
        xkb_geometry  { include "pc(pc104)"     };
};

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

Что касается вызова xkbcomp, хочу обратить внимание на параметр -I$HOME/.config/xkb — указывается не каталог, где непосредственно лежит файл с символами, а корень конфигурации XKB, где находится подкаталог symbols и уже в нем наш файл. Именно через подкаталог xkbcomp его будет искать.

Данный способ расширения раскладки я проверил, помимо основной системы (KDE5, Gentoo) на виртуалках: Cinnamon (Linux Mint), GNOME (Ubuntu), Xfce (Xubuntu) и LXQt (Lubuntu). Везде все работает. По идее должно работать в любых системах, где используется XKB (и не используются различные экзотические способы ввода, вероятно).

Относительно же систем, уже использующих Wayland, рекомендую почитать вышеупомянутую серию постов «User-specific XKB configuration» и сделать дословно, как там описано. Кстати, посты там недавние, актуальные — можно позадавать автору вопросы (если английский позволяет).

Напоминаю, что если вам понравился и/или оказался полезным материал, вы можете поблагодарить автора и поддержать сайт любой суммой, которую сочтете уместной.

Итог

Ввод с клавиатуры в Linux очень гибко и мощно настраивается. Вводить можно любые символы юникода, ограничение тут скорее в том, чтобы их увидеть — это уже от шрифта зависит, но современные шрифты поддерживают много чего.

При этом базовая настройка простая и делается буквально в несколько кликов. Расширение же возможностей, хоть и слож­нее, но тоже не рокет-сайнс, и оно того стоит.

Список символов, покдлючаемый стандартной опцией misc:typo (или через настройки DE, где они есть), можно посмотреть в файле /usr/share/X11/xkb/symbols/typo, а можно пользоваться картинкой из этого поста — зря я что ли ее делал… Пред­ус­та­нов­лен­ные комбинации Compose, как выше уже упоминалось, располагаются в файле /usr/​share/​X11/​locale/​en_US.UTF-8/​Compose.

  1. Символы я определял, естественно не на глаз, а вводя в поле KCharSelect, так что в дублировании уверен. 

  2. Информация про футы из KCharSelect, вживую я такого обозначения не встречал. 

  3. Пользователи Firefox могут увидеть здесь домик раскрашенный в разные цвета, а не просто символ шрифта. Это делает именно браузер для многих «иконочных» символов. 

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