Every so often, I have to type some text consisting mostly of uppercase letters, but with an occasional lowercase letter—essentially, sentence case, but inverted. On Windows, I would simply have caps lock on the entire time, and pressing Shift would give me a lowercase letter. On OS X, however, if caps lock is on, I only get uppercase letters, whether Shift is pressed or not.

So, I can either hold down Shift the entire time I'm typing, letting go of it briefly to type a lowercase letter, or press Caps Lock twice for each lowercase letter I type. Neither works as well as what Windows does.

Is there a way to get Caps Lock to behave as it does on Windows, where pressing Shift while caps lock is on produces lowercase letters?

I am running 10.6.

3 Answers 3


See Update below...

It seems (only) the input source "French - Numerical" will behave like Window Caps Lock (with iNVERSE sHIFT):

keyboard layout French - Numerical

Found that info here.

But note that this will come with a rather unusual keyboard layout (at least for me).

keyboard layout French - Numerical1

keyboard layout French - Numerical2

Update: Using Ukelele this can be applied to all keyboard layouts:

Thanks Daniel for pointing the right direction.

Open Ukelele and save your (current) layout to a file (e.g. by "New from current input source" and "Save"):

New from current input source

Open the .xml file in a text editor and find the mapIndex that you want to use for the combination + (shift + caps-lock). For German I used mapIndex="0". Insert this line:

<modifier keys="shift caps"/>

Find all other occurrences of this combination and comment them out (or delete the lines). Again for German it's:

<keyMapSelect mapIndex="1">
<modifier keys="anyShift"/>
<modifier keys="shift rightShift? caps? rightOption? rightControl"/>
<modifier keys="shift rightShift? caps? rightOption rightControl?"/>
<!--<modifier keys="shift rightShift? caps rightOption? rightControl?"/> -->

shift caps

Re-open the modified file with Ukelele.

Here is a comparison of the "German" layout before and after the modification:

layout 1

layout 2

Follow the instructions in Ukelele to create a new input source (Name, ID, installation).

I didn't test the modified file, should work though.

  • 1
    Which suggests that it's a feature that could be added to other layouts as well. I'm sure it can be done in Ukelele, but I haven't learned how yet.
    – Daniel
    Commented Jan 16, 2012 at 21:53
  • Thanks @Daniel for that comment - I figured it out. I'll add the procedure to my answer.
    – iolsmit
    Commented Jan 16, 2012 at 22:35
  • 2
    This, however, will prevent you from using the !@#$%^&*() keys (Shifted top row number keys). To use those, I created a custom layout which replicates exactly the "PC" behaviour on OS X. Do note that this is for the US layout only, if you use another you'll have to do it yourself :) Commented Jun 18, 2012 at 2:12

From what I have experienced, it cannot be done in OS X. None of the keyboard reconfiguration utilities I have tried seem to be able to do it either. Sorry. :(


Thank you Félix Saparelli! Your custom layout works beautifully for me on macOS Big Sur 11.2.2. I followed the instructions here to install by saving file.xml as "/Library/Keyboard Layouts/us_en_caps_lock_fix.keylayout", rebooting, and selecting the new Input Source. This layout has "shift inverts case" behaviour, symbols are produced when shifted, and numbers are produced when not shifted.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .