TextMate 2 Escape 键:如何禁用下一次完成和上一次完成

TextMate 2 Escape key: how to disable next completion and previous completion

默认情况下,在 TextMate 中按 Esc 会循环完成可能的完成(除了关闭对话框外),这可能会在您的文档中放置不需要的字符,尤其是当您习惯于在大多数文本中使用 Esc 作为安全键时编辑。 (事实上​​,在很多 IDE 中,需要多次按 Esc 键才能 关闭 自动完成弹出窗口,以便向上和向下箭头键起作用。)

如何禁用此行为,以便在正常的文本编辑中,Esc 键不执行任何操作,但关闭对话框仍按预期工作?

什么有效

根据@matt 的评论,我发现我可以通过覆盖默认键绑定来完成我需要的操作,如此处所述,https://manual.macromates.com/en/key_bindings.html :

In addition TextMate has a /path/‍to/‍TextMate.app/‍Contents/‍Resources/‍KeyBindings.dict file with some extra key bindings which are specific to TextMate (and thus not appropriate to put in the per user global key bindings file). You can copy this file to ~/Library/‍Application Support/‍TextMate and edit it, this will then take precedence over the bundled file.

我编辑了文件,去掉了nextCompletion那一行,分配给shift+Esc ($\033) 并且同时分配了Esc和shift+Esc来调用noop

"3"     = "noop:";
"$3"    = "noop:";

我在这里了解到 noop 选择器的存在:

退出并重新启动 TextMate 后,Esc 现在除了关闭对话框外什么都不做。

(显然要更改此设置,您需要知道 Objective-C 才能识别选择器字符串(以及具有 'nop' 的程序集),因此您可以猜测应该有一个 noop 选择器。而且你需要知道八进制,所以你将 Escape 键识别为 033 = 27。)


我尝试失败的事情

编辑:供想知道为什么更改一个小设置需要 90 分钟的人参考。

我在第 4.2 节的末尾找到了这段 in the manual

When you provide your own completion command (or list) you may want to disable the default matches. This can be done by setting disableDefaultCompletion to 1.

我尝试在“首选项”>“变量”窗格中将 disableDefaultCompletion 设置为 1,然后退出并重新打开应用程序。我发现 Bundle menu > Select Bundle Item 并单击 Settings 会显示所有设置的列表,包括底部的 disableDefaultCompletion = 1。显然这没有做任何事情? (被不同的包覆盖的其他设置显示为划掉,我的设置没有。)

我还在 http://github.com/textmate/textmate 存储库中搜索了字符串 disableDefaultCompletion,它显示在搜索结果中,所以这个功能应该存在于某处。

我尝试退出应用程序,然后在命令行上:

defaults write com.macromates.TextMate disableDefaultCompletion true

重新启动并再次尝试(在 JavaScript 模式下按关闭右侧的 Esc),它仍然没有禁用完成。