我可以重新映射Caps Lock键来播放音频吗?
我正试图在16.04 MATE上重复使用无用的Caps Lock键。 我遇到过
setxkbmap -option ctrl:nocaps
禁用它,但是它可以重新映射到播放/暂停VLC吗? 谢谢你的回答!
evtest和dbus
这是一个涉及在后台运行的小脚本的版本。 需要采取一些简单的步骤:
-
安装evtest程序:
sudo apt install evtest
。 该程序能够解码和打印来自设备的/dev/input/
hierarchy的原始事件。 -
将您的用户帐户添加到组
input
。 注销并再次登录。 (这是必需的,因为我们将从/dev/input/
下的某些设备读取,这通常只能由root或组input
用户完成。我们可以以root身份运行脚本,但之后我们必须找到一个告诉它需要与哪个用户dbus实例交谈的方法。) -
像你一样禁用大写锁定键或使用相应的Mate首选项。 如果您将大写锁定键映射到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
上面的脚本将监听您的键盘事件并在按下大写锁定键时执行命令。 运行的命令是使用dbus将播放/暂停事件发送到正在运行的VLC实例。 您可能需要调整KEYBOARD
变量以指向您的实际键盘,但上述值可能会起作用。
如果您希望在释放大写锁定键时调用toggleVLC()函数,则可以更改脚本中的EVENT
变量,使其以value 0
而不是value 1
。
此外,对于您来说,大写密钥的密钥代码可能与58不同。您可以通过运行evtest
来检查,按下大写锁定时查看输出,并相应地调整EVENT变量。 您甚至不必通过键码进行匹配,只需将EVENT设置为(KEY_CAPSLOCK), value 1
。
而不是使用evtest和上面的脚本你可以使用来自triggerhappy包的 thd --dump /dev/input/*
(类似于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
从现在开始,您应该能够使用大写锁定键在VLC中切换播放/暂停。 登录时应自动启动后台脚本。
triggerhappy
如前所述,您也可以使用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 --triggers ~/.config/thd/capslock.conf /dev/input/event*
-
以类似于为capshack描述的方式为您的用户运行。
-
确保你只有一个提到的方法(capshack或thd)运行,而不是双键切换每个键按下。
我在标准会话和16.04配合下在18.04测试了所有这些。 但它理论上也应该在Wayland或其他桌面环境下工作。
在Ubuntu 16.04中花了几个小时用谷歌搜索和摆弄dconf-editor
和xbindkeys
我找到了一个非常简单的解决方案:
- 2分钟即可快速完成设置
- 只需要安装xdotool
- 没有必要的脚本
- 仍然可以识别大写锁定,但不会切换字母大小写
- 使用标准的Ubuntu键盘自定义快捷方式设置
如果您需要Gnome XF86AudioPlay
支持,则需要xdotool
(OP规定的VLC不需要):
sudo apt install xdotool
现在这里是棘手的部分。 每次按Caps LocK键在播放和暂停之间切换音乐时,大写字母也会关闭和打开。
使用此方法可以在保持键激活的同时关闭Caps Lock切换:
setxkbmap -option caps:none
坚持Gnome的音乐播放器
然后在Ubuntu 16.04中进入设置>>键盘>>快捷方式>>自定义快捷方式 :
- 将名称设置为
Audio Play
- 将命令设置为
xdotool key XF86AudioPlay
- 然后单击“ 应用”按钮
添加新选项后,指定的快捷键将显示为已禁用 。 单击“ 禁用” ,当提示输入要分配的键时,按Caps LocK键。
像VLC这样的音乐播放器
按照上一节中Gnome的步骤操作,但对于命令,请使用此命令 :
qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
VLC无法识别媒体键: 如何使键盘媒体键全局使用VLC? 即使内置在键盘上。 因此,XF86AudioPlay的自定义键盘快捷方式对xdotool没用。
从命令行设置自定义键盘快捷键
本问答讨论如何从命令行设置自定义键盘快捷键 : 如何从终端设置自定义键盘快捷键?
永久停用大写锁定
下一步是使此setxkbmap -option caps:none
在重新启动时保持setxkbmap -option caps:none
。 谷歌搜索结果这个答案由Terdon: 保存setxkbdmap设置 :
一种简单的方法是将命令添加到$HOME/.profile
文件中(如果它不存在,您可以创建它):
setxkbmap -option caps:none
这应该使它在每次登录时运行。
请注意 ,您应该使用$HOME/.profile
而不是$HOME/.bash_profile
, $HOME/.bashrc
或其他类似文件。 这是因为您的登录管理员应该读取此设置。
这个答案已经在VM中的Ubuntu MATE 16.04.4 LTS上进行了测试(但键盘是直通USB键盘,所以这应该没有区别)。 它也不需要额外的软件,并且可以在不安装任何软件包的情况下在vanilla安装上完成, 并且它在引导之间是持久的。
重新映射大写锁定
-
以root身份编辑文件
/usr/share/X11/xkb/symbols/pc
。 注意不要在这里犯错(比如忘记逗号),因为如果你这样做,你可能无法使用键盘。 (猜猜我学到了什么困难?;) -
注释掉这条线
key
{ [ Caps_Lock ] }; 在它的开头放置两个正斜杠(
//
)。 -
在它下面添加以下行:
key
{ [ XF86AudioPlay, XF86AudioPause ] }; -
注释掉这条线
modifier_map Lock { Caps_Lock };
以与上述相同的方式。
-
重启。
注意:( 感谢danzel指出这一点) xkb-data
包的更新可以覆盖此文件。 防止这种情况的一种合理安全的方法是使用dpkg-divert
路径。 (我说“相当安全”,因为此文件的上游源在三年内未被修改。)
替代方法
在键盘布局设置中手动禁用Caps Lock键,然后使用此答案中的方法添加您自己的键重映射。
问题?
您的大写锁定键不再锁定大写,此时它已重新映射到“播放/暂停”。 您现在应该能够在VLC中播放和暂停音乐。 如果此时有效,您可以跳过其余的说明。
但是,当我尝试它时,VLC没有响应播放/暂停键。
确保正确设置了键盘快捷键
-
打开键盘快捷键(系统→首选项→硬件→键盘快捷键)
-
确保“播放(或播放/暂停)”设置为“XF86AudioPlay”
-
如果不是,请单击“快捷方式”部分,然后按新的“播放/暂停”键设置快捷方式。
-
如果它仍然不起作用,请重新启动几次以获得良好的测量结果。 (这实际上就是为我修好了。)
安装xbindkeys
, xcape和playerctl 。 确保xcape
(将CapsLock
映射到备用键,如Alt+F12
by xcape -e 'Caps_Lock=Alt_L|F12
)和playerctl
在登录时自动启动,并将两行添加到~/.xbindkeysrc
文件中
"playerctl play-pause" Alt + F12
使您的大写锁定键成为播放/暂停键
此解决方案会将您的大写锁定键的扫描码重新映射到内核输入驱动程序中的不同键码,在这种情况下播放/暂停。
好处
- 无需修改现有系统文件(只需创建一个新文件)
- 应用程序不会知道它实际上是一个大写锁定键,但认为按下了真正的播放/暂停键
- 无需禁用大写锁定,不可能搞乱
xkb
配置
缺点
- 必须单独为每个键盘完成(这取决于具体情况,也可以是一个优势)
先决条件
- evtest (可以通过
sudo apt-get install evtest
)
程序
在终端中,运行sudo evtest
并选择键盘。 如果按某个键时没有输出,请按Ctrl + C并尝试使用其他设备。 记住您选择的设备事件编号,之后我们将需要它。 按下大写锁定键。 将出现如下所示的某些行:
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
, product
, vendor
和version
。
使用以下内容在/etc/udev/hwdb.d/
(需要root权限)中创建名为65-keyboard-custom.hwdb
的文件:
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
如果要还原更改,只需删除您创建的文件并重新启动即可。
您可以在我关于此主题的原始答案中找到更多详细信息。
也许使用xbindkeys
或XTE
你可以做到这一点。 但首先要确定Keycodes是什么,你可以在终端中使用命令xev
查看大写密钥的代码并按下它(你可以看到任何keu或鼠标按钮的键代码,包括Gaming mouses)。 使用大写锁定和播放按钮的密钥代码,您可以编辑xbindkeys confi文件并将更改放在那里。 使用touch ~/.xbindkeysrc
创建配置文件(如果系统不自动创建)和nano ~/.xbindkeysrc
来编辑它。 我上个月用它,这是一个考试。 看看这些可能对您有帮助的链接。
https://help.ubuntu.com/community/MultimediaKeys
https://gist.github.com/jbonney/5743509
将游戏鼠标中的按钮重新映射到键盘键
https://matmunn.me/post/binding-volume-control-mouse-buttons-ubuntu/