Раскладка клавиатуры. kanata
2024-11-13
·
6 мин. для прочтения
Раскладка клавиатуры. kanata.
Содержание
1 Общая информация
- Репозиторий: https://github.com/jtroo/kanata
- Документация: https://github.com/jtroo/kanata/blob/main/docs/config.adoc
- Поддержка ОС: Linux, Windows, MacOS.
- Язык реализации: Rust.
1.1 Сервисы
- Онлайн симулятор kanata: https://jtroo.github.io/.
- Можно загрузить свою конфигурацию и проверить.
2 Установка
2.1 Gentoo
- Репозиторий karma (см. Gentoo. Репозиторий karma):
emerge app-misc/kanata
3 Настройки доступа для Linux
- В Linux kanata должна иметь доступ к подсистемам
input
иuinput
для работы с событиями.
3.1 Группа uinput
- Проверьте наличие группы
uinput
:getent group | grep uinput
- Если группы нет, создайте её:
sudo groupadd uinput
3.2 Добавьте пользователя в нужные группы
- Нужно добавить пользователей в группы
input
иuinput
:sudo usermod -aG input $USER sudo usermod -aG uinput $USER
- Убедитесь, что пользователь добавлен в группы:
groups
- Возможно, вам придётся выйти из системы и залогиниться обратно.
3.3 Права доступа к файлу устройства
- Добавьте правило udev (в
/etc/udev/rules.d
или/lib/udev/rules.d
):KERNEL=="uinput", MODE="0660", GROUP="uinput", OPTIONS+="static_node=uinput"
- Перечитайте права доступа:
sudo udevadm control --reload && udevadm trigger --verbose --sysname-match=uniput
3.4 Загрузите модуль ядра
- Вручную это можно сделать так:
sudo modprobe uinput
- Для автоматической загрузки добавьте в файл
/etc/modules-load.d/uinput.conf
:uinput
4 Пример разделов файла конфигурации
- Файла конфигурации по умолчанию
~/.config/kanata/kanata.kbd
4.1 defcfg
- В этом разделе хранятся «глобальные» параметры, которые применяются ко всему Kanata.
- Например, настроим, чтобы обрабатывалась каждая нажатая клавишу, независимо от того, указана ли она в конфигурации явно.
- Будем отслеживать, на каком слое происходит работа.
(defcfg
process-unmapped-keys yes
log-layer-changes yes
)
4.2 defsrc
- Этот раздел может появляться в конфигурации только один раз.
- Он сообщает Kanata, какие исходные клавиши следует ожидать для сопоставления.
- Можно Задавать только интересующие нас клавиши.
(defsrc esc grv caps a s d f g h j k l scln lalt spc ralt )
4.3 deflayer
- Можно определить много слоёв и активировать их нажатием клавиш.
- Например, определим два слоя: всегда активный слой, который означает клавиши, которые я хочу постоянно переназначать, чтобы делать что-то другое, и второй слой, который активируется только тогда, когда я удерживаю
caps lock
. - Переназначаемые клавиши должны быть в том же порядке, что и исходный слой выше.
- Символ
_
задаёт прозрачные ключи, их отображение не изменяется и передаётся прозрачно. @
обозначает псевдоним.- В этом примере слой по умолчанию изменяет функциональность всех клавиш, за исключением
g
,h
, иspc
потому, что они прозрачны. - Левый
alt
меняется наescape
. - Правый
alt
меняется наbackspace
. - В слое
cap-Mod
клавишиh
,j
,k
,l
становятся клавишами со стрелками.(deflayer default @esc @grv @cap @a @s @d @f _ _ @j @k @l @scln esc _ bspc ) (deflayer cap-mod _ _ _ _ _ _ _ _ left down up rght _ _ _ _ )
4.4 defvar
- Kanata позволяет тонко настраивать поведение, указывая такие вещи, как длительность нажатия клавиши, чтобы она считалась «удержанной».
- Хотя можно вводить эти значения (в миллисекундах) каждый раз, проще определить их как переменную в одном месте и ссылаться на них повсюду.
(defvar tap-time 200 hold-time 250 )
4.5 defalias
- Здесь определяются все псевдонимы (
@
). - Псевдоним принимает форму:
name-of-alias-without-@sign (type-of-functionality options-for-that-function multiple-options-are-space-separated)
.(defalias esc (tap-hold-press $tap-time $hold-time esc caps) grv (tap-hold-press $tap-time $hold-time S-grv grv) capsword (caps-word 2000) cap (tap-hold-press $tap-time $hold-time @capsword (layer-toggle cap-mod)) a (tap-hold $tap-time $hold-time a lmet) s (tap-hold $tap-time $hold-time s lalt) d (tap-hold $tap-time $hold-time d lsft) f (tap-hold $tap-time $hold-time f lctl) j (tap-hold $tap-time $hold-time j rctl) k (tap-hold $tap-time $hold-time k rsft) l (tap-hold $tap-time $hold-time l lalt) scln (tap-hold $tap-time $hold-time scln lmet) )
tap-hold
: позволяет нам определить, что происходит, когда мы нажимаем клавишу, а когда удерживаем.tap-hold
имеет 4 варианта:$tap-time
количество миллисекунд, в течение которых клавиша может быть нажата, при этом нажатие будет считаться одним нажатием;$hold-time
количество миллисекунд, в течение которых клавиша должна оставаться нажатой, чтобы она считалась удержанием;- код клавиши, который мы хотим, чтобы Каната использовала при нажатии;
- код клавиши, который Каната должен использовать при удержании клавиши.
tap-hold-press
похоже наtap-hold
, но помогает лучше управлять моментами нажатия.caps-word
: функция, которая позволяет вам вводить CAPITALIZED_WORDS и автоматически отключает CAPS, если это не буква или подчеркивание.
4.6 Аккорды (defchords)
Простые аккорды без гибких таймаутов и release-поведения.
Позволяют выполнять различные действия в зависимости от того, какая конкретная комбинация клавиш ввода нажимаются вместе.
Такая неупорядоченная комбинация клавиш называется аккорд.
Входные аккорды настраиваются аналогично
defalias
с двумя дополнительными параметрами в начале каждой группыdefchords
:- название группы;
- значение тайм-аута, по истечении которого аккорд срабатывает, если он не был сработан при отпускании клавиши.
Пример:
(defsrc a b c) (deflayer default @cha @chb @chc ) (defalias cha (chord example a) chb (chord example b) chc (chord example c) ) (defchords example 500 (a ) a ( b ) b (a c) C-v (a b c) @three )
- Первый элемент каждой пары определяет клавиши, составляющие данный аккорд.
- Второй элемент каждой пары –— это действие, которое должно быть выполнено.
- В отличие от
defseq
, эти ключи не соответствуют напрямую реальным ключам и являются просто произвольными метками, которые имеют смысл в контексте аккорда.
4.7 Аккорды (defchordsv2)
- Расширенные настройки, интеграция с макросами, управление слоями.
4.7.1 Синтаксис defchordsv2
Синтаксис
defchordsv2
(defchordsv2 (participating-keys1) action1 timeout1 release-behaviour1 (disabled-layers1) ... (participating-keysN) actionN timeoutN release-behaviourN (disabled-layersN) )
Каждый аккорд задаётся 5-кортежем:
participating-keys
— список клавиш, участвующих в аккорде (например,(d a y)
).action
— действие, выполняемое при активации (макрос, переключение слоя и т.д.).timeout
— время (в мс), в течение которого клавиши должны быть нажаты для активации.release-behaviour
— поведение при отпускании клавиш:first-release
: аккорд активируется при отпускании любой клавиши.last-release
: аккорд активируется при отпускании всех клавиш.
disabled-layers
— слои, где аккорд не работает (например,()
для всех слоёв).
4.7.2 Примеры использования
- Простой аккорд для ввода слова
(defchordsv2 (h l o) (macro h e l l o spc) 200 first-release () )
- Клавиши:
h + l + o
. - Действие: вводит “hello " (с пробелом).
- Таймаут: 200 мс.
- Активация: при отпускании любой клавиши.
- Аккорд с управлением регистром
(defvirtualkeys rls-sft (multi (release-key lsft) (release-key rsft))) (defchordsv2 (d a y) (macro sldr d (t! rls-sft) a y spc nop0) 200 first-release () )
- Клавиши:
d + a + y
. - Действие:
(t! rls-sft)
— отпускает Shift.- Вводит “day " (с пробелом).
nop0
— блокирует исходные клавиши.
4.7.3 Особенности
Обратное сопоставление
- Для работы с текстовыми словарями (как в ZipChord) требуется ручное сопоставление символов с клавишами
defsrc
, что может быть недетерминированным при пересечении слоёв.
- Для работы с текстовыми словарями (как в ZipChord) требуется ручное сопоставление символов с клавишами
Интеграция с макросами
- Аккорды часто используют
macro
для:- Ввода текста с пробелами:
(macro hello spc)
→ “hello “. - Управления модификаторами:
(t! rls-sft)
для сброса Shift.
- Ввода текста с пробелами:
- Аккорды часто используют
Ограничения
- Минимум 2 клавиши в аккорде.
- Нет встроенной поддержки автоматического пробела/заглавных букв — это настраивается вручную через макросы.