Ответ 1
Примечание: @MarkSetchell заслуживает похвалы за то, что он предложил фундаментальный подход - где [начать] смотреть и какие инструменты использовать. После дальнейшего изучения и комментариев, я решил обобщить решение (начиная с OS X 10.9.1):
do shell script "defaults read ~/Library/Preferences/com.apple.HIToolbox.plist \\
AppleSelectedInputSources | \\
egrep -w 'KeyboardLayout Name' | sed -E 's/^.+ = \"?([^\"]+)\"?;$/\\1/'"
Note how [TG41] is escaped as [TG42] for the benefit of AppleScript, which ensures that just [TG43] reaches the shell. If you want to execute the same command directly from the shell, it would be:
[TG44]
- Выбранная в данный момент раскладка клавиатуры сохраняется в файле пользовательского уровня
~/Library/Preferences/com.apple.HIToolbox.plist
, клавише верхнего уровняAppleSelectedInputSources
, подразделеKeyboardLayout Name
. defaults read
обеспечивает чтение текущих настроек (к сожалению, начиная с OSX 10.9, в противном случае превосходящий/usr/libexec/PlistBuddy
видит только кэшированную версию, которая может быть не синхронизирована).- Поскольку
defaults read
не может возвращать отдельное значение ключа, интересующее значение должно быть извлечено с помощьюegrep
иsed
- одно предостережение заключается в том, чтоdefaults read
условно использует двойные кавычки вокруг имен ключей и строковых значений, в зависимости от того, являются ли они одно слово (без знаков препинания) или нет.
Обновление:
Оказывается, что сам AppleScript может анализировать списки свойств, но это немного похоже на удаление зубов. Кроме того, невероятно, что проблема потенциально не полностью текущих значений также влияет на анализ AppleScript.
Ниже приведен обработчик AppleScript, который получает текущую раскладку клавиатуры; он использует обходной путь do shell script
-based, чтобы гарантировать, что файл plist является текущим, но в противном случае использует функции списка свойств AppleScript через Property List Suite
приложения System Events
.
Примечание. Очевидно, что описанный выше подход shell -based намного короче в этом случае, но приведенный ниже код демонстрирует общие методы работы со списками свойств.
# Example call.
set activeKbdLayout to my getActiveKeyboardLayout() # ->, e.g., "U.S."
on getActiveKeyboardLayout()
# Surprisingly, using POSIX-style paths (even with '~') works with
# the 'property list file' type.
set plistPath to "~/Library/Preferences/com.apple.HIToolbox.plist"
# !! First, ensure that the plist cache is flushed and that the
# !! *.plist file contains the current value; simply executing
# !! 'default read' against the file - even with a dummy
# !! key - does that.
try
do shell script "defaults read " & plistPath & " dummy"
end try
tell application "System Events"
repeat with pli in property list items of ¬
property list item "AppleSelectedInputSources" of ¬
property list file plistPath
# Look for (first) entry with key "KeyboardLayout Name" and return
# its value.
# Note: Not all entries may have a 'KeyboardLayout Name' key,
# so we must ignore errors.
try
return value of property list item "KeyboardLayout Name" of pli
end try
end repeat
end tell
end getActiveKeyboardLayout