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)

Author: Community, 2014-05-19

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.

 16
Author: Ken Thomases,
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
 7
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
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.

 1
Author: Ivan Trubnikov,
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