如何删除或禁用默认键盘布局?


17

是否可以删除或禁用OS X Lion的默认键盘布局之一?

我使用的是自定义键盘布局,现在我设法将其设置为系统范围内的默认键盘布局,我希望能够取消选中或删除操作系统随附的内置“ US”键盘布局X.这是屏幕截图—请注意,该复选框已禁用:

屏幕截图

在OS X 10.9中,此首选项窗格已经过重新设计,但是仍然无法“删除”内置的“ US”键盘布局:

屏幕截图

由于我从不使用美式键盘布局,因此我希望摆脱它,即从菜单栏中的“输入”菜单中将其删除。我怎样才能做到这一点?


更新: Daniel的回答并未真正回答此问题,但确实提供了有关此问题的一些有价值的信息:

Mac OS X似乎至少需要选择一种键盘布局,系统才能将其识别为“拉丁字符”布局。

假设这是准确的信息(感谢Daniel,),则问题可以表述如下:

如何使OS X将自定义键盘视为拉丁字符布局?


更新: 我刚遇到一些可能会有所帮助的事情。


1
我认为“拉丁”绰绰有余。在Ukelele中,将键盘ID设置为Roman即可轻松实现。我怀疑您的布局还必须是系统/库/键盘布局中AppleKeyboardLayouts.bundle的一部分。
Tom Gewecke 2012年

Answers:


21
  1. 在“系统偏好设置”中启用与您的物理键盘布局不同的输入源(我使用了阿富汗语Dari)。
  2. 运行f=~/Library/Preferences/ByHost/com.apple.HIToolbox*.plist; plutil -convert xml1 $f; open $f -e
  3. 删除除临时启用的键盘布局和自定义键盘布局以外的其他输入源。
  4. 注销并重新登录。
  5. 从属性列表中删除临时启用的键盘布局。
  6. 注销并重新登录。

编辑:上面的方法似乎已在10.9中停止工作。尽管这在10.9或10.8中都有效:

  1. 将当前输入源更改为自定义键盘布局。
  2. 打开~/Library/Preferences/com.apple.HIToolbox.plist(在10.9中)或~/Library/Preferences/ByHost/com.apple.HIToolbox.*.plist(在10.8及更早版本中)。您可以使用将plist转换为XML plutil -convert xml1
  3. AppleEnabledInputSources词典中删除要禁用的一个或多个输入源。如果有AppleDefaultAsciiInputSource钥匙,请将其删除。
  4. 重新开始。

1
啊哈,如果您重新启动计算机而不是仅注销并重新登录(步骤4),它似乎确实可以工作。谢谢!您介意发布一个新答案并附带指向您资源的链接,以便获得赏金吗?
Mathias Bynens 2013年

1
@MathiasBynens我编辑了答案和我的网站。当我再次尝试第二种方法时,我还需要重新启动以应用更改。
Lri

4
如果重新启动计算机,则在OS X 10.9中工作正常。但是我也必须从plist文件中删除临时布局,然后使用“ sudo reboot”重新启动,否则临时布局会在正常重启后重新添加。
Unname_1 2013年

2
@Lri在10.9上,我必须删除:AppleEnabledInputSources:0(旧的默认布局项目)和:AppleInputSourceHistory:字典(使用PlistBuddy)。无需重新启动,而仅需要注销。
RolKau 2013年

1
对我来说,它不适用于优胜美地。每当我在Xcode中更改文件时,它都会在几秒钟后恢复。谁能解释您是如何做到的?
Simon Perepelitsa 2014年

7

如果没有对系统进行一些尚未发现的破解似乎无法做您想做的事情。Mac OS X似乎至少需要选择一种键盘布局,系统才能将其识别为“拉丁字符”布局。这样可以防止您无法在登录屏幕等上输入密码。如果您选择了法语,加拿大语或系统识别为拉丁字符的其他键盘布局,则可以取消选择美国布局。

您的问题是您的自定义布局包含拉丁字符,但系统无法将其识别为拉丁键盘布局,因此不能成为唯一选择的键盘布局。有关更多信息,请参见此问题(严重缺少一个很好的答案)。

请注意,对该问题的一个很好的答案也会回答您的问题。las,我在这里的答案仅能弄清楚问题出在哪里,但是我没有逐步解决的方法。尽管可能会发生这种黑客攻击,但我看不出有任何证据表明有人能说服Mac OS X特定的定制键盘可以安全地用作唯一的可选键盘。


@Lri我怀疑您是正确的,但没有用于测试该硬件的硬件。也许这个网站的读者可以吗?
丹尼尔

7

为了完整起见,我将其作为Bug ID#11137961提交给Apple,这是我得到的响应:

错误ID#: 11137961
错误标题:使用自定义键盘时,允许禁用默认(内置)键盘布局


