Zmienić układ klawiatury OSX ("źródło wejścia") programowo przez terminal lub AppleScript?
Obecnie przełączam źródła wejściowe, uruchamiając GUI AppleScript przez Alfreda, a skrypt GUI może kiedyś zająć do 1s, aby zakończyć zmianę. Czasami robi się to dość denerwujące.
Natknąłem się na określenie układu klawiatury OS X ("źródło wejścia") w terminalu/skrypcie. I chcę wiedzieć, ponieważ możemy znaleźć aktualne źródło wejściowe, jeśli istnieje sposób, aby zmienić źródło wejściowe programowo? Próbowałem nadpisać komunikator.jabłko.HIToolbox.plist ale nie zmienia wejścia.
(zdaję sobie sprawę, że w Preferencjach systemowych jest dostępny skrót do mapowania źródeł wejściowych, jednak preferuję mapowanie słów kluczowych z Alfredem)
3 answers
Można to zrobić za pomocą interfejsu API usług wprowadzania tekstu:
NSArray* sources = CFBridgingRelease(TISCreateInputSourceList((__bridge CFDictionaryRef)@{ (__bridge NSString*)kTISPropertyInputSourceID : @"com.apple.keylayout.French" }, FALSE));
TISInputSourceRef source = (__bridge TISInputSourceRef)sources[0];
OSStatus status = TISSelectInputSource(source);
if (status != noErr)
/* handle error */;
Słownik w pierwszej linii może używać innych właściwości dla innych kryteriów wyboru źródła wejściowego.
Jest też NSTextInputContext
. Posiada selectedKeyboardInputSource
, które można ustawić na ID źródła wejściowego, aby wybrać inne źródło wejściowe. Problem polega na tym, że potrzebujesz instancji NSTextInputContext
do pracy, a jedna z nich istnieje tylko wtedy, gdy masz kluczowe okno z widokiem tekstowym jako pierwszy odpowiadający.
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-05-21 08:24:26
@rozwiązanie Kena Thomasesa jest prawdopodobnie najbardziej wytrzymałe - ale wymaga utworzenia narzędzia wiersza poleceń.
A non-GUI-scripting shell scripting / AppleScripting rozwiązanie jest niestety nie opcją: podczas gdy jest możliwe jest zaktualizowanie pliku *.plist
, który odzwierciedla aktualnie wybrane źródło wejściowe (układ klawiatury) - ~/Library/Preferences/com.apple.HIToolbox.plist
- system zignoruje zmianę.
Jednak następujące rozwiązanie GUI-scripting (w oparciu o To ), choć wciąż wymaga widocznej akcji, jest wytrzymały irozsądnie szybki na mojej maszynie (około 0,2 sekundy):
(Jeśli po prostu chcesz przechodzić przez zainstalowane układy, użycie skrótu klawiaturowego zdefiniowanego w Preferencjach systemowych jest prawdopodobnie najlepszym rozwiązaniem; zaletą tego rozwiązania jest to, że możesz skierować układ do konkretnego układu.)
Zwróć uwagę na warunki wstępne wymienione w komentarzach.
# Example call
my switchToInputSource("Spanish")
# Switches to the specified input source (keyboard layout) using GUI scripting.
# Prerequisites:
# - The application running this script must be granted assisistive access.
# - Showing the Input menu in the menu bar must be turned on
# (System Preferences > Keyboard > Input Sources > Show Input menu in menu bar).
# Parameters:
# name ... input source name, as displayed when you open the Input menu from
# the menu bar; e.g.: "U.S."
# Example:
# my switchToInputSource("Spanish")
on switchToInputSource(name)
tell application "System Events" to tell process "SystemUIServer"
tell (menu bar item 1 of menu bar 1 whose description is "text input")
# !! Sadly, we must *visibly* select (open) the text-input menu-bar extra in order to
# !! populate its menu with the available input sources.
select
tell menu 1
# !! Curiously, using just `name` instead of `(get name)` didn't work: 'Access not allowed'.
click (first menu item whose title = (get name))
end tell
end tell
end tell
end switchToInputSource
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
2017-05-23 12:25:02
Na Applescripcie musisz wziąć tylko cmd + "spacja" (lub coś innego, czego używasz do zmiany źródła klawiatury).
I wszystko, czego potrzebujesz:
key code 49 using command down
49-Kod przycisku "spacja" w ASCII dla AppleScript.
P. S.: nie zapomnij uzyskać dostęp do Narzędzia AppleScript w Preferencjach systemowych.
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
2017-01-28 21:57:31