在Mac OS X中将Caps Lock键用作Esc键

514

如何在Mac OS X中使Caps Lock键像Esc键一样工作?


43
这似乎是对于使用 vim 的程序员来说一个标准的任务;因此我赞成重新开放。 - Jeromy Anglim
4
一种替代方案是将大写锁定键映射为控制键(系统偏好设置 > 键盘 > 修改键),然后执行 Ctrl + [ 以代替按 esc 键。在 Vim 中非常有用。 - myconode
2
适用于macOS Sierra的本地解决方案:http://stackoverflow.com/a/41004544/1940276 - Kevin Roth
1
在这里,适用于macOS Sierra的本地解决方案是第二好的答案(来自@rkusa)。 - Marián Černý
关于 Ask Different 上的相关问题:如何将 Caps lock 键映射为 Escape 和 Control? - joeytwiddle
显示剩余2条评论
15个回答

416

编辑:此答案所述,较新版本的MacOS现在已原生支持将Caps Lock重新绑定到Escape。因此不再需要安装第三方软件来实现此功能。


以下是使用Seil(以前称为PCKeyboardHack)实现此功能的全面可视化步骤(带有链接)的尝试。

  1. 首先,进入系统偏好设置,选择键盘,然后点击键盘选项卡(第一个选项卡),并单击修饰键

步骤1

在弹出的对话框中将Caps Lock键设置为No Action

选择无操作

2) 现在,点击此处下载Seil并安装它:

3) 安装后,您将安装一个新的应用程序(Mountain Lion及更高版本),如果您使用较旧的操作系统,则可能需要检查新的系统偏好设置面板:

打开Seil或首选项面板

4) 选中标签“Change Caps Lock”,并将代码“53”输入作为Escape键的代码:

设置键盘代码

完成了! 如果没有立即生效,您可能需要重新启动计算机。

印象深刻吗?想要更多控制?

您可能还想查看KeyRemap4MacBook,这实际上是来自pqrs.org的旗舰键盘重新映射工具,而且它是免费的。

如果您喜欢这些工具,您可以捐赠。虽然我与他们没有关联,但我已经使用这些工具很长时间,并且必须说那里的人一直在出色地维护、添加功能和修复错误。

这里是一个截图展示(数百个)可预先选择的选项:

Picture 1.png

PQRS还有一个很棒的实用程序叫做NoEjectDelay,您可以与KeyRemap4MacBook一起使用,重新编程弹出键。稍加调整后,我将我的设置为切换AirPort Wifi。

这些实用程序在重新映射Mac键盘时提供了无限的灵活性。玩得开心!


3
我想澄清一点,我已经使用PCKeyboardHack独立地进行了近2年的操作,没有使用KeyRemap4Macbook,目的就是为了达到这个效果。 - rossipedia
14
请注意,如果您使用外部键盘,则应为每个键盘重复第一步(即大写锁定=无操作)。我未能对我的外部键盘执行此步骤,因此由于意外的大写锁定保护,大写锁定未对非常快速的按键响应。http://superuser.com/questions/317900/eliminate-macbook-capslock-delay - Jeromy Anglim
12
不错的教程。我将大写锁定键映射为Esc键已经有一年了,效率非常高。然而有一天,我与一位资深开发人员搭档工作。我告诉他我使用Vim作为我的主要编辑器。"我也是,"他说。他打开了他的电脑,我们开始工作。当轮到我编辑代码时,因为他的大写锁定键没有被映射,我手忙脚乱。我一直试图回到Esc键,却会偶尔按到大写锁定键,导致我的常规命令改变了。他教了我Ctrl-c也可以让你返回Visual模式。为自己着想,开始使用Ctrl-c吧。 - campeterson
9
每天学到更多。CTRL-[实际上是ESC的正确等价物。https://dev59.com/iW445IYBdhLWcg3wH2rH#5036294 - campeterson
6
如果您能编辑并在顶部提及这是macOS 10.12.1中的原生功能,那将非常好。这是@rkusa的答案。这样新用户就不必下载第三方软件了。 - edhurtig
显示剩余11条评论

366
自从macOS 10.12.1版本以来,原生支持将Caps Lock键重新映射为Esc键(路径为:苹果菜单 > 系统偏好设置... > 键盘 > 快捷键 > 修饰键(macOS 13及以后),或者在此之前是系统偏好设置 > 键盘 > 修饰键)。

enter image description here


11
太棒了!在听说新款MBP不会有退格键后,我找到了这个。看起来苹果公司预见到了一些不满的声音。 - Andy E
4
奇怪的是,我使用的是10.11.6版本,但我没有这个选项。我只能将esc键重新映射为大写锁定键、控制键、选项键或命令键。对于我的WASD键盘v2也是如此。 - Benny Powers
2
有没有通过命令行的方式来实现这个?也许可以使用类似这些方法:https://github.com/herrbischoff/awesome-osx-command-line#keyboard - Jordan Eldredge
2
这个程序的糟糕之处在于再也无法使用大写锁定键了。 - Andy
2
如果我启用了这个,之后有没有办法打开大写锁定? - user838494
显示剩余6条评论

73

我对这里的任何答案都不满意,于是寻找一个命令行解决方案。

在 macOS Sierra 10.12 中,苹果推出了一种新的用户键位映射方式。

  • 无需操作系统 GUI
  • 无需特殊权限
  • 完全可定制
  • 无需安装任何第三方软件,如 PCKeyboardHack / Seil / Karabiner / KeyRemap4MacBook / DoubleCommand / NoEjectDelay

如果这听起来不错,请查看 hidutil

例如,要将大写锁定键(caps-lock)映射到 Esc 键,请参考键位表,找到大写锁定键的使用代码为 0x39,Escape 的使用代码为 0x29。将这些代码与十六进制值 0x700000000 OR 运算后放入源码和目标中,如下所示:

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

您可以在同一命令中添加其他映射。个人而言,我喜欢将大写锁定键重新映射为退格键,并将退格键重新映射为删除键:

hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x70000002A}, {"HIDKeyboardModifierMappingSrc":0x70000002A,"HIDKeyboardModifierMappingDst":0x70000004C}]}'

