ckbcomp в Ubuntu: компиляция раскладок консоли на практике

Обзор

Стандартная виртуальная консоль (TTY) Linux не способна напрямую интерпретировать комплексные схемы XKB, применяемые графическим сервером. Чтобы перенести правила ввода в чисто текстовое окружение, используется инструмент ckbcomp, транслирующий описания XKB в нативные таблицы символов для утилиты loadkeys. В этом практическом руководстве мы шаг за шагом разберем весь процесс: от базовой компиляции и выбора национальных вариаций раскладок до переназначения модификаторов вроде CapsLock и немедленной загрузки конфигурации в ядро.

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

Для сборки и применения консольных раскладок из определений XKB установим вспомогательный стек утилит: пакеты console-setup, kbd и базу определений xkb-data.

Установка пакетов console-setup, kbd и xkb-data через apt-get

Команда ckbcomp считывает конфигурационные файлы XKB и преобразует их в текстовый формат, совместимый с подсистемой loadkeys.
Сгенерируем типовую раскладку для языка us и перенаправим вывод через конвейер в head -n 30, чтобы изучить первые строки структуры соответствия клавиш:

⚙️ [Ключевые параметры запуска]

-model : аппаратный тип клавиатуры (например, pc105, pc104).
-variant : региональная или эргономическая модификация (например, dvorak, colemak).
-option : специальные переключатели XKB для модификаторов (к примеру, замена CapsLock через ctrl:nocaps).
-charmap : целевая кодировка таблицы соответствия (обычно UTF-8 или ISO-8859-1).
-compact : объединение повторяющихся определений для сокращения итогового размера файла.
-freebsd : генерация синтаксиса виртуальной консоли FreeBSD вместо формата Linux.

Вывод скомпилированной раскладки US через ckbcomp

2. Тонкая настройка: выбор национальной модели (-model) и вариаций (-variant)

Для генерации раскладки под стандартное 105-клавишное устройство (-model pc105) с корейской языковой таблицей (-layout kr) передаем соответствующие флаги.
В листинге отображаются сопоставления скан-кодов конкретным символам Юникода для различных состояний клавиш-модификаторов.

Компиляция корейской раскладки для модели pc105

При работе с европейскими языками нередко требуется исключить задержку при вводе диакритических знаков. Добавим к немецкой раскладке (-layout de) модификатор -variant nodeadkeys.
Механизм «немых клавиш» отключается, благодаря чему символы умлаутов и акцентов отображаются в терминале моментально без ожидания составного ввода.

Генерация немецкой раскладки без немых клавиш

3. Кастомизация модификаторов: превращение CapsLock в Control

Параметр -option ctrl:nocaps переопределяет клавишу CapsLock, заставляя ее функционировать в качестве дополнительного Control. Проверим сгенерированный результат с помощью grep, отфильтровав упоминания Caps_Lock.
Поскольку поведение клавиши полностью изменено, идентификатор Caps_Lock исчезает из таблицы, оставляя вывод команды пустым.

Проверка отсутствия Caps_Lock при флаге ctrl:nocaps

Если необходимо сохранить обе функции, но поменять их местами, воспользуемся параметром -option ctrl:swapcaps.
В скомпилированном выводе видно взаимное переназначение: на позицию левого Control (keycode 29) теперь назначен Caps_Lock, а физический CapsLock выполняет роль управляющей клавиши.

Взаимная замена CapsLock и Control через ctrl:swapcaps

4. Экспорт раскладки в файл и мгновенное применение через loadkeys

Создадим в домашней директории специальный каталог для хранения сформированных карт клавиатуры:

Создание директории для хранения раскладок

Скомпилируем раскладку US с заменой CapsLock на Control и сохраним полученный текстовый поток в файл ~/keymaps/custom_us.map с помощью оператора перенаправления (>):

Сохранение скомпилированной раскладки в файл custom_us.map

Консольные утилиты Linux поддерживают сжатые таблицы. Выполним архивацию утилитой gzip -fk ~/keymaps/custom_us.map, где ключ -k позволяет сохранить исходный текстовый файл:

Сжатие сгенерированного файла раскладки с помощью gzip

Сравним характеристики файлов командой ls -lh ~/keymaps/custom_us.map*.
Исходная текстовая таблица объемом около 120 КБ после сжатия уменьшается до компактных 4.0 КБ:

Проверка размера несжатого и сжатого файлов раскладки

Загрузим созданную конфигурацию в текущую консоль TTY командой sudo loadkeys ~/keymaps/custom_us.map.
Операция выполняется мгновенно и без вывода ошибок, сразу активируя обновленное поведение клавиши Control в текстовом режиме.

Применение готовой раскладки в консоли с помощью loadkeys

Мы рассмотрели практический подход к трансляции раскладок XKB в консольный формат с помощью ckbcomp и их активации через loadkeys в Ubuntu.
Используя разобранные опции, вы сможете быстро настроить удобную клавиатурную среду в терминале Linux без долгого изучения страниц документации.