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?
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 poziomuAppleSelectedInputSources
, podkluczuKeyboardLayout 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 przezegrep
ised
- jeden zastrzeżenie jest takie, żedefaults 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
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
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
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.
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.
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