Определить раскладку клавиатуры OS X ("Источник ввода") в терминале / скрипте?
Я хотел бы определить раскладку клавиатуры OS X (или "источник ввода", как называет его OS X) с терминала, чтобы я мог показать ее в таких местах, как строка состояния tmux.
поэтому я хочу знать, является ли текущий макет "США" или "шведский - Pro", например.
Googling ничего не дает мне. Возможно ли это?
5 ответов
Примечание: @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/'"
обратите внимание, как \
убежал, а \
в интересах AppleScript, что гарантирует, что просто \
достигнет оболочки. Если вы хотите выполнить ту же команду непосредственно из оболочки, это будет выглядеть так:defaults read ~/Library/Preferences/com.apple.HIToolbox.plist AppleSelectedInputSources | egrep -w 'KeyboardLayout Name' | sed -E 's/^.+ = \"?([^\"]+)\"?;$//'
- текущая выбранная раскладка клавиатуры хранится в на уровне пользователя
~/Library/Preferences/com.apple.HIToolbox.plist
верхнего уровня ключAppleSelectedInputSources
, подразделKeyboardLayout Name
. -
defaults read
обеспечивает настоящее настройки считываются (к сожалению, начиная с OSX 10.9, в противном случае superior/usr/libexec/PlistBuddy
видит только кэшированные версия, которая может быть не синхронизирована). - С
defaults read
невозможно вернуть значение отдельного ключа, значение процента должно быть извлечено черезegrep
иsed
- одно предостережение есть чтоdefaults read
условно использует двойные кавычки вокруг ключевых имен и строковых значений, в зависимости от того, являются ли они одним словом (без пунктуации) или нет.
обновление:
получается, что AppleScript может анализировать списки свойств, но это немного похоже на вытягивание зубов. Кроме того, невероятно, что проблема потенциально не полностью текущих значений также влияет на синтаксический анализ AppleScript.
Ниже приведен обработчик AppleScript, который получает текущую раскладку клавиатуры; он использует do shell script
-на основе обходного пути, чтобы убедиться, что файл 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
Я не уверен в этом ответе, но, возможно, стоит проверить. Если вы посмотрите в файле:
/Library/Preferences/com.apple.HIToolbox.plist
есть переменная под названием
AppleCurrentKeyboardLayoutSourceID
и мой установлен на "британский", и я в Великобритании...
вы можете прочитать файл в скрипт:
defaults read /Library/Preferences/com.apple.HIToolbox.plist AppleEnabledInputSources
пример вывода ниже:
(
{
InputSourceKind = "Keyboard Layout";
"KeyboardLayout ID" = 2;
"KeyboardLayout Name" = British;
}
)
Итак, я думаю, на ваш вопрос можно просто ответить, используя это:
#!/bin/bash
defaults read /Library/Preferences/com.apple.HIToolbox.plist AppleEnabledInputSources | grep -sq Swedish
[[ $? -eq 0 ]] && echo Swedish
недавно я написал небольшую консольную утилиту (https://github.com/myshov/xkbswitch-macosx) на Objective-C, чтобы сделать это. Это намного быстрее, чем решения на основе скриптов. Он может получить текущий макет ввода, но также может установить данный макет ввода.
чтобы получить текущий макет:
$xkbswitch -ge
> US
чтобы установить заданный макет:
$xkbswith -se Russian
выяснил, как это сделать с AppleScript, предполагая, что у вас есть меню ввода строки меню.
выполнить в терминале:
osascript -e 'tell application "System Events" to tell process "SystemUIServer" to get the value of the first menu bar item of menu bar 1 whose description is "text input"'
отлично работает, даже если вы показываете меню ввода только как значки флагов, без имени источника ввода.
Mavericks, вероятно, предложит вам разрешить доступ в первый раз. В более ранних версиях OS X я подозреваю, что вам нужно будет включить поддержку вспомогательных устройств в настройках доступности.
этот вопрос привел к созданию инструмента cli keyboardSwitcher: https://github.com/Lutzifer/keyboardSwitcher
хотя похож на уже упомянутый https://github.com/myshov/xkbswitch-macosx это имеет дополнительные функции, например, список макетов не жестко закодирован и, таким образом, может также поддерживать сторонние макеты (например, Logitech) и поддерживает установку через homebrew.