How to swap command and option modifier keys with a script in OS X Lion

I use a PC usb keyboard with my macbook. So, I've gone into System Preferences > Keyboard > Modifier Keys... and swapped command and option for the usb keyboard. This puts those keys in the "correct" position for a mac.

But, for part of the day, I remote desktop to a windows machine. So now, I need to swap the keys back, so the remote desktop client isn't confused.

It's easy enough to do this through the Preferences UI, but its cumbersome.

I'd like to use a script of some kind (maybe applescript), so I could quickly swap back and forth.

I've found several scripts online, but none of them are for Lion.


I was able to modify some of the scripts already out there, and get them to work in Lion. To create these scripts:

  • Run the Applescript Editor
  • Create two new empty script files (command-N)
  • Paste in these two scripts
  • Save them as something like "swap command option" and "restore command option" or whatever you'd like
  • You can test them by running them in the applescript editor.

Here is the script to swap command to option, and option to command:

#
# Script to swap the Command and Option keys
# in the System Preferences Keyboard settings.
#
# Helpful if using a PC keyboard
#

tell application "System Preferences"
    activate
    set current pane to pane "com.apple.preference.keyboard"
end tell


tell application "System Events"
    tell process "System Preferences"
    click button "Modifier Keys…" of tab group 1 of window "Keyboard"

    # Select keyboard: pop up button
    click pop up button 5 of sheet 1 of window "Keyboard"
    # The 4th choice there.. my USB Keyboard
    click menu item 4 of menu 1 of pop up button 5 of sheet 1 of window "Keyboard"

    # The Option Key pop up
    click pop up button 2 of sheet 1 of window "Keyboard"
    # Change it to Command, the 4th choice
    click menu item 4 of menu 1 of pop up button 2 of sheet 1 of window "Keyboard"

    # The Command Key pop up
    click pop up button 1 of sheet 1 of window "Keyboard"
    # Change it to Option, the 3rd choice
    click menu item 3 of menu 1 of pop up button 1 of sheet 1 of window "Keyboard"

    click button "OK" of sheet 1 of window "Keyboard"

    end tell
end tell

tell application "System Preferences"
    quit
end tell

Here is the script to swap them back:

#
# Script to restore the Command and Option keys to their defaults 
# in the System Preferences Keyboard settings.
#

tell application "System Preferences"
    activate
    set current pane to pane "com.apple.preference.keyboard"
end tell


tell application "System Events"
    tell process "System Preferences"
    click button "Modifier Keys…" of tab group 1 of window "Keyboard"

    # Select keyboard: pop up button
    click pop up button 5 of sheet 1 of window "Keyboard"
    # The 4th choice there.. my USB Keyboard
    click menu item 4 of menu 1 of pop up button 5 of sheet 1 of window "Keyboard"

    # The Option Key pop up
    click pop up button 2 of sheet 1 of window "Keyboard"
    # Change it to Option, the 3rd choice
    click menu item 3 of menu 1 of pop up button 2 of sheet 1 of window "Keyboard"

    # The Command Key pop up
    click pop up button 1 of sheet 1 of window "Keyboard"
    # Change it to Command, the 4th choice
    click menu item 4 of menu 1 of pop up button 1 of sheet 1 of window "Keyboard"

    click button "OK" of sheet 1 of window "Keyboard"

    end tell
end tell

tell application "System Preferences"
    quit
end tell

To make these scripts easy to access, you can go to Applescript Editor Preferences and check "Show Script menu in menu bar". Then, copy your scripts to your home directory Library/Scripts directory, i.e. /Users/ryan/Library/Scripts

Now you can access them right off the menu bar script menu.


You could also use a private.xml like this with KeyRemap4MacBook:

<?xml version="1.0"?>
<root>
  <item>
    <name>test</name>
    <identifier>test</identifier>
    <not>REMOTEDESKTOPCONNECTION</not>
    <autogen>__KeyToKey__ KeyCode::OPTION_L, KeyCode::COMMAND_L</autogen>
    <autogen>__KeyToKey__ KeyCode::COMMAND_L, KeyCode::OPTION_L</autogen>
    <autogen>__KeyToKey__ KeyCode::OPTION_R, KeyCode::COMMAND_R</autogen>
    <autogen>__KeyToKey__ KeyCode::COMMAND_R, KeyCode::OPTION_R</autogen>
  </item>
</root>

REMOTEDESKTOPCONNECTION is defined in appdef.xml.

This would make fn-escape toggle swapping option and command:

<?xml version="1.0"?>
<root>
  <item>
    <name>test</name>
    <identifier>test</identifier>
    <autogen>__KeyToKey__ KeyCode::ESCAPE, ModifierFlag::FN, KeyCode::VK_CONFIG_TOGGLE_swapoptcmd</autogen>
  </item>
  <item>
    <name>swapoptcmd</name>
    <identifier vk_config="true">swapoptcmd</identifier>
    <autogen>__KeyToKey__ KeyCode::OPTION_L, KeyCode::COMMAND_L</autogen>
    <autogen>__KeyToKey__ KeyCode::COMMAND_L, KeyCode::OPTION_L</autogen>
    <autogen>__KeyToKey__ KeyCode::OPTION_R, KeyCode::COMMAND_R</autogen>
    <autogen>__KeyToKey__ KeyCode::COMMAND_R, KeyCode::OPTION_R</autogen>
  </item>
</root>