Pharo:自定义智能角色

时间:2016-05-05 09:59:34

标签: smalltalk pharo

复选框"智能角色" in"代码完成" “设置浏览器”部分(至少)执行两项操作:

1)输入时,它会加倍一些字符:',",(,[,{

2)它允许我可以选择一段代码,按((即Shift+9),所选代码将被括号括起来:()。我也可以再次按(删除括号。我也可以[][{}{,即Shift+[,即可。{/ p>

我不喜欢这些东西中的第一个,所以我想禁用它,但我喜欢第二件事,并希望保留它。我怎样才能做到这一点?关闭复选框将禁用两者。

P.S。我知道当复选框关闭时,添加/删除括号的工作方式为Cmd+Shift+9(这比Shift+9方便)并且Cmd+[适用于[],尽管我这样做当复选框关闭时,不知道添加/删除{}的任何工作快捷方式。

1 个答案:

答案 0 :(得分:3)

该设置称为“智能字符”,它可以为您提供查看位置的线索。打开Finder,输入smartCharacters,然后按 Enter 。您应该看到一些部分匹配以及NECControllerNECPreferences class的完全匹配(前者只调用后者)。如果你稍微研究一下这些类,你会看到smartCharacters存储一个布尔值,而smartCharactersMapping返回一个字典,将一些字符映射到它们的“对应物”,即$[到{ {1}}等等。现在看看$]的发件人,你会看到它的来源。

您最感兴趣的来电者是smartCharactersMapping。因此,在这个非常丑陋的方法中设置一个断点来查看它的作用。您不关心前两种情况(编辑器有选择而没有智能映射),因为您希望防止插入第二个匹配字符。所以有趣的是这一点:

NECController>>smartCharacterWithEvent

该方法只有一个实现者和一个发送者,因此注释掉原始方法并返回“左”字符应该是安全的,即:

self newSmartCharacterInsertionStringForLeft: char right: opposite

换句话说,不是创建一个包含左右字符的字符串,也可能是它们之间的空格,而只是返回一个包含您键入的单个字符的新字符串。可能不是最优雅的解决方法,但它应该有效,并且应该向您展示如何在将来解决类似的问题。

(理想情况下,你会找到一个更好的解决方案,在此作为替代答案发布,并将其贡献给Pharo代码库 - 毕竟Pharo是开源的。)