Cocoa TextView中的语法高亮?经验?建议?想法?
可能重复的问题:
Cocoa应用的语法高亮
我对在Cocoa的文本视图中实现语法高亮很感兴趣。
我找到了一些资源:
使用flex的方法,通过一个flex模式来匹配在一个
TextView
代理中的textStorageDidProcessEditing
。在这种方法中,每次输入事件都会解析整个字符串,因此性能会下降。CocoaDev有一个关于语法高亮的专门页面:
使用
NSTextStorageDidProcessEditingNotification
,然后获取编辑的范围,只在这个范围内应用颜色。这个范围可以是单词边界或其他任何东西;这样肯定能提高性能。这里提到:例如,Xcode只会给当前屏幕上的文本上色,并在你滚动文档时再给其余部分上色。那要怎么实现呢?
使用
NSLayoutManager
– 通过临时属性[仅用于屏幕绘制,任何方式都不持久化...],正如文档所说,但在输入空格字符之前,不会给最后编辑的范围上色。像UKSyntaxColoredDocument这样的自定义助手 – 不错,但语言定义是通过属性列表完成的;如何使用额外的/现有的语言定义?
在我看来,这些方法都不是特别灵活或稳健(除了第4个,可能还行...)。
我知道有一些现成的强大库可以实现语法高亮,比如pygments;还有PyObjC。
问题:如何能在Cocoa的TextView
中使用现有的库,比如pygments,来实现一个灵活且高效的语法高亮?
注意:我知道这个问题很宽泛(而且太长了)。欢迎分享经验、建议和解决方案。谢谢。
我发现了另一个类似的讨论:Cocoa应用的语法高亮
1 个回答
我建议你去看看Smultron的源代码。这个软件的语法高亮做得非常好。它使用了NSTextView的一个子类来处理大部分复杂的工作。代码里用布局管理器给文本添加属性,还用了一些聪明的技巧,只对文档中必要的部分进行高亮显示。