Определить раскладку клавиатуры 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.