我可以重新映射Caps Lock键以播放音频吗?


16

我试图在16.04 MATE上重新使用无用的Caps锁定键。我碰到过

setxkbmap -option ctrl:nocaps

禁用它,但是是否可以将其重新映射为播放/暂停VLC?感谢您的回答!


我不认为这行得通...。出于多种原因……例如,我认为linux将capslock视为修饰符,而不是单独的键。这可能是您无法在VLC中绑定它的原因。另外,如果您停用它,则它也被停用。但是您可以在命令行上随意操作并尝试将其与绑定vlc --key-play-pause <key-string>,但是我还没有找到VLC接受的大写锁定字符串...
Robert Riedl

1
我安装dconf-editor了几件东西,安装xdotool了几件东西,最后xbindkeys又尝试了几件东西。这项无用的练习结束时,我的键盘“暂停/播放”按钮坏了,而我自己的屏幕“播放/暂停”按钮变成了灰色,无法播放音乐。我在16.04中进行了此操作,因此在18.04中重新启动以确认一切仍然正常,这是由软件黑客造成的。唯一可以节省的地方是我只能通过Android手机而非PC播放音乐。只是要提请他人注意,并比我更好地记录您对计算机所做的工作。
WinEunuuchs2Unix

1
@pbhj感谢您的提示。我以某种方式设法在Ubuntu 16.04中使用屏幕按钮和键盘暂停/播放按钮再次使播放/暂停工作。我只是想警告人们尝试这些低级键盘实用程序可能会遇到的陷阱。
WinEunuuchs2Unix

1
2BFrank:如果解决了您的问题,请务必接受其中一个答案。由于此问题有悬赏,因此不接受答案(而不是手动授予悬赏)只会将一半悬赏奖励给@Sebastian Stark,因为他的回答是最高的投票。
诺妮·穆斯

1
@NonnyMoose感谢您的评论。我本来打算将其自动授予所接受的答案或最高投票总数,但是我不知道它会将奖励减半,所以如果有以下情况,我将在大约两个小时内手动将其授予最高投票总数没有答案被接受。
Chai T. Rex

Answers:


11

evtest和dbus

这是一个涉及在后台运行的小脚本的版本。需要采取一些简单的步骤:

  • 安装evtest程序: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()函数释放的大写锁键,就可以改变EVENT在脚本变量,使得它与结尾value 0,而不是value 1

另外,您可能会发现capslock键的键码不同于58。您可以通过运行进行检查evtest,按Capslock时查看输出,然后相应地调整EVENT变量。您甚至不必匹配键码,只需将EVENT设置为即可(KEY_CAPSLOCK), value 1

