Изменить раскладку клавиатуры OSX("источник ввода") программно через терминал или AppleScript?

в настоящее время я переключаю источники ввода, запустив GUI AppleScript через Alfred, и сценарий GUI может когда-то занять до 1s, чтобы завершить изменение. Временами это начинает раздражать.

я наткнулся определите раскладку клавиатуры OS X ("Источник ввода") в терминале/скрипте. И я хочу знать, так как мы можем узнать текущий источник ввода, если есть способ изменить источник ввода программно? Я пытался переписать com.яблоко.Хитулбокс.plist, но он не меняет вход.

(Я понимаю, что есть ярлык отображения источников ввода, доступных в предпочтении системы, однако я предпочитаю ключевые слова отображения с Альфредом)

3 ответов


вы можете сделать это с помощью API служб ввода текста:

NSArray* sources = CFBridgingRelease(TISCreateInputSourceList((__bridge CFDictionaryRef)@{ (__bridge NSString*)kTISPropertyInputSourceID : @"com.apple.keylayout.French" }, FALSE));
TISInputSourceRef source = (__bridge TISInputSourceRef)sources[0];
OSStatus status = TISSelectInputSource(source);
if (status != noErr)
    /* handle error */;

словарь в первой строке может использовать другие свойства для других критериев выбора источника ввода.

там же NSTextInputContext. У него есть selectedKeyboardInputSource который можно установить в ID источника входного сигнала для выбора другого источника входного сигнала. Проблема в том, что вам нужен экземпляр NSTextInputContext для работы, и один из них существует только тогда, когда у вас есть ключевое окно с текстовым представлением в качестве первого Ответчик.


@ Ken Thomases' решение, вероятно, самый надежный , но он требует создания утилиты командной строки.

A non-GUI-scripting shell scripting / AppleScripting решение, к сожалению,не опции: пока is на *.plist файл, который отражает текущий выбранный источник ввода (раскладка клавиатуры) -~/Library/Preferences/com.apple.HIToolbox.plist - система игнорировать в изменение.

следующее GUI-скриптовое решение (исходя из этой), хотя все еще включает видимое действие, является надежная и достаточно быстро на моей машине (около 0,2 секунды):

(Если вы просто хотели через установленные макеты, используя комбинацию клавиш, определенную в Системных настройках, вероятно, ваш лучший выбор; преимущество этой решение заключается в том, что вы можете цель конкретные макет.)

обратите внимание на предварительные условия, упомянутые в комментариях.

# Example call
my switchToInputSource("Spanish")

# Switches to the specified input source (keyboard layout) using GUI scripting.
# Prerequisites:
#   - The application running this script must be granted assisistive access.
#   - Showing the Input menu in the menu bar must be turned on 
# (System Preferences > Keyboard > Input Sources > Show Input menu in menu bar).
# Parameters:
#    name ... input source name, as displayed when you open the Input menu from
#             the menu bar; e.g.: "U.S."
# Example:
#   my switchToInputSource("Spanish")
on switchToInputSource(name)
    tell application "System Events" to tell process "SystemUIServer"
        tell (menu bar item 1 of menu bar 1 whose description is "text input")
            # !! Sadly, we must *visibly* select (open) the text-input menu-bar extra in order to
            # !! populate its menu with the available input sources.
            select
            tell menu 1
                # !! Curiously, using just `name` instead of `(get name)` didn't work: 'Access not allowed'.
                click (first menu item whose title = (get name))
            end tell
        end tell
    end tell
end switchToInputSource

на AppleScript вы должны взять только cmd + "пробел" (или что-то другое, что вы используете для изменения источника клавиатуры).

и все, что вам нужно:

    key code 49 using command down

49-код кнопки "пробел" в ASCII для AppleScript.

P. S.: Не забудьте сделать доступ для вас помощью AppleScript программы в Системные настройки.