我安装了全新的 vanilla 18.04 LTS,使用 gnome-shell 3.28.4。我使用的是有线 Apple 铝制键盘:
我想将顶行 F 键用作各种终端用户应用程序(Firefox、CLion 等)的键盘快捷键,但每当我按下其中任何一个键时,gnome/X11 堆栈中的某些东西(我猜)都会拦截它们并将它们解释为“媒体”键。据我所知,此类 F 行按键不会传递给任何应用程序。
例如,如果我按 F5,我希望 Firefox 重新加载当前网页,或者让 CLion 触发构建,但相反,唯一发生的事情是屏幕上覆盖了以下巨大图标:
我尝试了gnome-tweaks
设置应用程序,但无济于事。我也查看了dconf-editor
,但我不熟悉它,也没有更改其中的任何内容,因为我不知道自己在做什么。
我搜索了很多,但得到的结果似乎都是来自媒体无法正常工作的人(他们希望媒体能够正常工作)。说清楚一点,我想禁用完全媒体键。
有人知道怎么做吗?谢谢!
更新 1:输出cat /usr/share/X11/xkb/symbols/pc
:
daniel@legolas:~$ cat /usr/share/X11/xkb/symbols/pc
default partial alphanumeric_keys modifier_keys
xkb_symbols "pc105" {
key <ESC> { [ Escape ] };
// The extra key on many European keyboards:
key <LSGT> { [ less, greater, bar, brokenbar ] };
// The following keys are common to all layouts.
key <BKSL> { [ backslash, bar ] };
key <SPCE> { [ space ] };
include "srvr_ctrl(fkey2vt)"
include "pc(editing)"
include "keypad(x11)"
key <BKSP> { [ BackSpace, BackSpace ] };
key <TAB> { [ Tab, ISO_Left_Tab ] };
key <RTRN> { [ Return ] };
key <CAPS> { [ Caps_Lock ] };
key <NMLK> { [ Num_Lock ] };
key <LFSH> { [ Shift_L ] };
key <LCTL> { [ Control_L ] };
key <LWIN> { [ Super_L ] };
key <RTSH> { [ Shift_R ] };
key <RCTL> { [ Control_R ] };
key <RWIN> { [ Super_R ] };
key <MENU> { [ Menu ] };
// Beginning of modifier mappings.
modifier_map Shift { Shift_L, Shift_R };
modifier_map Lock { Caps_Lock };
modifier_map Control{ Control_L, Control_R };
modifier_map Mod2 { Num_Lock };
modifier_map Mod4 { Super_L, Super_R };
// Fake keys for virtual<->real modifiers mapping:
key <LVL3> { [ ISO_Level3_Shift ] };
key <MDSW> { [ Mode_switch ] };
modifier_map Mod5 { <LVL3>, <MDSW> };
key <ALT> { [ NoSymbol, Alt_L ] };
include "altwin(meta_alt)"
key <META> { [ NoSymbol, Meta_L ] };
modifier_map Mod1 { <META> };
key <SUPR> { [ NoSymbol, Super_L ] };
modifier_map Mod4 { <SUPR> };
key <HYPR> { [ NoSymbol, Hyper_L ] };
modifier_map Mod4 { <HYPR> };
// End of modifier mappings.
key <OUTP> { [ XF86Display ] };
key <KITG> { [ XF86KbdLightOnOff ] };
key <KIDN> { [ XF86KbdBrightnessDown ] };
key <KIUP> { [ XF86KbdBrightnessUp ] };
};
hidden partial alphanumeric_keys
xkb_symbols "editing" {
key <PRSC> {
type= "PC_ALT_LEVEL2",
symbols[Group1]= [ Print, Sys_Req ]
};
key <SCLK> { [ Scroll_Lock ] };
key <PAUS> {
type= "PC_CONTROL_LEVEL2",
symbols[Group1]= [ Pause, Break ]
};
key <INS> { [ Insert ] };
key <HOME> { [ Home ] };
key <PGUP> { [ Prior ] };
key <DELE> { [ Delete ] };
key <END> { [ End ] };
key <PGDN> { [ Next ] };
key <UP> { [ Up ] };
key <LEFT> { [ Left ] };
key <DOWN> { [ Down ] };
key <RGHT> { [ Right ] };
};
答案1
键盘多媒体按键有区别吗?
是的,这些键有点不同。当按下其他键时,它们可能会报告单个键代码或多个键代码,例如Fn。此外,使用实用程序(例如)通常很难识别它们的键代码xev
。这取决于键盘制造商的配置。
多媒体键通常具有以下配置的键代码:XF86键名称。这些名称各不相同,但以XF86
类似XF86MonBrightnessUp
和XF86MonBrightnessDown
等开头。
如何禁用/重新配置键盘多媒体键?
XKB
方法
最简单的方法是像这样编辑 XKB 配置文件:
/usr/share/X11/xkb/symbols/pc
通过在终端中运行以下命令来编辑 XKB文件:sudo nano /usr/share/X11/xkb/symbols/pc
XF86
查找包含以下内容的行:key <KEY_CODE> { [ XF86MonBrightnessDown ] };
//
通过在它们前面添加以下内容来注释它们://key <KEY_CODE> { [ XF86MonBrightnessDown ] };
Ctrl按+X然后按 保存文件并退出编辑器Y。
通过在终端中运行以下命令清除 XKB 缓存:
sudo rm -rf /var/lib/xkb/*
重新启动系统以激活新的 XKB 配置,或者您可以避免重新启动并尝试通过在终端中使用以下命令设置 XKB 地图布局来重新加载新的 XKB 配置:
setxkbmap -layout us
测试你的钥匙。
如果制造商将键盘多媒体键配置为报告单个键代码,则上述解决方案可能会禁用它们并使这些键可以自由用于其他目的。
然而,如果情况并非如此,那么您将需要处理xmodmap
。
xmodmap
方法
方法xmodmap
略有不同,您不能使用此方法禁用多媒体键并将它们分配为空,xmodmap -e 'keycode Number ='
因为这通常会使它们无法使用,因此您需要将它们重新分配给所需的功能。您还需要实施某种机制来在重新启动和注销/登录之间保留您的更改。
要实现此方法,请按照以下步骤操作:
通过在终端中运行以下命令来显示当前键盘映射:
xmodmap -pke
检查输出并识别包含符号
XF68
后的行=
,如下所示:
keycode 232 = XF86MonBrightnessDown NoSymbol XF86MonBrightnessDown NoSymbol XF86MonBrightnessDown
例如,上面一行显示带有代码号的密钥232当前配置为触发XF86MonBrightnessDown
,这将降低显示器的亮度,您可以通过为其分配不同的值来更改此行为,如下所示xmodmap -e 'keycode 232 = New_Value'
。例如,分配F11此多媒体键的功能,请在终端中运行以下命令:
xmodmap -e 'keycode 232 = F11'
新功能将立即生效。但是,此功能更改将在重启或注销/登录后失效。
注意:acpi_listen
在终端中运行命令并在按下实际物理按键时监控输出,然后将其与所获得的输出进行比较,可能会有所帮助,xmodmap -pke
这样您就可以确认按键代码是否适合您。您也可以尝试该xev
实用程序,但不幸的是,在处理多媒体或特定于供应商的按键时,它并不总是会返回按键代码。
为了在重新启动和注销/登录后保存更改,您需要执行以下操作:
通过在终端中运行以下命令,在主目录中创建并编辑脚本文件:
nano ~/.Modify_Multimedia_Keys.sh
#!/bin/bash
在第一行添加此命令,然后xmodmap -e 'keycode Number = New_Value'
在第一行下方添加命令(每个命令占一行),如下所示:
#!/bin/bash
xmodmap -e 'keycode 232 = F11'
xmodmap -e 'keycode 122 = F2'
保存脚本文件并按Ctrl+X然后按退出编辑器Y。
通过在终端中运行以下命令使脚本文件可执行:
chmod +x ~/.Modify_Multimedia_Keys.sh
通过 GUI 将脚本文件添加到启动应用程序,或者将包含以下内容的
Modify_Multimedia_Keys.desktop
文件放置在目录中并替换为您的实际用户名,从而使脚本文件在每次启动时执行:~/.config/autostart/
YOUR_USERNAME
[Desktop Entry]
Type=Application
Exec=/home/YOUR_USERNAME/.Modify_Multimedia_Keys.sh
Hidden=false
X-GNOME-Autostart-enabled=true
Name=Modify Multimedia Keys
Comment=This modifies keyboard multimedia keys
答案2
为了方便以后参考,下面是 shell 脚本,其中包含xmodmap
将键码映射到此情况下的键所需的命令:
#!/bin/bash
# fix the common F keys
xmodmap -e 'keycode 128 = F3'
xmodmap -e 'keycode 212 = F4'
xmodmap -e 'keycode 237 = F5'
xmodmap -e 'keycode 238 = F6'
xmodmap -e 'keycode 173 = F7'
xmodmap -e 'keycode 172 = F8'
xmodmap -e 'keycode 171 = F9'
xmodmap -e 'keycode 121 = F10'
xmodmap -e 'keycode 122 = F11'
xmodmap -e 'keycode 123 = F12'
# fix the '=' on the numeric keypad
xmodmap -e 'keycode 125 = equal'
xev
我使用如下方法确定了密钥代码这个答案。请注意,Apple 铝制键盘有 F 键一直到 F19 (!),上面的脚本未涵盖这些键,因为我实际上并不使用它们。应该可以使用它来xev
确定这些键的键码是什么,并将它们添加到脚本中(如果需要)。