除了使用evtest和上面的脚本,您还可以使用triggerhappy程序包中的 thd (thd --dump /dev/input/*类似的输出),但是我发现这没什么意义。

现在,我们创建一个用户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 --triggers ~/.config/thd/capslock.conf /dev/input/event*

  • 以类似于capshack所述的方式为您的用户运行。

  • 确保仅运行上述方法之一(capshack或thd),而不要两次切换每个按键所按下的位置。

我在标准会话和16.04配对下在18.04上测试了所有这些。但从理论上讲,它也应该在Wayland或其他桌面环境下工作。


@ WinEunuuchs2Unix感谢您的提及。我个人更喜欢完整的if / then / else子句的更详细的样式:更明确,更易于扩展,并且不会使行变得太长。尽管在这种情况下,实际上的确无关紧要。
塞巴斯蒂安·史塔克

我同意排队时间过长。最近,我将编码样式调整为两行,第一行[[ test ]] && \ 和第二行缩进四个空格以<command>进行阳性测试。我完全同意可读性,因为我的建议与大多数编程语言无关。
WinEunuuchs2Unix

这很棒 !尽管我认为这似乎triggerhappy应该走的路,因为evtest它实际上是一个调试程序:)
Robert Riedl

是的,学习是evtest,是做的:)
塞巴斯蒂安·史塔克

...对我而言,键码58是m,因此该脚本不起作用。我建议xmodmap -pke | grep Caps_Lock在使用此脚本之前进行检查,以确保键码正确。
诺妮·穆斯

9

在花费了数小时的搜索和摆弄之后,在Ubuntu 16.04中dconf-editorxbindkeys我找到了一个非常简单的解决方案:

  • 2分钟内即可完成快速设置
  • 只需要安装xdotool
  • 无需脚本
  • 大写锁定仍然可以识别,但不能切换字母大小写
  • 与标准的Ubuntu键盘自定义快捷方式设置一起使用

如果需要Gnome XF86AudioPlay支持,则需要xdotool(OP规定VLC不需要):

sudo apt install xdotool

现在是棘手的部分。每次您按键Caps LocK在播放和暂停之间切换音乐时,大写字母也会同时打开和关闭。

使用此方法可以关闭Caps Lock切换,同时仍保持激活状态:

setxkbmap -option caps:none

坚持Gnome的音乐播放器

然后在Ubuntu 16.04中进入设置>>键盘>>快捷方式>>自定义快捷方式

音频暂停播放shortcut.png

  • 名称设置为Audio Play
  • 命令设置为xdotool key XF86AudioPlay
  • 然后点击Apply按钮

添加新选项后,分配的快捷键将显示为Disabled。单击“ 禁用”,当提示您输入要分配的按键时,请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在重新启动后保持此状态。谷歌搜索结果由Terdon回答:保存setxkbdmap设置

一种简单的方法是将命令添加到$HOME/.profile文件中(如果不存在,则可以创建该命令):

setxkbmap -option caps:none

这应该使它在您每次登录时都能运行。

请注意,你应该使用$HOME/.profile,而不是$HOME/.bash_profile$HOME/.bashrc或一些其他类似的文件。这是因为您的登录管理器应读取此设置。


简单,优雅,能胜任:对我的完美答案!
Fabby

@Fabby好吧,我必须承认它很容易设置和测试,不需要低级处理或不断运行的脚本。在尝试使用此方法之前,我经历了四次不同的尝试。还是不能称其为完美,但要感谢!。如果他们让我再次回到欧洲,我会给你买一品脱。
WinEunuuchs2Unix

它与Wayland兼容吗?
danzel

@dabzel恐怕Wayland无法使用它setxkbmap -option caps:none。该实用程序已安装,但是Wayland一直在大写和小写之间切换。您可以针对如何使Wayland受到尊重提出另一个问题setxkbmap
WinEunuuchs2Unix

3

该答案已经在VM上的Ubuntu MATE 16.04.4 LTS上进行了测试(但键盘是直通上的USB键盘,因此不会有所不同)。它还不需要额外的软件,并且可以在不安装任何软件包的情况下进行原始安装,并且在启动之间保持不变。

重新映射大写锁定

  1. /usr/share/X11/xkb/symbols/pc以根用户身份编辑文件。请注意不要在此处犯错误(例如忘记逗号),因为如果这样做,您可能将无法使用键盘。(猜猜我从中学到了什么?)

  2. 注释掉行

        key <CAPS> {    [ Caps_Lock     ]   };
    

    通过//在其开头放置两个正斜杠()。

  3. 在其下面添加以下行:

        key <CAPS> {    [ XF86AudioPlay, XF86AudioPause ]   };
    
  4. 注释掉行

        modifier_map Lock   { Caps_Lock };
    

    以与上述相同的方式。

  5. 重启。

注意:(要指出此信息,请向danzel致谢)对该软件包的更新xkb-data可能会覆盖此文件。防止这种情况的合理安全方法是使用改变路径dpkg-divert。(我说“相当安全”,因为此文件的上游源三年没有被修改。)

替代方法

在键盘布局设置中手动禁用Caps Lock键,然后使用此答案中的方法添加您自己的键重新映射。

问题?

您的大写锁定键不再锁定大写,并且此刻它已重新映射为播放/暂停。您现在应该可以在VLC中播放和暂停音乐。如果这时起作用,则可以跳过其余说明。

但是,当我尝试它时,VLC没有响应播放/暂停键。

确保正确设置了键盘快捷键

  1. 打开键盘快捷键(系统→首选项→硬件→键盘快捷键)

  2. 确保将“播放(或播放/暂停)”设置为“ XF86AudioPlay”

  3. 如果不是,请单击“快捷方式”部分,然后按新的“播放/暂停”键来设置快捷方式。 有用的屏幕截图

  4. 如果仍然无法正常工作,请重新启动几次,以防万一。(这实际上是为我解决的问题。)


这可能会干扰xkb选项,尤其是选项caps:...。另外,它可能会被系统更新覆盖。
danzel

确实可以。不过,有关系统更新的要点。我将在答案中添加一条注释。感谢您的反馈!
诺妮·穆斯

亲爱的所有人,哇!对不起,有一段时间了:-),现在发现您在解决方案中付出的所有努力!将尝试@ WinEunuuchs2Unix的答案,并让您发布。谢谢,拉普!
2BFrank

@ 2BFrank出于好奇,您是否找到了行之有效的答案?
诺妮·穆斯

1

安装xbindkeysxcapeplayerctl。确保xcape(映射CapsLock到备用密钥,例如Alt+F12by xcape -e 'Caps_Lock=Alt_L|F12)并且playerctl在登录时自动启动,并将~/.xbindkeysrc两行添加到文件中

"playerctl play-pause"
  Alt + F12

0

使您的大写锁定键成为播放/暂停键

此解决方案会将您的Capslock键的扫描码重新映射到内核输入驱动程序中的其他键码,在这种情况下为play / pause。

优点

  • 无需修改现有系统文件(只需创建一个新文件)
  • 应用程序不会知道它实际上是一个Capslock键,但认为已经按下了真正的播放/暂停键
  • 无需禁用大写锁定,没有可能搞乱xkb配置

缺点

  • 必须为每个键盘单独完成(根据情况,这也可能是一个优势)

先决条件

  • evtest(可以通过安装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_SCANKEY_CAPSLOCK一行的值。在上面的示例中,这将是70039,但是键盘上的scancode可能有所不同。

现在运行以下命令,但将X替换为用于该evtest命令的设备事件号:

grep "" /sys/class/input/eventX/device/id/*

......这将输出bustypeproductvendorversion键盘。

创建一个名为文件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

如果要还原更改,只需删除创建的文件并重新启动。

您可以在我对此主题的原始答案中找到更多详细信息。


@Nonny Moose就是为什么我写了“必须为每个键盘单独完成”。另外,您可以根据需要指定任意数量的键盘,因此您实际上只需要为购买的每个新键盘执行此操作。另一方面,您可以根据需要省略键盘,例如,因为它已经具有物理播放/暂停键。
danzel

嗯,我没注意。我站得住了。
诺妮·穆斯

0

也许使用xbindkeys或者XTE您可以那样做。但是首先要确定键码是什么,您可以xev在终端中使用命令查看并按下Capslock键的代码(可以看到任何keu或鼠标按钮(包括游戏鼠标)的键码)。借助capslock和play按钮的键控代码,您可以编辑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/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.