15

私は現在、Alfred を介して GUI AppleScript を実行して入力ソースを切り替えています。GUI スクリプトは、変更を完了するのに最大 1 秒かかる場合があります。それは時々かなり迷惑になります。

Terminal/a script で、Determine OS X キーボード レイアウト (「入力ソース」) に遭遇しました。そして、プログラムで入力ソースを変更する方法があれば、現在の入力ソースを見つけることができるので知りたいですか? com.apple.HIToolbox.plist を上書きしようとしましたが、入力は変更されません。

(システム設定で利用可能な入力ソースへのマッピング ショートカットがあることは認識していますが、キーワードを Alfred にマッピングすることを好みます)

4

6 に答える 6

18

テキスト入力サービス API を使用して実行できます。

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 */;

最初の行のディクショナリは、入力ソースを選択するための他の条件に他のプロパティを使用できます。

もありNSTextInputContextます。selectedKeyboardInputSource別の入力ソースを選択するために、入力ソース ID に設定できる があります。ここでの問題は、使用するには のインスタンスが必要であり、そのNSTextInputContextうちの 1 つが最初のレスポンダーとしてテキスト ビューを持つキー ウィンドウを持っている場合にのみ存在することです。

于 2014-05-19T05:22:37.233 に答える
8

@Ken Thomases のソリューションはおそらく最も堅牢ですが、コマンドライン ユーティリティを作成する必要があります。

残念ながら、非 GUI スクリプト シェル スクリプト / AppleScript ソリューションはオプションではありません。現在選択されている入力ソース (キーボード レイアウト) を反映するファイルを更新すること可能ですが、システムは変更を無視します。*.plist~/Library/Preferences/com.apple.HIToolbox.plist

ただし、次のGUI スクリプト ソリューション(これに基づく) は、まだ目に見えるアクションを含んでいますが、私のマシンでは堅牢でかなり高速です(約 0.2 秒)。

(インストールされているレイアウトを順番に切り替えたいだけの場合は、システム環境設定で定義されているキーボード ショートカットを使用するのがおそらく最善の策です。このソリューションの利点は、特定のレイアウトをターゲットにできることです。)

コメントに記載されている前提条件に注意してください。

# 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
于 2014-05-19T15:44:15.937 に答える