如何在macOS Sierra中重新映射密钥,例如,将Right Alt更改为Right Control?


44

我曾经使用Karabiner将Right Alt重新映射到Right Control(作为Emacs用户,我使用Control比Alt多得多),但是更新到Sierra打破了这一点。降级不是一种选择。

如何在Sierra中手动重新映射键?我特别想将Right Alt重新映射到Right Control。

Answers:


39

苹果公司的技术说明TN2450描述了如何重新映射键。运行以下命令会将Right Alt重新映射为Right Control。

hidutil property --set '{"UserKeyMapping":
    [{"HIDKeyboardModifierMappingSrc":0x7000000e6,
      "HIDKeyboardModifierMappingDst":0x7000000e4}]
}'

请注意,以上命令并未切换“右Alt”和“右控件”。他们都将是正确的控制。如果您有MacBook,则在插入外部键盘之前,您不会注意到这一点。如果要切换 Right Alt和Right Control,则需要添加第二个switch命令,如下所示。

hidutil property --set '{"UserKeyMapping":
    [{"HIDKeyboardModifierMappingSrc":0x7000000e4,
      "HIDKeyboardModifierMappingDst":0x7000000e6},
     {"HIDKeyboardModifierMappingSrc":0x7000000e6,
      "HIDKeyboardModifierMappingDst":0x7000000e4}]
}'

技术说明底部的表格列出了每个键的十六进制值。要概括以上答案以切换任何键,您必须or将该列表中的hex值与一起使用0x700000000。以下Python代码演示了执行此操作的一种方法。

In [1]: def convert(val):
   ...:     int_val = int(val, 16)
   ...:     int_ref = 0x700000000
   ...:
   ...:     return hex(int_ref | int_val)
   ...:

In [2]: r_alt = '0xE6'

In [3]: print(convert(r_alt))
0x7000000e6

很好-谢谢!有什么方法可以使用此命令将映射还原为其默认设置吗?
Aᴄʜᴇʀᴏɴғᴀɪʟ

1
@Cᴀʟʟᴏᴅᴀᴄɪᴛʏ以重置任何键,只需在Src和中都使用该键的值再次运行命令Dst
史蒂文·豪威尔

这将在重新启动后恢复。我可以在每次启动时重新运行此命令,但我不想这样做。有没有办法使这个永久化?
firebush

2
@firebush这篇文章建议使用登录钩使这样的命令持久化:stackoverflow.com/a/46460200/629530
firebush

1
@ StevenC.Howell函数修饰符的组合如何?例如,\ 键盘上的反斜杠就是Shift+Option+7我想用更简单的东西(例如Option+.我几乎不使用)代替的。我怎么做?谢谢你的帮助。
Nanashi No Gombe

15

一种更通用和用户友好的方法是使用Karabiner-Elements,它是可在Sierra上运行的Karabiner的版本。


2
Karabiner-Elements的快速更新。它可以在macOS High Sierra 10.13.3(17D102)上运行,我已成功交换了正确的Command和Option键。
史蒂夫·克莱门特

第三方应用程序永远不会“更通用”。为什么有人会使用应用程序来完成系统中内置的功能,从而使系统混乱?
巴绍

1
@Bachsau更普遍,它允许您执行许多其他操作,例如,设置按键组合,宏和配置文件,或对任何内部和外部键盘使用共享和/或拆分映射配置。
Janosch

@Bachsau我为每个键盘保留了不同的配置文件,因此它们的功能相同。非常好的应用程序
AlexG

9

这是史蒂文·C·豪威尔答案的附录。

我有一台带斯堪的纳维亚键盘的新MacBook Pro。此新模型​​不再具有Esc键,这对我来说是一个很大的障碍。

我发现以下代码将转换§键(左上,左键,Tab键上方)-我认为我以前从未用过-来产生Esc。

hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000029}]}'

在苹果的文档中(链接到史蒂文的答案),该标签被标记为“ Keyboard Non-US \ and |”。(0x64)。

