Apple 键盘

来自 ArchWiki

一些使用 Apple 键盘驱动程序的键盘型号可能存在按键交换或缺少功能的情况。本文介绍如何更改键盘设置,使其行为符合预期。

数字锁定已开启

您可能会发现数字锁定已开启。症状是只有物理按键 789uiojkl 和周围的按键工作并输出数字。要解决此问题,请按 Fn+F6 两次或三次。您可能需要使用像 numlockx 这样的实用程序。

或者,使用 xmodmap 手动设置键码以避免使用数字锁定

keycode  90 = KP_0 KP_0 KP_0 KP_0 KP_0 KP_0
keycode  87 = KP_1 KP_1 KP_1 KP_1 KP_1 KP_1
keycode  88 = KP_2 KP_2 KP_2 KP_2 KP_2 KP_2
keycode  89 = KP_3 KP_3 KP_3 KP_3 KP_3 KP_3
keycode  83 = KP_4 KP_4 KP_4 KP_4 KP_4 KP_4
keycode  84 = KP_5 KP_5 KP_5 KP_5 KP_5 KP_5
keycode  85 = KP_6 KP_6 KP_6 KP_6 KP_6 KP_6
keycode  79 = KP_7 KP_7 KP_7 KP_7 KP_7 KP_7
keycode  80 = KP_8 KP_8 KP_8 KP_8 KP_8 KP_8
keycode  81 = KP_9 KP_9 KP_9 KP_9 KP_9 KP_9

无线键盘上的按键重复

取消配对键盘,然后重新配对。诀窍是在整个配对过程中按住电源按钮。

hid_apple 模块选项

  • fnmode - 顶行按键的模式
    • 0 - 禁用
    • 1 - 通常为媒体键,按住 Fn 键可切换为功能键(=Apple 键盘上的自动)
    • 2 - 通常为功能键,按住 Fn 键可切换为媒体键(=非 Apple 键盘上的自动)
    • 3 - 自动(默认)
  • iso_layout - 启用/禁用键盘的硬编码 ISO 布局。可能与国际键盘布局相关
    • 0 - 非 ISO(=ANSI 键盘上的自动)
    • 1 - ISO(=ISO 键盘上的自动)
    • -1 - 自动(默认)
  • swap_opt_cmd - 交换 Option (Alt) 和 Command (Flag) 键
    • 0 - 如丝印,Mac 布局(默认)
    • 1 - 已交换,PC 布局
  • swap_fn_leftctrl - 交换 FnL_Control
    • 0 - 如丝印,Mac 布局(默认)
    • 1 - 已交换,PC 布局

功能键不工作

如果您的 F<num> 键不工作,这可能是因为键盘的内核驱动程序默认使用媒体键,并且需要您使用 Fn 键才能访问 F<num> 键。要临时更改此行为,请追加 2/sys/module/hid_apple/parameters/fnmode

# echo 2 >> /sys/module/hid_apple/parameters/fnmode

要永久更改,请设置 hid_apple fnmode 选项为 2

/etc/modprobe.d/hid_apple.conf
options hid_apple fnmode=2

要将更改应用于您的初始 ramdisk,在您的 mkinitcpio 配置(通常为 /etc/mkinitcpio.conf)中,请确保您在 HOOKS 变量中包含 modconf,或在 FILES 变量中包含 /etc/modprobe.d/hid_apple.conf。然后您需要重新生成 initramfs

交换 Cmd 和 Alt/AltGr

这将交换左侧的 AltCmd 键以及右侧的 Alt/AltGrCmd 键。

临时和立即解决方案

# echo "1" > /sys/module/hid_apple/parameters/swap_opt_cmd

永久更改,在下次重启时生效

/etc/modprobe.d/hid_apple.conf
options hid_apple swap_opt_cmd=1

然后您需要重新生成 initramfs

交换功能键和左 Ctrl 键

这将交换 Fn 和左 Ctrl 键。

临时和立即解决方案

# echo "1" > /sys/module/hid_apple/parameters/swap_fn_leftctrl

永久更改,在下次重启时生效

/etc/modprobe.d/hid_apple.conf
options hid_apple swap_fn_leftctrl=1

然后您需要重新生成 initramfs

PrintScreen 和 SysRq

Apple 键盘有一个 F13 键而不是 PrintScreen/SysRq 键。这意味着 Alt+SysRq 序列 不起作用,并且与 PrintScreen 关联的应用程序操作(例如在 Wine 下运行的许多游戏中截取屏幕截图)也不起作用。要解决此问题,您可以将 setxkbmap -option "apple:alupckeys" 添加到您的 .xinitrc 中。这将把 PrintScreen/SysRq 映射到 F13,以及把 Scroll lock 映射到 F14,把 Pause 映射到 F15

或者,按照 将扫描码映射到键码 文章将 F13 扫描码映射到 PrintScreen/SysRq 键码,其中 458856 (0x070068) 是 F13 的扫描码,sysrqPrintScreen/SysRq 的键码。

像对待普通键盘一样对待 Apple 键盘

根据您想要完成的自定义,有两种解决方案可用,内核中还有一些选项。您需要选择其中一种。

使用补丁到 hid-apple

