推荐xkeysnail,全局的keysnail

你可以试试 surfingkeys 我一直在chromium用的 比vimium好用很多

知道两个键盘如何同时生效吗?我现在笔记本一个自带的键盘,还有一个外接键盘。设置好xkeysnail后,发现在外接键盘上不能生效。我尝试按照网上的教程禁用笔记本上自带的键盘,但是还是禁止不了。不知道为什么。

我参照这个网页也试了一下,出现了下面这种错误,请问该如何解决?

❯ cd ~/.config/systemd/user/
❯ ls
xkeysnail.service
❯ systemctl --user enable xkeysnail
Failed to enable unit: Unit file /home/hcj/.config/systemd/user/default.target.wants/xkeysnail.service does not exist.
❯ sudo systemctl --user enable xkeysnail
[sudo] hcj 的密码:
Failed to connect to bus: 没有那个文件或目录
❯ groups
sys network power lp input wheel autologin hcj uinput

安装 xkeysnail

yay -S xkeysnail-git

配置开机自启动(参考自: xkeysnailをsystemdでデーモン化 - Qiita)

创建输入组

sudo groupadd uinput

添加一个不能登录的新用户到input和uinput组

sudo useradd -G input,uinput xkeysnail -s /sbin/nologin

新建系统文件, 设置input组访问内核的event

input.rules uinput.rules复制到/etc/udev/rules.d/

input.rules 文件内容如下

KERNEL=="event*", NAME="input/%k", MODE="660", GROUP="input"

uinput.rules 文件内容如下

KERNEL=="uinput", GROUP="uinput"

udev规则重新加载

su root
sudo udevadm control --reload-rules  && udevadm trigger

新建服务

sudo vim /etc/systemd/system/xkeysnail.service

内容如下

[Unit]
Description=xkeysnail
Requires = display-manager.service 
After = display-manager.service

[Service]
user=root
KillMode=process
ExecStartPre=/usr/bin/xhost +SI:localuser:root
#修改为自己的配置文件路径
ExecStart=/usr/bin/xkeysnail --quiet ~/config.py
Type=simple
Restart=always
RestartSec=10

# Update DISPLAY to be the same as `echo $DISPLAY` on your graphical terminal.
Environment=DISPLAY=:0

[Install]
WantedBy=default.target

启动服务

sudo systemctl start xkeysnail #开启服务
sudo systemctl status xkeysnail #查看服务状态
sudo systemctl enable xkeysnail #设置服务自启动

解决firefox alt 快捷键无效问题

firefox地址栏输入 about:config,把参数 ui.key.menuAccessKeyFocuses 修改为false.

重启电脑即可

遇到的问题(可忽略)

# xhost启动问题
##安装xhost
-yay -S xorg-xhost
##设置xhost自启动
系统设置——开机和关机——自动启动
- /usr/bin/xhost +SI:localuser:root
3 个赞

谢谢,昨天权限问题没有调整好,按照这个解决了 :smiley:

更简单的配置开机自启动

xkeysnail-macos 里面,找到了更简单的配置,只需配置一个自启动服务。

新建服务

sudo vim /etc/systemd/system/xkeysnail.service

内容如下

[Unit]
Description=xkeysnail

[Service]
Type=simple
KillMode=process
#修改为自己的配置文件路径
ExecStart=/usr/bin/sudo /usr/bin/xkeysnail --quiet ~/config.py
ExecStop=/usr/bin/sudo /usr/bin/killall xkeysnail
Restart=on-failure
RestartSec=3
Environment=DISPLAY=:0

[Install]
WantedBy=graphical.target

启动服务

sudo systemctl start xkeysnail #开启服务
sudo systemctl status xkeysnail #查看服务状态
sudo systemctl enable xkeysnail #设置服务自启动
3 个赞

赞,前置步骤都可以省略了吗,是因为改到了 graphical.target ?还有 xhost 呢?

