I am currently switching input sources by running a GUI AppleScript through Alfred, and the GUI script can sometime take up to 1s to complete the change. It gets quite annoying at times.
I have come across Determine OS X keyboard layout (“input source”) in the terminal/a script. And I want to know since we can find out the current input source if there's a way to change input source programatically? I'd tried overwriting the com.apple.HIToolbox.plist but it does not change the input.
(I do realise there's mapping shortcut to input sources available in the system preference, however I prefer mapping keywords with Alfred)
You can do it using the Text Input Services API:
The dictionary in the first line can use other properties for other criteria for picking an input source.
There's also
NSTextInputContext
. It has aselectedKeyboardInputSource
which can be set to an input source ID to select a different input source. The issue there is that you need an instance ofNSTextInputContext
to work with and one of those exists only when you have a key window with a text view as its first responder.On AppleScript you must only take cmd + "space" (or something other, what you use for change keyboard source).
And all what you need:
49 - code of 'space' button in ASCII for AppleScript.
P.S.: don't forget get access for you AppleScript utility in System Preferences.
@Ken Thomases' solution is probably the most robust - but it requires creation of a command-line utility.
A non-GUI-scripting shell scripting / AppleScripting solution is unfortunately not an option: while it is possible to update the
*.plist
file that reflects the currently selected input source (keyboard layout) -~/Library/Preferences/com.apple.HIToolbox.plist
- the system will ignore the change.However, the following GUI-scripting solution (based on this), while still involving visible action, is robust and reasonably fast on my machine (around 0.2 seconds):
(If you just wanted to cycle through installed layouts, using a keyboard shortcut defined in System Preferences is probably your best bet; the advantage of this solution is that you can target a specific layout.)
Note the prerequisites mentioned in the comments.
Changes layout via keypress