虽然原始的 hid-apple 模块没有进一步自定义键盘的选项,例如交换 Fn 和左 Ctrl 键或将 Alt 放在 Super 的左侧,但有一个 打过补丁的版本 将此功能添加到模块中。要使用它,请安装 hid-apple-patched-dkms-gitAUR 软件包。这将安装打过补丁的 hid-apple 并屏蔽原始版本。

该软件包使用 DKMS 在内核升级期间自动重新编译模块。虽然 dkms 将通过依赖项拉入。您仍然需要手动安装相应的内核头文件软件包。有关更多信息,请参阅 DKMS 页面。

除了打过补丁的内核模块外,软件包还在 /usr/lib/modprobe.d/hid_apple.conf 中提供了一个配置文件,默认启用类似 PC 的布局

  • 顶行按键通常是功能键,按住 Fn 键可切换为媒体键,如 #功能键不工作 中所述。
  • 左下角的四个按键依次充当 CtrlFnSuperAlt
  • 右下角的两个按键依次充当 AltCtrl
  • 如果您有 Ejectcd 键,它将充当 Delete 键。

如果您希望更改默认选项,请将配置文件复制到 /etc/modprobe.d 并进行所需的更改

# cp {/usr/lib,/etc}/modprobe.d/hid_apple.conf

/etc/modprobe.d 下的文件将完全覆盖 /usr/lib/modprobe.d 下的同名文件,并且内容不会合并。

或者,如果您想保留默认选项,请将其他选项放在名称不同的文件中。

注意: 在手动更改配置文件后,不要忘记更新initramfs

请参阅项目 README 以了解每个配置选项的确切含义,并调整配置文件以满足您的需求。在 内核模块#使用 modprobe.d 了解更多关于 modprobe.d 的信息。

安装后,重启以使更改生效,或 #无需重启即可更改行为

模块未采纳故障排除配置

首先,确保加载了打过补丁的版本,查看模块提供了哪些参数

$ ls /sys/module/hid_apple/parameters/

如果您没有看到像 swap_fn_leftctrlejectcd_as_delete 等新选项,请检查您的 DKMS 安装。

然后,检查配置文件是否正确包含在 initramfs 中

$ mkdir /tmp/initramfs
$ cd /tmp/initramfs
# lsinitcpio -x /boot/initramfs-linux.img

检查 usr/lib/modprobe.d/hid_apple.confetc/modprobe.d/ 中任何其他相关配置文件的存在和内容。如果它们不存在,您应该检查您的 /etc/mkinitcpio.conf 以包含这些文件。默认情况下,应该有一个 modconf 钩子自动包含这些文件,如果不是,请将其添加到 autodetect 之后的 HOOKS 数组 中。

或者,在 FILES 数组 中显式指定这些文件

FILES=(/usr/lib/modprobe.d/hid_apple.conf)

最后,重新生成 initramfs 并重启。

使用 un-apple-keyboard

如果您不需要所有这些自定义,并且不想手动或使用 dkms 编译新模块,则有一个 AUR 软件包 un-apple-keyboardAUR 不依赖于新的内核模块,而仅依赖于映射。它启用以下功能

  • 键盘被视为 ISO 键盘(例如,位于 Left Shift 键右侧的 <> 像预期一样工作)。
  • 功能键默认禁用。您需要按 Fn 键组合才能触发它们。默认情况下,行为是按键 F1F12
  • AltCmd 键已交换。
  • F13 映射到 SYSRQF14 映射到 Scroll LockF15 映射到 Pause

前 3 个上述功能是通过使用默认的 Linux 内核模块 hid-apple 为您带来的。

最后一个功能是通过提供到 keyfuzzAUR 的映射提供的。

无需重启即可更改行为

警告: 如果内置键盘和触摸板是唯一的输入设备,请注意,这样做可能会使您的计算机处于无法操作的状态,除非在第二个命令失败时进行硬重启。

要重新加载内核模块而不重启,请运行

# rmmod hid_apple && modprobe hid_apple

Magic Keyboard 无法连接

如果您的 Magic Keyboard 无法通过内置工具(例如 Gnome 3 设置中的蓝牙菜单)连接到系统,请安装 blueman 及其依赖项,并尝试使用它进行连接。如果仍然无法连接,请确保您已安装 bluetoothctl 和 hcitool。

启用 dvorak/dvp

默认情况下,xkb 为 Macintosh 键盘加载转换表(实际上称为 xkb_symbolsmacintosh_vndr/us

$ setxkbmap -print -verbose 10 | grep symbols

此转换表位于 /usr/share/X11/xkb/symbols/macintosh_vndr/us,不包含 dvorak/dvp 布局。您可以使用 /usr/share/X11/xkb/symbols/us 中的默认转换表,并在您的 .profile 中添加命令 setxkbmap 以强制加载布局

# mv /usr/share/X11/xkb/symbols/macintosh_vndr/us /usr/share/X11/xkb/symbols/macintosh_vndr/us.back
# cp /usr/share/X11/xkb/symbols/us /usr/share/X11/xkb/symbols/macintosh_vndr/us
$ echo "setxkbmap -v 10 -layout us -variant dvp" >> .xprofile

在根磁盘解密期间无输入

您可能必须手动将 hid_apple 模块添加到 mkinitcpio 配置

MODULES=(hid_apple)

或将键盘钩子放在 autodetect 之前,以便包含所有键盘驱动程序

HOOKS=(... keyboard autodetect ...)

在执行上述任一操作后重新生成 initramfs

参见