我正在尝试将无用的 Caps Lock 键重新用于 16.04 MATE 上的一些有用功能。我遇到了
setxkbmap -option ctrl:nocaps
禁用它,但是可以重新映射它以播放/暂停 VLC 吗?谢谢您的回答!
答案1
evtest 和 dbus
这是一个涉及在后台运行的小脚本的版本。需要采取几个简单的步骤:
安装事件测试程序:
sudo apt install evtest
。该程序能够解码并打印来自/dev/input/
设备层次结构的原始事件。将您的用户帐户添加到组
input
。注销并再次登录。(这是必要的,因为我们要从下的某个设备读取数据/dev/input/
,这通常只能由 root 或组中的用户完成input
。我们可以以 root 身份运行脚本,但随后我们必须找到一种方法来告诉它需要与哪个用户 dbus 实例通信。)像您一样禁用 capslock 键或使用相应的 Mate 偏好设置。如果您像许多人一样将 capslock 键映射到 ctrl,它也会起作用。
将以下脚本存储在某处,例如
$HOME/bin/capshack
并使其可执行:#!/bin/bash KEYBOARD=/dev/input/by-path/platform-i8042-serio-0-event-kbd EVENT="type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 1" toggleVLC () { dbus-send \ --type=method_call \ --dest=org.mpris.MediaPlayer2.vlc \ /org/mpris/MediaPlayer2 \ org.mpris.MediaPlayer2.Player.PlayPause } evtest "$KEYBOARD" | \ while read line do if [[ "$line" == *"$EVENT" ]] then toggleVLC fi done
上述脚本将监听您的键盘事件并在按下 capslock 键时执行命令。运行的命令是使用 dbus 将播放/暂停事件发送到正在运行的 VLC 实例。您可能需要调整变量KEYBOARD
以指向您的实际键盘,但上述值可能会起作用。
如果你希望在以下情况下调用 toggleVLC() 函数:发布capslock 键,您可以更改EVENT
脚本中的变量,使其以value 0
而不是结尾value 1
。
此外,对于您来说,capslock 键的键码可能与 58 不同。您可以通过运行 来检查这一点evtest
,查看按下 capslock 时的输出,并相应地调整 EVENT 变量。您甚至不必通过键码进行匹配,只需将 EVENT 设置为 即可(KEY_CAPSLOCK), value 1
。
除了使用 evtest 和上面的脚本之外,您还可以使用触发快乐包(类似的东西thd --dump /dev/input/*
会给出类似的输出)但我发现这没什么教育意义。
现在我们创建一个用户 systemd 单元来在后台自动启动该脚本:
创建用户 systemd 层次结构:
mkdir -p $HOME/.config/systemd/user
将以下文本添加到文件
$HOME/.config/systemd/user/capshack.service
[Unit] Description=Abuse capslock key [Service] ExecStart=%h/bin/capshack [Install] WantedBy=default.target
启用刚刚创建的服务单元:
systemctl --user enable capshack
启动服务:
systemctl --user start capshack
从现在起,您应该能够使用 Capslock 键在 VLC 中切换播放/暂停。登录时,后台脚本应该会自动启动。
好战
正如前面提到的,您也可以使用 triggerhappy 包来执行此操作。对于那些不想摆弄系统而更喜欢更可靠的解决方案的人来说,这是首选方法。
input
像上面一样将用户添加到组中安装软件包:
sudo apt install triggerhappy
为 triggerhappy 添加配置
~/.config/thd/capslock.conf
:KEY_CAPSLOCK 1 dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
像这样运行 thd:
thd --triggers ~/.config/thd/capslock.conf /dev/input/event*
让 thd 以类似于 capshack 描述的方式为您的用户运行。
确保您只运行上述方法之一(capshack 或 thd),以免每次按下键时都进行双重切换。
我在 18.04 标准会话和 16.04 mate 上测试了所有这些。但理论上它也应该在 wayland 或其他桌面环境下工作。
答案2
在 Ubuntu 16.04 中,经过数小时的谷歌搜索和摆弄后dconf-editor
,xbindkeys
我发现了一个非常简单的解决方案:
- 2 分钟内即可快速完成设置
- 只需要安装 xdotool
- 无需脚本
- 大写锁定仍能识别,但无法切换字母大小写
- 适用于标准 Ubuntu 键盘自定义快捷键设置
如果你需要 GnomeXF86AudioPlay
支持,你需要xdotool
(不需要甚高频液晶正如 OP 所规定的那样):
sudo apt install xdotool
现在到了棘手的部分。每次按下Caps LocK按键在播放和暂停之间切换音乐时,大写字母也会切换为关闭和打开。
使用此方法关闭 Caps Lock 切换,同时仍保持按键处于活动状态:
setxkbmap -option caps:none
遵循 Gnome 的音乐播放器
然后在 Ubuntu 16.04 中进入设置>>键盘>>快捷键>>自定义快捷键:
- 设置姓名到
Audio Play
- 设置命令到
xdotool key XF86AudioPlay
- 然后点击Apply按钮
添加新选项后,分配的快捷键将显示已禁用。 点击已禁用当提示分配键时按下该Caps LocK键。
像 VLC 这样的音乐播放器
按照上一节中针对 Gnome 的步骤操作,但对于命令改用这个:
qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
甚高频液晶无法识别媒体键:如何使键盘媒体键全局与 VLC 配合使用?即使内置于键盘中。因此自定义键盘快捷键 XF86AudioPlay 对 毫无用处xdotool
。
从命令行设置自定义键盘快捷键
此问答讨论了如何从命令行设置自定义键盘快捷键:如何从终端设置自定义键盘快捷键?
永久停用大写锁定
下一步是让它setxkbmap -option caps:none
在重启后仍然有效。谷歌搜索后,Terdon 给出了以下答案:保存 setxkbdmap 设置:
一个简单的方法是将命令添加到您的$HOME/.profile
文件中(如果不存在,您可以创建它):
setxkbmap -option caps:none
这样它就会在您每次登录时运行。
笔记您应该使用$HOME/.profile
而不是$HOME/.bash_profile
或$HOME/.bashrc
其他类似文件。这是因为您的登录管理器应该读取此设置。
答案3
此答案已在虚拟机中的 Ubuntu MATE 16.04.4 LTS 上进行了测试(但键盘是直通的 USB 键盘,因此应该没有区别)。它也不需要额外的软件,并且可以在 vanilla 安装中完成,而无需安装任何软件包,并且它在靴子之间是持久的。
重新映射 Caps Lock
以 root 身份编辑文件
/usr/share/X11/xkb/symbols/pc
。注意不要在这里犯错误(例如忘记逗号),因为如果这样做,您可能无法再使用键盘。(猜猜我学到了什么?;)注释掉以下行
key <CAPS> { [ Caps_Lock ] };
//
在其开头 放置两个正斜杠 ( )。在其下方添加以下行:
key <CAPS> { [ XF86AudioPlay, XF86AudioPause ] };
注释掉以下行
modifier_map Lock { Caps_Lock };
与上述方法相同。
重启。
注:(鸣谢丹泽尔(感谢您指出这一点)对软件包的更新xkb-data
可能会覆盖此文件。防止这种情况发生的一个相当安全的方法是使用 转移路径dpkg-divert
。(我说“相当安全”是因为该文件的上游源代码三年来没有被修改过。)
替代方法
在键盘布局设置中手动禁用 Caps Lock 键,然后使用这个答案添加您自己的键重新映射。
问题?
您的大写锁定键不再锁定大写,此时它已重新映射到播放/暂停。您现在应该能够在 VLC 中播放和暂停音乐。如果此时可以正常工作,您可以跳过这些说明的其余部分。
但是,当我尝试时,VLC 没有响应播放/暂停键。
确保键盘快捷键设置正确
答案4
将 CapsLock 键设为播放/暂停键
此解决方案将把 Capslock 键的扫描码重新映射到内核输入驱动程序中的其他键码,在本例中为播放/暂停。
优点
- 无需修改现有系统文件(只需创建一个新文件)
- 应用程序不知道这实际上是一个大写锁定键,但认为按下了真正的播放/暂停键
- 无需禁用大写锁定,不会弄乱
xkb
配置
缺点
- 必须针对每个键盘单独进行(根据具体情况,这也可能是一个优势)
先决条件
- 事件测试(可以通过 安装
sudo apt-get install evtest
)
程序
在终端中,运行sudo evtest
并选择您的键盘。如果按下某个键时没有输出,请按Ctrl+C并尝试其他设备。记住您选择的设备事件编号,我们稍后会需要它。按 capslock 键。将出现以下几行:
Event: time 1529406021.187148, -------------- SYN_REPORT ------------
Event: time 1529406021.218427, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70039
Event: time 1529406021.218427, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 0
MSC_SCAN
我们需要该行前一行的值KEY_CAPSLOCK
。在上面的例子中,该值是 70039,但键盘上的扫描码可能不同。
现在运行以下命令,但将 X 替换为您用于该evtest
命令的设备事件编号:
grep "" /sys/class/input/eventX/device/id/*
...这将输出键盘的、bustype
和product
。vendor
version
65-keyboard-custom.hwdb
创建一个名为的文件/etc/udev/hwdb.d/
(需要root权限),内容如下:
evdev:input:b[bustype]v[vendor]p[product]e[version]*
KEYBOARD_KEY_[scancode]=playpause
...在哪里
- [bus]、[vendor]、[product] 和 [version] 恰好有 4 个字符,并且字母需要大写
- [scancode] 必须是小写
- 该
evdev:...
生产线没有前导空格 - 该
KEYBOARD_KEY...
生产线恰好一个前导空格
例如:
evdev:input:b0003v046DpC228e0110*
KEYBOARD_KEY_70039=playpause
最后,将新的配置编译到硬件数据库中:
sudo systemd-hwdb update
如果要立即应用更改,请通知 udev:
sudo udevadm trigger
如果您想恢复更改,只需删除您创建的文件并重新启动。
您可以在我的网站找到更多详细信息原始答案关于这个话题。