9 个版本

0.1.8 2020 年 8 月 21 日
0.1.7 2020 年 6 月 13 日
0.1.2 2020 年 5 月 29 日

#2481 in 命令行工具

每月 23 次下载

GPL-3.0 许可证

285KB
3.5K SLoC

ktrl

Crates.io

TL;DR

ktrl 是一个 Linux 键盘编程守护进程。它的目标是帮助你在无尽的追求中实现终极键绑定设置。

你可以先尝试将几个修饰键重新映射(例如 CapLockCtrl)。或者你可以全力以赴,创建一个具有双重功能键、按键舞蹈等复杂分层设置的方案...

ktrl 受开源键盘固件项目 QMK 的极大启发。你可以将 ktrl 视为尝试将 QMK 作为 Linux 守护进程重新实现。

这是一个 alpha 状态的项目。如果你发现任何错误或异常,请与我联系。

目录

简介

ktrl 位于人机界面软件堆栈的中间。它位于用户空间中,在内核和您的显示服务器(即 X11 / Wayland)之间。

这种位置使 ktrl 能够完全控制键盘生成的事件。这些事件要么透明地传递,要么转换为 ktrl 的 "效果"(关于这一点稍后讨论)。

功能概述

除了显而易见的关键映射功能之外,以下是一些您可以使用 ktrl 实现的主要功能 -

分层

尽管 "分层" 可能听起来很陌生,但它是一件您已经很熟悉的事情。毕竟,您经常通过使用修饰键和功能键来应用 "分层" :)

QMK 将这种机制推广开来。让您设计自己的自定义键盘分层!

如果您觉得这听起来很复杂,我鼓励您查看 QMK 关于分层的文档

按键保持(双重功能键)

轻触并保持键允许您在按键时执行一项操作,在长按时执行另一项操作。例如,您可以让空格键在轻触时正常工作,但在长按时作为Ctrl键使用。

按键舞蹈(多击)

轻触舞动与轻触并保持非常相似。如果轻触一次,按键将按一种方式工作;如果多次轻触,则将按不同的方式工作。

MehHyper

同样,这两者都是毫无顾忌地从QMK中借鉴来的。《Meh》和《Hyper》是创建可能永远不会与现有按键冲突的按键绑定的特殊修饰符。这是可能的,因为《Hyper》相当于同时按下《Ctrl》、《Alt》和《Shift》以及《Win》,而《Meh》等同于同时按下《Ctrl》、《Alt》和《Shift》。

可听反馈

曾经想要将您最喜欢的8位音乐绑定到按键上吗?现在您可以做到了!虽然这个功能可以让您的黑客活动更加音乐化,但它还有一些非常实用的用途。

例如,它可以帮助您通过声音反馈建立新的肌肉记忆连接。下面以Capslock和Ctrl的例子了解更多。

安装

获取可执行文件

首先,获取主ktrl可执行文件。下面是如何做到这一点——

sudo cargo install --root /usr/local ktrl

注意:您可能需要安装alsa开发绑定、autoconflibtool。对于Debian/Ubuntu发行版,可以使用以下命令来完成:

# apt install libalsa-ocaml-dev autoconf libtool libtool-bin

设置ktrl的用户和组

虽然有点繁琐,但这一步确保我们可以无需root权限运行ktrl。我们不会以root身份运行它,而是为ktrl创建一个新用户。然后,我们将新用户添加到输入和音频组。让我们开始吧——

sudo useradd -r -s /bin/false ktrl
sudo groupadd uinput
sudo usermod -aG input ktrl
sudo usermod -aG uinput ktrl

# If you're using the sound effects
sudo usermod -aG audio ktrl

现在,让我们添加一个新的udev规则,允许ktrl写入/dev/uinput/dev/uinput是ktrl的输出设备。您的键盘是输入设备。

git clone https://github.com/itaygarin/ktrl
cd ktrl
sudo cp ./etc/99-uinput.rules /etc/udev/rules.d/

请注意,您需要重新启动计算机才能使更改生效...

设置ktrl的资源和配置

现在,是时候决定您希望ktrl的资源和配置在哪里了。

默认情况下,ktrl会假设您将这些放置在/opt/ktrl下。具体来说,是/opt/ktrl/cfg.ron/opt/ktrl/assets。尽管如此,您可以使用--cfg--assets命令行参数覆盖这些默认值。

要设置默认值,您可以按照以下步骤操作——

# Asumming you've already cloned and cd`d into the ktrl project

sudo mkdir /opt/ktrl
sudo cp -r ./assets /opt/ktrl
sudo cp examples/cfg.ron /opt/ktrl

sudo chown -R ktrl:$USER /opt/ktrl
sudo chmod -R 0770 /opt/ktrl

定位您的键盘输入设备

为了ktrl能够工作,您必须为它提供一个指向您的键盘输入设备的路径。输入设备位于/dev/input目录中。

Linux提供了两个方便的符号链接目录,使搜索过程更容易。这两个目录是/dev/input/by-id/dev/input/by-path

在这些两个目录中,键盘设备通常具有-kbd后缀。例如,在我的笔记本电脑上,路径是/dev/input/by-path/platform-i8042-serio-0-event-kbd

蓝牙键盘位置

如果您正在使用蓝牙键盘,您将需要定位相关的/dev/input/event<#>,因为/dev/input/by-*只列出USB连接的输入。最好的做法是运行cat /proc/bus/input/devices并搜索相关的蓝牙键盘(Phys输出将包含MAC地址)。以下是一个例子