工程根据以下信息确定此问题的行为符合预期:

如果问题只是使您的键盘布局被识别为支持ASCII,那么最简单的方法就是“捆绑”您的.keylayout,那么您的Info.plist可以包含一个“ KLInfo_”字典来进一步描述它,例如:

 <key>TISIntendedLanguage</key>
 <string>en</string>   # BCP 47 language string

我需要对此进行更多研究,但是看起来TIS会扫描键盘布局输出以产生USet,并通过是否通过以下最小测试来产生初步的耐心性:

 uset_containsRange(uSet, 0x0020, 0x0021) && uset_containsRange(uSet, 0x002C, 0x0039) &&
 uset_containsRange(uSet, 0x003F, 0x005A) && uset_containsRange(uSet, 0x0061, 0x007A);

TIS还将检查上述语言环境的示例集,并要求该范围内的十几个字符[a-z]

有关捆绑a的一些建议.keylayout,另请参阅 TextInputSources.h

如果这仍然是问题,或者您对解决此问题有疑问,请使用该信息更新错误报告。

现在,我们正在关闭此错误报告。


1
已检查:我的布局符合这些条件,但未被识别为可能的默认布局。因此,他们的工程师似乎没有提供完整的信息或提供了错误的信息。
Unname_1 2013年

1
@DmitryDulepov可以将其用作默认布局,但是删除另一个按钮仍然不会被激活;您将必须手动执行此操作(请参阅我对Lri答案的
RolKau,2013年

@RolKau,是的,但是稍后还有其他问题。如果您有多个布局,则新的自定义布局将在某些应用程序中不可用。例如,您将无法在AppStore的搜索栏中切换到它。至少我做不到。
Unname_1 2013年


1

我刚遇到可能会有所帮助的事情。开始:

$ defaults read /Library/Preferences/com.apple.HIToolbox.plist 
{
    AppleCurrentKeyboardLayoutInputSourceID = "com.apple.keylayout.Dutch";
    AppleDefaultAsciiInputSource =     {
        InputSourceKind = "Keyboard Layout";
        "KeyboardLayout ID" = 1337;
        "KeyboardLayout Name" = QWERTY;
    };
    AppleEnabledInputSources =     (
                {
            InputSourceKind = "Keyboard Layout";
            "KeyboardLayout ID" = 26;
            "KeyboardLayout Name" = Dutch;
        }
    );
    AppleInputSourceHistory =     (
                {
            InputSourceKind = "Keyboard Layout";
            "KeyboardLayout ID" = 26;
            "KeyboardLayout Name" = Dutch;
        }
    );
    AppleSelectedInputSources =     (
                {
            InputSourceKind = "Keyboard Layout";
            "KeyboardLayout ID" = 26;
            "KeyboardLayout Name" = Dutch;
        }
    );
}

在我的系统上,这是我的自定义键盘布局(名为“ QWERTY”)的默认设置。请注意,KeyboardLayout NameKeyboardLayout ID属性是指.keylayout文件开头的ID和名称。

如您所见,defaults read /Library/Preferences/com.apple.HIToolbox.plist AppleCurrentKeyboardLayoutInputSourceID仍然返回字符串"com.apple.keylayout.Dutch"。是否有可用com.apple.keylayout值的清单?是否可以为自定义键盘布局获得这样的值?因为在这种情况下,我们可以简单地覆盖该属性。

此外,AppleEnabledInputSourcesAppleInputSourceHistory,和AppleSelectedInputSources性能都似乎忽略了自定义的键盘布局,因为它们的值对应于在运行安装助手时,我最初选择的本地OS X的键盘布局。


另一个更新:啊哈!似乎还有另一个plist文件可以用来复制设置。

$ defaults read ~/Library/Preferences/ByHost/com.apple.HIToolbox.*.plist 
{
    AppleCurrentKeyboardLayoutInputSourceID = "org.unknown.keylayout.QWERTY";
    AppleDateResID =     {
        smRoman = 2;
    };
    AppleEnabledInputSources =     (
                {
            InputSourceKind = "Keyboard Layout";
            "KeyboardLayout ID" = 26;
            "KeyboardLayout Name" = Dutch;
        },
                {
            InputSourceKind = "Keyboard Layout";
            "KeyboardLayout ID" = 1337;
            "KeyboardLayout Name" = QWERTY;
        },
                {
            "Bundle ID" = "com.apple.CharacterPaletteIM";
            InputSourceKind = "Non Keyboard Input Method";
        },
                {
            "Bundle ID" = "com.apple.KeyboardViewer";
            InputSourceKind = "Non Keyboard Input Method";
        },
                {
            "Bundle ID" = "com.apple.inputmethod.ironwood";
            InputSourceKind = "Non Keyboard Input Method";
        }
    );
    AppleGlobalTextInputProperties =     {
        TextInputGlobalPropertyPerContextInput = 0;
    };
    AppleInputSourceHistory =     (
                {
            InputSourceKind = "Keyboard Layout";
            "KeyboardLayout ID" = 1337;
            "KeyboardLayout Name" = QWERTY;
        },
                {
            InputSourceKind = "Keyboard Layout";
            "KeyboardLayout ID" = 26;
            "KeyboardLayout Name" = Dutch;
        }
    );
    AppleNumberResID =     {
        smRoman = 2;
    };
    AppleSelectedInputSources =     (
                {
            InputSourceKind = "Keyboard Layout";
            "KeyboardLayout ID" = 1337;
            "KeyboardLayout Name" = QWERTY;
        },
                {
            "Bundle ID" = "com.apple.inputmethod.ironwood";
            InputSourceKind = "Non Keyboard Input Method";
        }
    );
    AppleTimeResID =     {
        smRoman = 2;
    };
}

如您所见(AppleCurrentKeyboardLayoutInputSourceID),显然,自定义键盘布局获得的值类似于"org.unknown.keylayout.FOO"where FOO是键盘布局的名称(在.keylayout文件中指定)。

因此,让我们尝试将所有值设置为我们的自定义键盘布局,命名QWERTY和ID 1337(在.keylayout文件中指定):

sudo defaults write /Library/Preferences/ByHost/com.apple.HIToolbox.plist AppleCurrentKeyboardLayoutInputSourceID -string "org.unknown.keylayout.QWERTY"

可悲的是,这似乎不起作用。

更新: @Lri发现了一种可靠的方法-请参阅他的答案。


1

苹果对我的错误报告的回应,我在其中要求通过“系统偏好设置”选择其他键盘布局来删除系统默认键盘布局:

工程部门已确定这不是Apple要解决的问题。

假设此自定义键盘布局是捆绑在一起的(.keylayout位于像一样的捆绑中foo.bundle/Contents/Resources/foo.keylayout),那么这就像插入Info.plistKLInfo_ 字典一样简单:

<key>KLInfo_Qwerty</key>
<dict>
  <key>TISInputSourceID</key>
  <string>com.imgur.stack.keyboardlayout.Qwerty</string>
  <key>TISIntendedLanguage</key>  
  <string>en</string> 
</dict>

如果需要在整个系统范围内使用此布局(即包括密码输入),可以将其安装在中/Library/Keyboard Layouts/,而不是安装在中的相同位置~/Library/

请更新您的错误报告,让我们知道这是否仍然是您的问题。

如果您对解决此问题有疑问,请与他们一起更新错误报告。

请确保定期检查新的Apple产品是否有可能影响此问题的更新。再次感谢您抽出宝贵的时间提交错误。衷心感谢您的宝贵意见。


1

我刚刚使用以下方法成功删除了High Sierra上的默认布局:

  1. 导航到您的Library/Preferences文件夹。
  2. com.apple.HIToolbox.plist通过双击或open在命令行上使用来打开文件文件。这将使XCode弹出,并且可能要安装其他组件。
  3. 重复步骤2,直到XCode最终显示文件的结构。
  4. 找到AppleEnabledInputSources节点并将其展开。
  5. 删除要删除的布局的条目。
  6. 保存该文件并退出XCode。

现在您可能需要注销或重新启动才能完成此操作。无论如何,我不得不重新启动以进行一些更新,所以对我来说是成功的窍门。现在,我很高兴以令人痛苦的冰川速度在Neo中打字,但是看不到一个QWERTZ!


0

这是一个主意:在确保将自定义布局的键盘ID设置为Roman后,创建一个自定义AppleKeyboardLayouts.bundle,其中仅包含该布局,并将其替换为操作系统随附的布局。(我不知道自己创建.bundle涉及什么)


0

您可以使用Ukelele将使用的布局标记为使用拉丁脚本的布局。导出为捆绑软件,进行安装,然后就可以删除美式计算机了。


-1

这很容易做到。首先更改为自定义布局(使用菜单栏的输入菜单),然后取消选择美国布局。


我的自定义布局是当前正在使用的布局。如问题中所述,我不再使用美式键盘布局。
Mathias Bynens 2012年

我没有美国键盘布局,也没有取消它的问题。我拥有的其他自定义设置是非默认,非美国地区和语言。
shpokas 2012年

您可以取消选择最初设置Mac时选择的键盘布局吗?
Mathias Bynens 2012年

是的,我也可以更改区域。
shpokas 2012年

瞧,这就是问题所在。始终存在无法删除或禁用的OS X内置键盘布局之一。
Mathias Bynens 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.