查看当前映射:

hidutil property --get "UserKeyMapping"

系统重新启动后,您的更改将丢失。如果要使它们持久化,需要在启动代理中进行配置。以下是我的配置:

<?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">
<!-- Place in ~/Library/LaunchAgents/ -->
<!-- launchctl load com.ldaws.CapslockBackspace.plist -->
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>com.ldaws.CapslockEsc</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/bin/hidutil</string>
      <string>property</string>
      <string>--set</string>
      <string>{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x70000002A},{"HIDKeyboardModifierMappingSrc":0x70000002A,"HIDKeyboardModifierMappingDst":0x70000004C}]}</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

我将这段内容放入一个位于~/Library/LaunchAgents/com.ldaws.CapslockBackspace.plist的文件中,然后执行:

launchctl load com.ldaws.CapslockBackspace.plist

11
这是在 macOS 上重新映射键的现代正确方式。 - Fanckush
3
Karabiner的“重复按键”问题促使我寻求本地的按键重新映射解决方案。这篇文章和苹果论坛中的另一篇apple.stackexchange.com对我帮助很大。 - chb
谢谢你,+1!我在Apple post中添加了一些相关的注释,希望能为我们这些不想要Esc键但又不想要Caps Lock键的可怜人增加一些价值。 - tripleee
对于那些内置键盘出现问题的MacBook来说,这是一个很好的解决方法。我的键盘设置出了问题,所以我无法在那里重新映射任何键。 - Igor
1
这也是我迄今为止找到的将Escape键映射为切换大写锁定的唯一方法。绝对是最好的解决方案。 - Praxder
显示剩余3条评论

39

我唯一知道的就是将大写锁定键映射为控制键、选项键或命令键。可以通过系统偏好设置中的"键盘和鼠标"面板进行操作。点击左下角的"修饰键",您就可以将Caps Lock、控制键(Control)、选项键(Option)和命令键(Command)重新映射到这些按键上。

@ Craig: 这表明大写锁定键可以被用作普通的——也就是非切换的——按键。在我的MacBook上,由于我已将Caps Lock重新映射为Control,因此大写锁定键灯从未亮过。它只是像控制键一样工作。

enter image description here


2
请查看以下链接以获取漂亮的图片:https://dev59.com/e3VC5IYBdhLWcg3w2lGI - Kyle Cronin
1
很遗憾,Logitech键盘不支持这个功能,所以CapsLock上没有Esc键,没有vim我就要退换键盘了。 - Enric Ribas
@EnricRibas 你必须从对话框顶部的下拉菜单中选择要修改的特定键盘。 - amphetamachine

38

34

可能可以实现。

解决方案1

来自TrueAffection.net上的一篇文章

  • 下载PCKeyboardHack并安装它。
  • 进入系统偏好设置中的PCKeyboardHack。
  • 启用“更改大写锁定”并将键码设置为53。

解决方案2

这个解决方案不涉及修补键盘驱动程序,但提供了一个针对Vim的特定解决方案。

