How can I migrate all keyboard shortcuts from one mac to another?
The shortcuts that can be changed from the Application Shortcuts tab are stored in ~/Library/Preferences/.GlobalPreferences.plist
and in the property lists of applications in ~/Library/Preferences/*.plist
and ~/Library/Containers/*/Data/Library/Preferences/*.plist
.
$ defaults find NSUserKeyEquivalents
Found 1 keys in domain 'Apple Global Domain': {
NSUserKeyEquivalents = {
"Actual Size" = "@0";
"Automatic Fit" = "@9";
"Automatically Resize" = "@9";
"Browse All Versions..." = "^@v";
"Decrease Indent Level" = "^\\Uf702";
"Decrease Level" = "^\\Uf702";
"Decrease Paragraph Indent" = "^\\Uf702";
"Enter Full Screen" = "^@f";
"Enter Full Screen Mode" = "^@f";
"Exit Full Screen" = "^@f";
"Exit Full Screen Mode" = "^@f";
"Find Next" = "@g";
"Find Previous" = "$@g";
"Find and Replace..." = "~@f";
"Full Screen" = "^@f";
Fullscreen = "^@f";
"Increase Indent Level" = "^\\Uf703";
"Increase Level" = "^\\Uf703";
"Increase Paragraph Indent" = "^\\Uf703";
"Line Spacing..." = "~@l";
Minimize = "\001";
"Minimize All" = "\001";
"Move Line Down" = "^\\Uf701";
"Move Line Up" = "^\\Uf700";
"Next Tab" = "~@\\Uf703";
"Next Workspace" = "~@\\Uf703";
"Normal Screen" = "^@f";
"Original Size" = "@0";
"Previous Tab" = "~@\\Uf702";
"Previous Workspace" = "~@\\Uf702";
"Remove Full Screen" = "^@f";
Reveal = "$@r";
"Select Next Tab" = "~@\\Uf703";
"Select Next Tab View" = "~@\\Uf703";
"Select Previous Tab" = "~@\\Uf702";
"Select Previous Tab View" = "~@\\Uf702";
"Shift Down" = "^\\Uf701";
"Shift Left" = "^\\Uf702";
"Shift Right" = "^\\Uf703";
"Shift Up" = "^\\Uf700";
"Show Next Tab" = "~@\\Uf703";
"Show Previous Tab" = "~@\\Uf702";
"Show in Finder" = "$@r";
"Toggle Full Screen" = "^@f";
"Use Selection for Find" = "@e";
"Zoom Reset" = "@0";
"Zoom to Fit" = "@9";
};
}
Found 1 keys in domain 'com.panic.Transmit': {
NSUserKeyEquivalents = {
"Hide Invisible Files" = "$@.";
Refresh = "@r";
"Show Invisible Files" = "$@.";
"Synchronize..." = "$@y";
};
}
Found 1 keys in domain 'net.sourceforge.skim-app.skim': {
NSUserKeyEquivalents = {
Crop = "@k";
"Single Page" = "$@1";
"Single Page Continuous" = "$@0";
"Two Pages" = "$@2";
};
}
Found 1 keys in domain 'com.googlecode.iterm2': {
NSUserKeyEquivalents = {
"Next Pane" = "@\\Uf703";
"Open Autocomplete..." = "@;";
"Previous Pane" = "@\\Uf702";
"Select Pane Above" = "@\\Uf700";
"Select Pane Below" = "@\\Uf701";
};
}
Found 1 keys in domain 'net.notational.velocity': {
NSUserKeyEquivalents = {
Bold = "\001";
Delete = "$@d";
Italic = "\001";
"Plain Text Style" = "\001";
Strikethrough = "\001";
};
}
Found 1 keys in domain 'com.apple.Safari': {
NSUserKeyEquivalents = {
"Mail Contents of This Page" = "\001";
"Reopen All Windows from Last Session" = "~$@r";
"Reopen Last Closed Window" = "~@r";
};
}
Found 1 keys in domain 'com.hogbaysoftware.WriteRoom.mac': {
NSUserKeyEquivalents = {
"Column 120" = "$@7";
"Column 200" = "$@8";
"Column 40" = "$@1";
"Column 50" = "$@2";
"Column 60" = "$@3";
"Column 66" = "$@4";
"Column 80" = "$@5";
"Column 90" = "$@6";
"Column Window Width" = "$@0";
"Enter Full Screen" = "$@f";
"Enter Full Screen Single" = "^@f";
"Exit Full Screen" = "$@f";
"Exit Full Screen Single" = "^@f";
};
}
I actually use a shell script like this to configure the shortcuts:
defaults write -g NSUserKeyEquivalents '{
"Browse All Versions..." = "^@v";
"Minimize" = "\1";
"Minimize All" = "\1";
"Show Previous Tab" = "~@\Uf702";
"Show Next Tab" = "~@\Uf703";
}'
defaults write -app Safari NSUserKeyEquivalents '{
"Reopen Last Closed Window" = "~@r";
"Reopen All Windows from Last Session" = "~$@r";
"Mail Contents of This Page" = "\1";
}'
The shortcut strings use the same format as in DefaultKeyBinding.dict. You can remove a shortcut by assigning a menu item to \1
. If you assign a menu item to nil
, it is triggered when you press n in some applications like Audacity. If you assign a menu item to to \0
, it is triggered when you press any key in Safari in 10.9.
Note that preferences are cached in Mavericks. Changes made with defaults are still applied after you just quit and reopen an application. But if you edit a plist directly or replace the plist, you also have to run killall cfprefsd
or defaults read /path/to/plist
.
Thanks to the existing answer, I've built a script which will save the shortcuts into a script to be run on other machines.
#!/bin/sh
# save-hotkeys.sh
DESTFILE=~/install-hotkeys.sh
echo '#!/bin/bash' > $DESTFILE
defaults find NSUserKeyEquivalents | sed -e "s/Found [0-9]* keys in domain '\\([^']*\\)':/defaults write \\1 NSUserKeyEquivalents '/" -e "s/ NSUserKeyEquivalents = {//" -e "s/};//" -e "s/}/}'/" >> $DESTFILE
echo killall cfprefsd >> $DESTFILE
chmod a+x $DESTFILE
Save this into a file called save-hotkeys.sh
and execute it by running sh save-hotkeys.sh
. On the remote machine, execute ./install-hotkeys.sh
while in the same directory as the file. In my example, I save the file to dropbox so that it is synced to my other machines.