我想从终端确定OS X键盘布局(或OS X称之为“输入源”),以便我可以在tmux状态栏等地方显示它。
所以我想知道目前的布局是否是“美国”或者说“瑞典语 - 专业”。
谷歌搜索没有给我任何帮助。这可能吗?
答案 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
无法返回单个键的值,因此必须通过egrep
和sed
提取感兴趣的值 - 有一点需要注意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}}