OS X支持将大写锁定键映射到许多键,但您必须手动进行编辑.plist文件。该过程在这篇文章中描述。作为提示的附录,我建议您首先在系统偏好设置中将Caps-Lock设置为None,然后只需更改.plist文件中的一个值即可。此外,您当然可以使用属性列表编辑器而不是经过XML转换步骤。

技巧是将大写锁定键映射到帮助键(代码6),这不在大多数键盘上。但是如果是,则会将其视为插入键,您可能根本不使用它,因为您要求重新映射大写锁定以防止手部伸展;)

然后,您可以将Help和Insert键映射到vim中的Esc

map  <Help> <Esc>
map! <Help> <Esc>
map  <Insert> <Esc>
map! <Insert> <Esc>

这对于 gvim(Vim.app)有效。我没能在终端中让vim工作,也没有测试过MacVim是否可行。

因此,这是一个相当复杂的、不太完善的解决方案,或者安装第三方hackery程序。你自己决定;)

编辑:刚刚注意到第3种解决方案,如果你使用MacVim,你可以使用CtrlOptionCommand作为Esc。使用系统偏好设置将Caps Lock键映射到其中之一非常简单。


1
解决方案3:如何在MacVim中使用Ctrl、Option或Command作为Esc键?我在首选项中找不到这个设置。 - clizzin
9
你所提及的线索在哪里? - Matthew Schinckel
2
Maletor - 这里没有任何地方告诉MacVim使用Control作为Escape。 - Scott Schulthess
1
@MatthewSchinckel 这是一个这样的链接:http://hints.macworld.com/article.php?story=20060825072451882 - Ben Challenor
帖子中的链接失效了。 - jasonleonhard
显示剩余2条评论

14

目前在macOS Sierra(10.12 beta)上还没有Seil。因此,我一直在使用以下设置的Keyboard Maestro:“输入图片说明”

感谢这个github评论:


2
我正在使用https://github.com/tekezo/Karabiner-Elements(适用于Sierra)。到目前为止工作得非常好,尽管我希望它可以将“Control_L转换为Control_L(+当您仅键入Control_L时,发送Escape)”。 - atomkirk
1
@atomkirk,您介意分享您使用的Karabiner JSON配置吗? - LandonSchropp
1
{ "profiles": [ { "name": "默认配置文件", "selected": true, "simple_modifications": { "caps_lock": "逃脱键" } } ] } - atomkirk
这里有很多例子:https://github.com/tekezo/Karabiner-Elements/blob/master/usage/README.md#typical-configuration-files - atomkirk
Karabiner对我来说很管用,可以使用atomkirk的JSON。尽管上面的截图,但是Keyboard Maestro UI是一团糟,我无法进行配置。 - Paul
对于想要在Sierra上将多个按键映射到单个按键的任何人,这是一种方法:http://superuser.com/questions/1142577/bind-caps-lock-key-to-tmux-prefix-on-macos-sierra/1142578#1142578 - Patrick Berkeley

10

我尝试了几种解决方案,有以下笔记:

DoubleCommand 不能 允许您交换 Esc 和 Caps Lock。

PCKeyboardHack 可以 映射 Caps Lock 到 Escape,但无法将 Escape 映射到 Caps Lock。最近的版本将允许您通过编辑两个键进行完全交换。

这可能或可能不足以满足您的需求(我知道它对我来说是足够的)。


1
PCKeyboardHack无法让您将Escape键映射到Capslock,但配套应用程序KeyRemap4MacBook可以。它允许您将“Escape键映射到CapsLock”和“Shift+Escape键映射到CapsLock”。 - Rory O'Kane

10

如果您不想安装第三方应用程序,而且只关心在iTerm内部使用vim,那么可以按照以下步骤操作:

此文所述,将CapsLock键重新映射为Help键。

简要版:使用plutil或类似工具编辑~/Library/Preferences/ByHost/.GlobalPreferences*.plist,它应该类似于以下内容:

<key>HIDKeyboardModifierMappingDst</key>
<integer>6</integer>
<key>HIDKeyboardModifierMappingSrc</key>
<integer>0</integer>

重新启动!简单的注销和登录对我没有起作用。

在iTerm中,为帮助添加一个新的键映射:发送十六进制代码0x1b,它对应于Escape键。

我知道这不完全是所要求的,但我认为寻找类似解决方案的许多人实际上是需要这种更专业的变体。


5

随着最新的Ventura更新,系统设置发生了变化。

您可以在以下位置找到它:

系统设置 > 键盘 > 快捷键 > 修饰键

Mac OS Ventura Modifier Keys Menu


这个不区分左右按钮 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接