I generally run Linux. I use Vim a lot, so the Escape key is extremely important. I also use other keyboard shortcuts a lot, so Control is "key" as well. On Linux, I've solved this by using xcape to map the Caps lock key to Escape if pressed by itself, or Control if pressed in combination with another key. This puts the best of both worlds within quick reach of my pinky finger. Is there any way I can do this on a Mac?
4 Answers
Yes, using Karabiner (formerly KeyRemap4Macbook).
First, go into the Keyboard preference pane, click "Modifier Keys…", and change Caps Lock to Control. Then, go into Karabiner and search for this option:
Control_L to Control_L
(+ when you type Control_L only, send Escape)
Check that, and you're done. With Karabiner you can do lots more interesting things, like mapping your (now kind of useless) Escape key to a Hyper key with even more keybindings.
-
is it possible remap esc to caps lock and map caps lock to control and escape? Because sometime, I still feel the need to use caps lock to type a long upper case string. Commented Jul 21, 2015 at 23:36
-
Karibiner now tells you to change Caps Lock to "No Action" in the OSX Keyboard preferences (instead of setting it there to Control) and to use Seil, Karabiner's sister program to do the remapping. The last part of the above answer (+ when you type Control_L only...) is still done in Karabiner.– ScoBeCommented Oct 1, 2015 at 15:16
-
-
@ScoBe I'd recommend against doing that, you really don't need Seil,– VenCommented Oct 28, 2015 at 8:38
-
I recommend reducing Karabiner's Key Overlaid Modifier > Timeout parameter from 1000ms to 200ms. If I hold the key but then change my mind and release it, I don't want to fire an Escape. Commented Sep 4, 2017 at 15:47
Karabiner is currently incompatible with MacOS Sierra. Another, Sierra-friendly solution, is with Keyboard Maestro (it is not free). Change the behavior of the Caps-Lock key to Control through System Preferences
-> Keyboard
-> Modifier Keys
as others have suggested.
Then within Keyboard Maestro, setup a macro as follows:
- Triggered by
USB Device Key Trigger
- Press the Caps-Lock key on your keyboard
- is tapped once
- with these modifiers:
^
- (you will need to repeat the previous trigger for each USB keyboard you use)
- Then add an action
Text
->Type a keystroke
- Press Esc
-
1Just to be clear, there is a project called Karabiner Elements that does run on Sierra (which is a precursor to a version of Karabiner that will run on Sierra). I haven't tried it, so I don't know if this functionality is available or not.– tubedoggCommented Oct 5, 2016 at 20:51
-
5Karabiner-Elements does not yet support acting on a modifier key tap, which would be required for this. Commented Oct 6, 2016 at 20:03
-
This option 'with these modifiers: ^' only requires
^
to be pressed together with capslock to trigger an action. It's not at all what is required in the question.– defhltCommented Feb 18, 2017 at 10:47 -
Since we first change Caps-Lock to behave like Control through System Preferences, KM sees the USB event with the Control key down. If you omit the
^
modifier, the action will never trigger. Commented Feb 19, 2017 at 19:52 -
If you go the keyboard maestro route, is there any way to map the escape key to caps lock to regain the caps lock functionality? I love having caps lock as both ctrl and escape though.– KvassCommented May 19, 2017 at 21:03
To do it with Karabiner Elements, which supports macOS 10.12 and later, open ~/.config/karabiner/karabiner.json
, and add the following rule to the rules
array.
{
manipulators: [
{
description:
"Change caps_lock to control when used as modifier, escape when used alone",
from: {
key_code: "caps_lock",
modifiers: {
optional: ["any"]
}
},
to: [
{
key_code: "left_control"
}
],
to_if_alone: [
{
key_code: "escape",
modifiers: {
optional: ["any"]
}
}
],
type: "basic"
}
]
}
You can also try to use ControlEscape.spoon with Hammerspoon.
-
3I couldn't get this to work unless I removed the modifiers (keyword and all) in the
to_if_alone
section. But thanks for the snippet. It is super useful.– MichaelCommented Jul 9, 2019 at 2:57
I was able to get this to work on macOS Ventura 13.2.1 on Apple Silicon using Hammerspoon and ControlEscape.spoon
- ControlEscape.spoon requires Homebrew, so install it by opening Terminal and running
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- Create a directory to hold your spoons
mkdir -p ~/.hammerspoon/Spoons
- Download the spoon
git clone https://github.com/jasonrudolph/ControlEscape.spoon.git ~/.hammerspoon/Spoons/ControlEscape.spoon
- Go to the new folder
cd ~/.hammerspoon/Spoons/ControlEscape.spoon
- Run the script
script/setup
and allow various permissions - Press Cmd+Space to open Spotlight and visit Customize modifier keys
- Set the Caps Lock key to Ctrl