9 个版本
0.1.8 | 2020 年 8 月 21 日 |
---|---|
0.1.7 | 2020 年 6 月 13 日 |
0.1.2 | 2020 年 5 月 29 日 |
#2481 in 命令行工具
每月 23 次下载
285KB
3.5K SLoC
ktrl
TL;DR
ktrl 是一个 Linux 键盘编程守护进程。它的目标是帮助你在无尽的追求中实现终极键绑定设置。
你可以先尝试将几个修饰键重新映射(例如 CapLock
到 Ctrl
)。或者你可以全力以赴,创建一个具有双重功能键、按键舞蹈等复杂分层设置的方案...
ktrl 受开源键盘固件项目 QMK 的极大启发。你可以将 ktrl 视为尝试将 QMK 作为 Linux 守护进程重新实现。
这是一个 alpha 状态的项目。如果你发现任何错误或异常,请与我联系。
目录
简介
ktrl 位于人机界面软件堆栈的中间。它位于用户空间中,在内核和您的显示服务器(即 X11 / Wayland)之间。
这种位置使 ktrl 能够完全控制键盘生成的事件。这些事件要么透明地传递,要么转换为 ktrl 的 "效果"(关于这一点稍后讨论)。
功能概述
除了显而易见的关键映射功能之外,以下是一些您可以使用 ktrl 实现的主要功能 -
分层
尽管 "分层" 可能听起来很陌生,但它是一件您已经很熟悉的事情。毕竟,您经常通过使用修饰键和功能键来应用 "分层" :)
QMK 将这种机制推广开来。让您设计自己的自定义键盘分层!
如果您觉得这听起来很复杂,我鼓励您查看 QMK 关于分层的文档。
按键保持(双重功能键)
轻触并保持键允许您在按键时执行一项操作,在长按时执行另一项操作。例如,您可以让空格键在轻触时正常工作,但在长按时作为Ctrl键使用。
按键舞蹈(多击)
轻触舞动与轻触并保持非常相似。如果轻触一次,按键将按一种方式工作;如果多次轻触,则将按不同的方式工作。
Meh
和 Hyper
同样,这两者都是毫无顾忌地从QMK中借鉴来的。《Meh》和《Hyper》是创建可能永远不会与现有按键冲突的按键绑定的特殊修饰符。这是可能的,因为《Hyper》相当于同时按下《Ctrl》、《Alt》和《Shift》以及《Win》,而《Meh》等同于同时按下《Ctrl》、《Alt》和《Shift》。
可听反馈
曾经想要将您最喜欢的8位音乐绑定到按键上吗?现在您可以做到了!虽然这个功能可以让您的黑客活动更加音乐化,但它还有一些非常实用的用途。
例如,它可以帮助您通过声音反馈建立新的肌肉记忆连接。下面以Capslock和Ctrl的例子了解更多。
安装
获取可执行文件
首先,获取主ktrl
可执行文件。下面是如何做到这一点——
sudo cargo install --root /usr/local ktrl
注意:您可能需要安装alsa
开发绑定、autoconf
和libtool
。对于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_A
和 KEY_LEFTCTRL
描述的是 'A' 键和左 Ctrl 键。
动作
在一个层中,我们将源键(例如 KEY_A
)映射到 Action
。动作描述了对源键应用的 物理输入 运动。例如,一个 TapHold
描述了一个 点击 和一个 保持。
动作列表
Tap
:这是默认的键盘动作。用于简单的键重映射。TapHold
:为点击和保持附加不同的Effect
。TapDance
:为点击和多次点击附加不同的Effect
。
效果
Action
将包含一个或多个 Effect
。这些是动作之后出现的 虚拟输出 效果。例如播放声音、切换层、发送键序列等...
效果列表
NoOp
:正如其名。这不会做任何事情。Key
:这是你“熟悉”的默认效果。KeySticky
:一旦按下,键将保持激活状态,直到再次按下(类似于 Capslock)。KeySeq
:同时输出多个键。例如Meh
和Hyper
都是KeySeq
。Meh
:KeySeq(KEY_LEFTCTRL, KEY_LEFTALT, KEY_LEFTSHIFT)
的缩写。Hyper
:KeySeq(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)),
这将使A
、S
和D
在轻触时正常工作,在按住时作为修饰符。
限制
TapHold
和TapDance
需要校准和调整。如上所述,你必须调整这两个的等待时间以最小化误判。
类似项目
- alt:一个连接到ktrl的事件聚合器
- QMK:一个开源键盘固件(ktrl的灵感来源)
- kmonad:与ktrl非常相似(用Haskell编写)
- xcape:仅对修饰符实现轻触保持(Linux)
- Space2Ctrl:与
xcape
相似 - interception tools:实现工具如ktrl的框架
- karabiner-elements:成熟的Mac键盘自定义工具
依赖项
~5–14MB
~166K SLoC