之前我试过 ExecStartPre 的方法不行,于是把 xhost +SI:localuser:root & 放在了 .xinitrc

建议看下这里的配置,都写清楚了。

文档已经看过了,疑惑在于为什么他的配置可以简化至此,粗查了 systemd 的 graphical.target 还没有得到答案

不好意思一下问了太多问题,我还是等回家摸到电脑自己试试吧

你自己先试下,我也不是很懂😄️。
我说下我自己的理解:

难点

xkeysnail 需要监听输入事件做映射,只有root用户才有监听输入的权限。而在 service 里面应该是不好拿到 root 权限。

解决方法一

  1. 新建一个 xkeysnail 用户,并指定给该用户监听输入的权限。用该用户启动 xkeysnail。(第一种配置就是这么干的,配置比较麻烦)

解决方法二

  1. xhost命令:X服务器的访问控制工具。 xhost +SI:localuser:root 允许 root 用户访问正在执行的X服务。这样 service 中就可以 sudo 拿到 root 权限,执行 xkeysnail 。(配置比较简单,但是 root 运行程序有风险)
2 个赞

谢谢!终于弄明白了,配置也试过了。之前我裸眼对比,没注意到后面到配置加了 sudo :rofl:

service 的自启动方式, 在我电脑上用着偶尔会崩掉. 于是 翻了一下 issues. 发现了更简单的获取 sudo 权限的方式 https://github.com/mooz/xkeysnail/issues/64

配置如下(搬运)

  1. 首先创建一个新组,并将该组添加到您的用户
sudo groupadd -f uinput
sudo gpasswd -a $USER uinput
  1. 创建新的授予访问权限的udev规则:
cat <<EOF | sudo tee /etc/udev/rules.d/70-xkeysnail.rules
KERNEL=="uinput", GROUP="uinput", MODE="0660", OPTIONS+="static_node=uinput"
KERNEL=="event[0-9]*", GROUP="uinput", MODE="0660"
EOF
  1. 配置 xkeysnail 为开机自启动
##修改为自己的配置文件路径
xkeysnail --quiet ~/config.py
  1. 重启电脑.
1 个赞

请教一下,xkeysnail 能否改变 Capslock 按键的行为:

  1. 长按 Capslock 时,行为不变,仍然为切换大小写
  2. 点击 Capslock 时,映射为其他键,比如 F19 (或者 Ctrl-F19)

之所以有这个需求,是因为我在 Mac 和 Windows 通过 karabiner 和 AHK 已经实现了这个需求,希望 Arch Linux 下也能统一输入法切换的体验。

xkeysnail 有 timeout 功能,类似 karabiner 的 hold,自己探索吧。

我之前试过这样设置:

define_timeout(1)
define_multipurpose_modmap(
    {Key.CAPSLOCK: [Key.F9, Key.CAPSLOCK]}
)

但是他的行为是,在1 s 内按下并松开 capslock 会正确映射到了 F9. 但是如果超过 1s 就相当于长按 Shift ,松开并不会得到 capslock 灯亮。

啊,是了,得有长按、短按和单独按下松开、组合键的四种组合,有可能是逻辑和功能上没 karabiner 全。可以考虑反馈给 xkeysnail,早日对标 karabiner。

有人有在mac上使用过这个软件吗?xkeysnail在linux上感觉很好使用。有一个功能我在emacs中非常常用,就是enter键短按是原有enter功能;长按就是ctrol的功能。有过来人使用过这个的吗?

macOS 不用这个,用 karabiner。而且 macOS 本身大部分已经是 emacs 按键,只要修改一部分就可以实现全局 Emacs 风格的按键了。

这是我个人的配置,可以参考一下。

使用这个Karabiner-Elements,配置文件放置在~/.config/karabiner/karabiner.json 不生效。

我这是正常的,你看看HOME 目录下是不是也有一个 karabiner.json 或者类似的文件?