很难找到几个“非美国”键,因为它们通常是指您所使用的键盘上带有不同标签的键。(我还发现“重音符和代字号”是指左移键和z之间的键,在键盘上会产生<该键。我无法确定哪个键对应于“非美国#~”,并且一旦找到就不再做进一步的实验我的密钥。)如果要尝试,请尝试在终端中运行脚本,直到找到所需的密钥:

for ((i=1;i<=128;++i)); do
    printf '0x7000000%0x\n' "$i"
    printf '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x7000000%0x,"HIDKeyboardModifierMappingDst":0x70000000a}]}' "$i" |
    xargs -0 hidutil property --set >/dev/null
    read -p "Type some stuff: "
    hidutil property --set '{"UserKeyMapping":[{}]}' >/dev/null
done

这会遍历密钥代码并一次更改一个,希望您可以通过反复试验找到对您没有特别用处的密钥。尝试键入要求您输入的内容-如果得到的g不是您期望的,则您找到了正确的密钥代码。(0x70000000a如果g对您来说不方便,请更改为其他选项。也许您想重新映射g键?)键入完毕后,只需按Enter即可进入下一个键。

值得一提的是,循环内的最后一个命令是更改所有UserKeyMapping设置的方式:

hidutil property --set '{"UserKeyMapping":[{}]}'

最初运行hidutil property --get UserKeyMapping时会产生

(null)

但似乎您无法反馈此值以更改设置(或者,它接受但忽略此输入)。

(如果您不熟悉终端机,只需在提示或类似提示for之前复制/粘贴内容即可。)donebash$

根据这个与堆栈溢出有关的问题,您可以将命令放在主目录中的脚本文件中,并将其添加到您的launchd配置中,以使更改永久生效。

万一有些读者不满意自己这样做,这里有个快速脚本可以帮助您。同样,只需在终端提示下复制/粘贴此内容即可。

mkdir -p "$HOME"/bin
printf '%s\n' '#!/bin/sh' \
    'hidutil property --set '"'"'{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000029}]}'"'" \
    >"$HOME"/bin/userkeymapping
chmod 755 "$HOME"/bin/userkeymapping
cat<<: >"$HOME"/Library/LaunchAgents/userkeymapping.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>userkeymapping</string>
    <key>ProgramArguments</key>
    <array>
        <string>$HOME/bin/userkeymapping</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
:
launchctl load "$HOME"/Library/LaunchAgents/userkeymapping.plist

显然,如果您最终获得了一些其他密钥,而0x700000064您又不需要在脚本或文件中进行更改,"$HOME"/bin/userkeymapping那么如果您已经运行了上述密钥,那么最终将创建该密钥。


此答案的早期版本主张使用,LoginHook但不适用于我,根据stackoverflow.com/a/22872222/874188,我改用一种launchd方法。
3:58

作为一个热情的vi / vim爱好者,这正是我一直在寻找的东西。谢谢。
菲利普·基恩斯

7

如果您只想重新映射一个键

示例:如何在Mac上重新映射Escape键

  1. 转到苹果菜单,然后选择“系统偏好设置”,然后转到“键盘”偏好设置面板,然后选择“键盘”选项卡

  2. 点击右下角的“修改键”按钮

  3. 选择要重新映射和修改以执行退出功能的键:Caps Lock(我们的建议),Control,Option或Command
  4. 从下拉列表中选择与要重映射为硬件退出键的键相对应的“退出”,然后单击“确定”以设置更改

参考


2
这仅使您可以控制此答案中列举的四个键。
3:06

正确,非常有帮助。如果有人想重新映射附加键考虑铁锁
jasonleonhard

似乎也无法指定特定键,例如“ right⌥”。您可以得到的最具体的信号是信号,如“ any⌥”中所示。
Merchako

正确,但是好处是您不必安装任何可以正常使用的东西。
jasonleonhard

0

如果您想恢复默认值:

# setting it to 'null' does not work on my MBP High Sierra
hidutil property --set '{"UserKeyMapping":[]}'
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.