Określić układ klawiatury OS X ("źródło wejścia") w terminalu / skrypcie?

Chciałbym określić układ klawiatury OS X (lub "źródło wejścia", jak nazywa go OS X) z terminala, aby móc go wyświetlać w miejscach takich jak pasek stanu tmux.

Więc chcę wiedzieć, czy obecny układ jest "U. S." lub "Swedish-Pro" na przykład.

Googling nic dla mnie nie daje. Czy to możliwe?

Author: Henrik N, 2014-02-06

5 answers

Uwaga: @MarkSetchell zasługuje na uznanie za wymyślenie fundamentalnego podejścia - gdzie [zacząć] szukać i jakich narzędzi używać. Po dalszym dochodzeniu i tam i z powrotem w komentarzach pomyślałem, że podsumuję rozwiązanie (od 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/'"

zauważ, jak \ jest przechowywany jako \\ na korzyść AppleScript, który zapewnia, że tylko \ dotrze do powłoki. Jeśli chcesz wykonać to samo polecenie bezpośrednio z powłoki , to be:
defaults read ~/Library/Preferences/com.apple.HIToolbox.plist AppleSelectedInputSources | egrep -w 'KeyboardLayout Name' | sed -E 's/^.+ = \"?([^\"]+)\"?;$/\1/'

  • aktualnie wybrany układ klawiatury jest przechowywany w pliku na poziomie użytkownika ~/Library/Preferences/com.apple.HIToolbox.plist, klawiszu najwyższego poziomu AppleSelectedInputSources, podkluczu KeyboardLayout Name.
  • defaults read zapewnia, że bieżące ustawienia są odczytywane (niestety, od OSX 10.9, w przeciwnym razie nadrzędny /usr/libexec/PlistBuddy widzi tylko buforowaną wersję, która może być nie zsynchronizowana).
  • ponieważ defaults read nie może zwrócić wartości pojedynczego klucza, wartość odsetek musi być wyodrębniona przez egrep i sed - jeden zastrzeżenie jest takie, że defaults read warunkowo używa podwójnych cudzysłowów wokół nazw kluczy i wartości łańcuchowych, w zależności od tego, czy są one pojedynczym słowem (bez interpunkcji), czy nie.

Update :

Okazuje się, że AppleScript sam może analizować listy właściwości, ale to jest trochę jak wyrywanie zębów. Ponadto, niewiarygodnie, problem potencjalnie-Nie-w pełni-aktualnych-wartości wpływa również na parsowanie AppleScript.

Poniżej znajduje się Obsługa AppleScript, która Pobiera bieżący układ klawiatury; używa obejścia opartego na do shell script, aby upewnić się, że plik plist jest aktualny, ale poza tym używa funkcji AppleScript ' s proper-list, za pomocą Property List Suite aplikacji System Events.

Uwaga: oczywiście, powyższe podejście oparte na powłoce jest znacznie krótsze w tym przypadku , ale poniższy kod pokazuje ogólne techniki pracy z listami właściwości .

# 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
 13
Author: mklement0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-01 13:35:18

Nie jestem pewien tej odpowiedzi, ale może warto to sprawdzić. Jeśli zajrzysz do pliku:

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

Istnieje zmienna o nazwie

AppleCurrentKeyboardLayoutSourceID
A mój jest ustawiony na "Brytyjski" i jestem w Wielkiej Brytanii...

Możesz odczytać plik w skrypcie za pomocą:

defaults read /Library/Preferences/com.apple.HIToolbox.plist  AppleEnabledInputSources

Przykładowe wyjście poniżej:

(
    {
    InputSourceKind = "Keyboard Layout";
    "KeyboardLayout ID" = 2;
    "KeyboardLayout Name" = British;
}
)

Więc myślę, że na twoje pytanie można po prostu odpowiedzieć używając tego:

#!/bin/bash
defaults read /Library/Preferences/com.apple.HIToolbox.plist  AppleEnabledInputSources | grep -sq Swedish
[[ $? -eq 0 ]] && echo Swedish
 6
Author: Mark Setchell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 22:09:29

Ostatnio napisałem małe narzędzie konsolowe ( https://github.com/myshov/xkbswitch-macosx ) na Objective-C, aby to zrobić. Jest o wiele szybszy niż rozwiązania oparte na skryptach. Może uzyskać bieżący układ wejściowy, ale także może ustawić dany układ wejściowy.

Aby uzyskać aktualny układ:

$xkbswitch -ge
> US

Aby ustawić dany układ:

$xkbswith -se Russian
 5
Author: Alexander Myshov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-22 08:18:10

Wymyśliłem, jak to zrobić z AppleScript, zakładając, że masz menu wprowadzania paska menu.

Uruchom to w Terminalu:

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"'

Działa poprawnie, nawet jeśli menu wprowadzania jest wyświetlane tylko jako ikony flag, bez nazwy źródła wprowadzania.

Mavericks prawdopodobnie poprosi Cię o zezwolenie dostępu, za pierwszym razem. We wcześniejszych wersjach systemu OS X podejrzewam, że musisz włączyć obsługę urządzeń wspomagających w preferencjach dostępności.

 2
Author: Henrik N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-20 00:51:44

To pytanie doprowadziło do stworzenia narzędzia keyboardSwitcher Cli: https://github.com/Lutzifer/keyboardSwitcher

Choć podobne do wspomnianego już https://github.com/myshov/xkbswitch-macosx posiada dodatkowe funkcje, np. lista układów nie jest zakodowana na twardo i dlatego może również obsługiwać układy innych firm (np. Logitech) i obsługuje instalację przez homebrew.

 1
Author: Lutzifer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-04 17:17:36