Раскладка клавиатуры. kanata

2024-11-13 · 6 мин. для прочтения

Раскладка клавиатуры. kanata.

Содержание

1 Общая информация

1.1 Сервисы

  • Онлайн симулятор kanata: https://jtroo.github.io/.
  • Можно загрузить свою конфигурацию и проверить.

2 Установка

2.1 Gentoo

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 Примеры использования

    1. Простой аккорд для ввода слова
    (defchordsv2
      (h l o)
      (macro h e l l o spc)
      200
      first-release
      ()
    )
    
    • Клавиши: h + l + o.
    • Действие: вводит “hello " (с пробелом).
    • Таймаут: 200 мс.
    • Активация: при отпускании любой клавиши.
    1. Аккорд с управлением регистром
    (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, что может быть недетерминированным при пересечении слоёв.
  • Интеграция с макросами

    • Аккорды часто используют macro для:
      • Ввода текста с пробелами: (macro hello spc) → “hello “.
      • Управления модификаторами: (t! rls-sft) для сброса Shift.
  • Ограничения

    • Минимум 2 клавиши в аккорде.
    • Нет встроенной поддержки автоматического пробела/заглавных букв — это настраивается вручную через макросы.

5 Примеры конфигураций

Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.