../interception-tools

interception-tools и dual-function-keys

Published:


Возможно вам повезёт, когда вы начинаете с Linux, опытные товарищи вам подскажут, что раскладку клавиатуры лучше переключать одной клавишей. И возможно вы преодолев синдром утёнка захотите это сделать. Один из популярных вариантов переключения раскладки это Caps_Lock. Нажимаем - меняем раскладку, нажимаем через Shift - включается Caps Lock.

(Если вы до сих пор меняете раскладку двумя клавишами, то возможно вы что-то делаете не так)

Позже, когда вы овладели vim или emacs, вам может остро захотеться сделать так, чтобы Ctrl был на месте Caps_Lock или Tab или даже сменить клавиатуру на HHKB, Pok3r или что-то ещё. Но в Linux есть замечательная interception-tools с плагином dual-function-keys, которые позволяют не только сменить Caps на Ctrl, но и добавить действие при удержании клавиши.

Можно например перебиндить клавиши так (как у меня):

Quick start

В конфиге важно не ошибиться с названием клавиатуры (NAME). Посмотреть название клавиатуры можно так (ZSH):

~ > for x (/dev/input/by-id/*-kbd) sudo uinput -p -d $x | rg NAME                                                   ± master | 25 Jan 09:43:09 (2)
NAME: A4TECH USB Device Keyboard
NAME: SEM HCT Keyboard

/etc/interception/udevmon.yaml:

- JOB: "intercept -g $DEVNODE | dual-function-keys -c /etc/interception/dual-function-keys/mappings.yaml | uinput -d $DEVNODE"
  DEVICE:
    NAME: "SEM HCT Keyboard"
    EVENTS:
      EV_KEY: [KEY_TAB, KEY_CAPSLOCK, KEY_LEFTSHIFT, KEY_LEFTCTRL, KEY_LEFTMETA, KEY_LEFTALT, KEY_RIGHTSHIFT, KEY_RIGHTALT]

/etc/interception/dual-function-keys/mappings.yaml:

MAPPINGS:
  - KEY: KEY_CAPSLOCK
    TAP: KEY_ESC
    HOLD: KEY_LEFTCTRL

  - KEY: KEY_TAB
    TAP: KEY_TAB
    HOLD: KEY_LEFTALT

  - KEY: KEY_LEFTCTRL
    TAP: KEY_UNKNOWN
    HOLD: KEY_UNKNOWN

  - KEY: KEY_LEFTMETA
    TAP: KEY_RIGHTMETA
    HOLD: KEY_LEFTCTRL

  - KEY: KEY_LEFTALT
    TAP: KEY_LEFTMETA
    HOLD: KEY_LEFTMETA

  - KEY: KEY_RIGHTALT
    TAP: KEY_CAPSLOCK
    HOLD: KEY_LEFTCTRL

  - KEY: KEY_LEFTSHIFT
    TAP: [ KEY_LEFTSHIFT, KEY_9, ]
    HOLD: KEY_LEFTSHIFT

  - KEY: KEY_RIGHTSHIFT
    TAP: [ KEY_RIGHTSHIFT, KEY_0, ]
    HOLD: KEY_RIGHTSHIFT

KEY_UNKNOWN вырубает действие/клавишу

В mappings.yaml я делаю некоторые лишние действия которые я не описал, возможно они вам не понадобятся

Остаётся только запустить сервис и эти биндинги у вас будут работать даже без графического окружения