Карабинер для Linux?

Фон: последние пять лет я использовал аппаратные средства Mac (большинство ноутбуков MacBook Pro по большей части) и программное обеспечение после многих лет использования Gnu/Linux на обычном ПК с эргономичными клавиатурами. Что еще более важно, как тяжелый пользователь Emacs, переход на Mac был болезненным, а стандартная короткая клавиатура Apple была безумной и неизбежной. Я предотвратил RSI с помощью инструмента Karabiner для сделайте два небольших, но очень важных изменения: 1) изменение клавиши "колпачок" для генерации клавиши меню (f13) при нажатии в одиночку, а ключевой код с управляющим ключом - при нажатии другой клавиши; 2) сменить ключ возврата аналогичным образом, получить возврат при нажатии в одиночку и ключ ключа с измененным ключом при нажатии другой клавишей. Разочарованный недавними решениями Apple для аппаратного и программного обеспечения, теперь я возвращаюсь в Gnu/Linux (Ubuntu, если это имеет значение), но придерживается ноутбуков Mac.

Вопрос: поскольку Karabiner - это инструмент только для OS X, у которого нет доступного аналога Gnu/Linux, похоже, мне придется писать и/или модифицировать некоторый код, чтобы получить ключ caplock и return Карабинер допускает двойное поведение. Автор Karabiner пишет, что xbindkeys и rbindkeys выполняют ключевое переназначение, но на первый взгляд они, похоже, не обрабатывают поведение двойной функции. Теперь я борюсь с портированием Карабинера или созданием нового инструмента целиком. И, несомненно, могут быть и другие подходы. Поэтому мой вопрос: какие советы по программированию вы бы предложили для решения этой проблемы? Особенно тот, который может быть разработан в часах, днях или неделях, а не в месяцах.

Примечания

1) Существуют различные подходы, связанные с изменениями поведения, такими как управление переключением и командные ключи. Многие из них были испытаны с разной степенью удовлетворения. Параллельный подход Karabiner - это ИМХО, далеко и далеко, наиболее эффективный в том, что он обеспечивает симметрию управляющего ключа на домашней строке клавиатуры и для всех приложений!

2) Также может быть предложено другое оборудование. Я пробовал компьютеры Dell, HP, Lenovo, Acer и смотрел гораздо больше. Ни один из них не сопоставим с объединенной мощностью, размером, чувством и стилем лучших продуктов Apple, хотя и по высокой цене. Например, Dell Precision 7510 громоздка и имеет трекпад, который похож на наждачную бумагу; Lenovo X1 (очень хорошая система) не имеет порта Thunderbolt; и др.

3) Внешние клавиатуры также не являются стартером из-за требования к ноутбуку; внешняя клавиатура на самолете или поезде не происходит.

Ответ 1

Вы можете добиться этого на TTY, Wayland и X11, используя Interception Tools, который напрямую взаимодействует с libevdev и libudev.

Установите Инструменты перехвата и такой плагин, как caps2esc или interception-k2k. Затем вам нужно настроить перехват для использования плагина. Для caps2esc вы можете использовать следующий файл /etc/udevmon.yaml:

- JOB: "intercept -g $DEVNODE | caps2esc | uinput -d $DEVNODE"
  DEVICE:
    EVENTS:
      EV_KEY: [KEY_CAPSLOCK, KEY_ESC]

Затем запустите его как root:

nice -n -20 /usr/bin/udevmon -c /etc/udevmon.yaml

Вы должны убедиться, что он начинается при входе в систему. Для systemd вы можете использовать следующий сервис:

[Unit]
Description=udevmon

[Service]
ExecStart=/usr/bin/nice -n -20 /usr/bin/udevmon -c /etc/udevmon.yaml

[Install]
WantedBy=multi-user.target

Для только для X11 вы можете использовать setxkbmap и xcape.

Сначала измените Caps Lock, чтобы он действовал как модификатор Ctrl:

setxkbmap -option caps:ctrl_modifier

Затем установите Caps Lock в качестве клавиши Menu, если она нажата меньше, чем время ожидания (по умолчанию 500 мс):

xcape -e 'Caps_Lock=Menu'

xcape работает как демон, поэтому вам нужно убедиться, что он запускается при входе в систему. setxkbmap устанавливает раскладку клавиатуры только для текущего сеанса X, вы можете установить ее постоянно в файлах конфигурации xinitrc, xprofile или X.

Постскриптум Для тех, кто хочет использовать внешнюю клавиатуру, Ultimate Hacking Keyboard (UHK) с открытым исходным кодом позволяет использовать эту функцию.