Измените компоновку клавиатуры 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
Изменяет расположение клавиш