I: Bus=0005 Vendor=05ac Product=0239 Version=0050
N: Name="My Keyboard"
P: Phys=SO:ME:MA:CA:DD:RS
S: Sysfs=/devices/pci0000:00/0000:00:01.2/0000:02:00.0/0000:03:08.0/0000:07:00.3/usb3/3-5/3-5:1.0/bluetooth/hci0/hci0:256/0005:05AC:0239.0009/input/input40
U: Uniq=SO:ME:MA:CA:DD:RS
H: Handlers=sysrq kbd event25 leds
<snip>

请注意在Handlers中,它告诉我们需要的事件号。因此,我们设备的位置是/dev/input/event25

设置ktrl为服务(可选)

ktrl 是一个设计为在后台进程运行的守护进程。因此,你可能希望将其设置为服务。如果你只想尝试它,可以跳过此步骤。

创建服务的具体步骤因发行版而异,但以下是一些基于 systemd 的系统基本步骤,以供参考——

# Again, asumming you've cloned and cd`d into the ktrl project

edit ./etc/ktrl.service # change your device path
sudo cp ./etc/ktrl.service /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl start ktrl.service

配置

最后,我们来到了有趣的部分!但在组装第一个配置文件之前,让我们简要介绍一下 ktrl 的配置原语。

原语

输入事件代码

ktrl 在所有地方都使用 Linux 的输入事件代码。完整列表可以在 Linux 的代码库中找到,链接为 这里,或者查看 ktrl 的 KeyCode 枚举。

具体来说,ktrl 使用描述键盘键的事件代码子集。例如,KEY_AKEY_LEFTCTRL 描述的是 'A' 键和左 Ctrl 键。

动作

在一个层中,我们将源键(例如 KEY_A)映射到 Action。动作描述了对源键应用的 物理输入 运动。例如,一个 TapHold 描述了一个 点击 和一个 保持

动作列表
  • Tap:这是默认的键盘动作。用于简单的键重映射。
  • TapHold:为点击和保持附加不同的 Effect
  • TapDance:为点击和多次点击附加不同的 Effect

效果

Action 将包含一个或多个 Effect。这些是动作之后出现的 虚拟输出 效果。例如播放声音、切换层、发送键序列等...

效果列表
  • NoOp:正如其名。这不会做任何事情。
  • Key:这是你“熟悉”的默认效果。
  • KeySticky:一旦按下,键将保持激活状态,直到再次按下(类似于 Capslock)。
  • KeySeq:同时输出多个键。例如 MehHyper 都是 KeySeq
  • MehKeySeq(KEY_LEFTCTRL, KEY_LEFTALT, KEY_LEFTSHIFT) 的缩写。
  • HyperKeySeq(KEY_LEFTCTRL, KEY_LEFTALT, KEY_LEFTSHIFT, KEY_LEFTMETA) 的缩写。
  • ActivateProfile:激活用户定义的配置文件。
  • DeactivateProfile:停用用户定义的配置文件。
  • DeactivateAllProfiles:停用所有用户定义的配置文件。
  • ToggleLayerAlias:按下时,要么打开要么关闭一个命名的层。
  • ToggleLayer:按下时,要么打开要么关闭一个层。
  • MomentaryLayer:按下时,相关的层将保持激活。
  • Sound:播放预构建的声音之一。
  • SoundEx:播放你提供的自定义声音。
  • Multi:让你组合上述所有效果。例如 Multi([Sound(Sticky), KeySticky(KEY_LEFTCTRL)])

配置文件格式

使用ktrl时,可以利用优秀的ron(Rust对象表示法)来简化配置的序列化。该格式应该非常直观,但请参考提供的cfg.ron以获取实际示例。

示例

Ctrl 重新映射到 Capslock

这可能是你现在可以做出的最有效且简单的改变之一。你的无名指将长期感谢这个改变。

在ktrl中这样做很简单。在你的某一层中,添加以下内容:

KEY_CAPSLOCK:  Tap(Key(KEY_LEFTCTRL)),
KEY_LEFTCTRL:  Tap(Key(KEY_LEFTCTRL))),

不过,让我们让这个更有趣一些,好吗?

为了使过渡更平滑,让我们为左Ctrl添加一个错误声音效果。这将提醒你你正在做错事——

KEY_CAPSLOCK:  Tap(Key(KEY_LEFTCTRL)),
KEY_LEFTCTRL:  Tap(Multi([Key(KEY_LEFTCTRL), Sound(Error)])),

啊,好多了!

当然,你也可以直接跳过,只留下声音效果。如下所示——

KEY_CAPSLOCK:  Tap(Key(KEY_LEFTCTRL)),
KEY_LEFTCTRL:  Tap(Sound(Error)),

主键盘行修饰符

我一直在尝试的另一个改变是将修饰符映射到主键行。注意,你必须调整tap_hold_wait_time配置值以避免误判。

以下是一个示例设置——

KEY_A:  TapHold(Key(KEY_A), Key(KEY_LEFTCTRL)),
KEY_S:  TapHold(Key(KEY_S), Key(KEY_LEFTSHIFT)),
KEY_D:  TapHold(Key(KEY_D), Key(KEY_LEFTALT)),

这将使ASD在轻触时正常工作,在按住时作为修饰符。

限制

  • TapHoldTapDance需要校准和调整。如上所述,你必须调整这两个的等待时间以最小化误判。

类似项目

  • alt:一个连接到ktrl的事件聚合器
  • QMK:一个开源键盘固件(ktrl的灵感来源)
  • kmonad:与ktrl非常相似(用Haskell编写)
  • xcape:仅对修饰符实现轻触保持(Linux)
  • Space2Ctrl:与xcape相似
  • interception tools:实现工具如ktrl的框架
  • karabiner-elements:成熟的Mac键盘自定义工具

依赖项

~5–14MB
~166K SLoC