在终端/脚本中确定OS X键盘布局(“输入源”)?

时间:2014-02-06 08:41:56

标签: macos applescript

我想从终端确定OS X键盘布局(或OS X称之为“输入源”),以便我可以在tmux状态栏等地方显示它。

所以我想知道目前的布局是否是“美国”或者说“瑞典语 - 专业”。

谷歌搜索没有给我任何帮助。这可能吗?

6 个答案:

答案 0 :(得分:14)

注意:@MarkSetchell因提出基本方法而值得称赞 - 在哪里开始查看以及使用哪些工具。 经过进一步调查并在评论中来回反复,我认为我总结了解决方案(截至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/'"

请注意\如何将\\转义为 AppleScript ,以确保只有\到达shell。如果你想直接从shell 执行相同的命令,那就是:
defaults read ~/Library/Preferences/com.apple.HIToolbox.plist AppleSelectedInputSources | egrep -w 'KeyboardLayout Name' | sed -E 's/^.+ = \"?([^\"]+)\"?;$/\1/'

  • 当前选定的键盘布局存储在用户级文件~/Library/Preferences/com.apple.HIToolbox.plist,顶级键AppleSelectedInputSources,子键KeyboardLayout Name中。
  • defaults read确保读取当前设置(遗憾的是,从OSX 10.9开始,其他优先级/usr/libexec/PlistBuddy只能看到缓存版本,可能不同步)。
  • 由于defaults read无法返回单个键的值,因此必须通过egrepsed提取感兴趣的值 - 有一点需要注意defaults read 在键名和字符串值周围使用双引号,具体取决于它们是否是单个单词(没有标点符号)。

<强>更新

事实证明 AppleScript 本身可以解析属性列表,但它有点像拔牙一样。 此外,令人难以置信的是,潜在的不完全当前值问题也会影响AppleScript的解析。

下面是AppleScript处理程序,它获取当前的键盘布局;它使用基于do shell script的解决方法来确保plist文件是最新的,但通过Property List Suite应用程序System Events使用AppleScript的属性列表功能。

注意:显然,上面的基于shell的方法在这种情况下要短得多,但下面的代码演示了使用属性列表的一般技术

# 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

答案 1 :(得分:6)

我不确定这个答案,但可能值得一试。如果您查看文件:

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

有一个名为

的变量
AppleCurrentKeyboardLayoutSourceID

我的是英国人,我在英国......

您可以使用以下命令在脚本中读取文件:

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

以下示例输出:

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

所以,我猜你的问题可以简单地回答:

#!/bin/bash
defaults read /Library/Preferences/com.apple.HIToolbox.plist  AppleEnabledInputSources | grep -sq Swedish
[[ $? -eq 0 ]] && echo Swedish

答案 2 :(得分:6)

最近我在Objective-C上编写了一个小型控制台实用程序(https://github.com/myshov/xkbswitch-macosx)来执行此操作。它比基于脚本的解决方案快得多。它可以获取当前的输入布局,但也可以设置给定的输入布局。

获取当前布局:

$xkbswitch -ge
> US

设置给定的布局:

$xkbswith -se Russian

答案 3 :(得分:2)

假设您有菜单栏输入菜单,想一想如何使用AppleScript。

在终端中运行:

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

即使您只将输入菜单显示为标志图标而没有输入源名称,也能正常工作。

小牛队可能会第一次提示您允许访问。在早期版本的OS X中,我怀疑您需要在辅助功能首选项中启用对辅助设备的支持。

答案 4 :(得分:2)

这个问题促成了keyboardSwitcher CLI工具的创建: https://github.com/Lutzifer/keyboardSwitcher

虽然与已提及的https://github.com/myshov/xkbswitch-macosx类似,但它具有其他功能,例如布局列表不是硬编码的,因此也可以支持第三方布局(例如Logitech)并支持通过自制软件安装。

答案 5 :(得分:0)

我正在寻找有关键盘布局的一个问题的答案,该问题将我带到了这篇文章。我在这里找到了解决问题的方法。

  

已解决的问题   您可能会遇到登录帐户的困难,因为键盘布局可能会意外更改。   登录窗口。 (40821875)

     

解决方法:登录到您的帐户,启动Terminal,然后执行   以下命令:

{{1}}

This is an Apple official release note for Mojave