Определите раскладку клавиатуры OS X ( "источник ввода" ) в терминале /a script?

Я хотел бы определить раскладку клавиатуры OS X (или "входной источник", как это делает OS X) с терминала, чтобы я мог показывать его в таких местах, как строка состояния tmux.

Итак, я хочу знать, является ли текущий макет "U.S." или "шведский-Pro", например.

Гуглинг не появляется для меня. Возможно ли это?

Ответ 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

Ответ 2

Я не уверен в этом ответе, но, возможно, стоит проверить. Если вы посмотрите в файле:

/Library/Preferences/com.apple.HIToolbox.plist

существует переменная, называемая

AppleCurrentKeyboardLayoutSourceID

и мой настроен на "британский", а я в Британии...

Вы можете прочитать файл в script с помощью:

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

Ответ 3

Недавно я написал небольшую консольную утилиту (https://github.com/myshov/xkbswitch-macosx) для Objective-C, чтобы сделать это. Это намного быстрее, чем решения на основе сценариев. Он может получить текущий макет ввода, но также может установить данный макет ввода.

Чтобы получить текущий макет:

$xkbswitch -ge
> US

Чтобы установить заданный макет:

$xkbswith -se Russian

Ответ 4

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

Ответ 5

Этот вопрос привел к созданию инструмента CLI для клавиатуры: https://github.com/Lutzifer/keyboardSwitcher

Хотя он похож на уже упомянутый https://github.com/myshov/xkbswitch-macosx, он имеет дополнительные функции, например. список макетов не является жестко запрограммированным и, следовательно, может также поддерживать сторонние макеты (например, Logitech) и поддерживает установку через доморощенный.

Ответ 6

Я искал ответ на вопрос, который у меня был с раскладкой клавиатуры, которая привела меня к этому посту. Я нашел решение моей проблемы здесь.

Решенные проблемы Вы можете столкнуться с трудностями при входе в свою учетную запись, поскольку раскладка клавиатуры может неожиданно измениться на Окно входа (40821875)

Обходной путь: Войдите в свою учетную запись, запустите Терминал и выполните следующая команда:

sudo rm -rf /var/db/securityagent/Library/Preferences/com.apple.HIToolbox.plist

Это официальная заметка о выпуске Apple для Мохаве