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

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

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

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

Ответ 1

Вы можете сделать это с помощью 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, который может быть установлен на ИД источника входного сигнала, чтобы выбрать другой источник входного сигнала. Проблема в том, что вам нужен экземпляр NSTextInputContext для работы, и один из них существует только тогда, когда у вас есть ключевое окно с текстовым представлением в качестве его первого ответчика.

Ответ 2

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

Сценарий оболочки без GUI-скриптов/решение AppleScripting, к сожалению, не является вариантом: хотя можно обновить файл *.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

Ответ 3

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

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

    key code 49 using command down

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

P.S.: не забывайте получить доступ к утилите AppleScript в системных настройках.

Ответ 4

tell application "System Events"
    key code 49 using control down
end tell

Изменяет расположение клавиш