Cocoa TextView中的语法高亮?经验?建议?想法?

10 投票
1 回答
3571 浏览
提问于 2025-04-15 12:08

可能重复的问题:
Cocoa应用的语法高亮

我对在Cocoa的文本视图中实现语法高亮很感兴趣。

我找到了一些资源:

  • 使用flex的方法,通过一个flex模式来匹配在一个TextView代理中的textStorageDidProcessEditing。在这种方法中,每次输入事件都会解析整个字符串,因此性能会下降。

  • CocoaDev有一个关于语法高亮的专门页面

    1. 使用NSTextStorageDidProcessEditingNotification,然后获取编辑的范围,只在这个范围内应用颜色。这个范围可以是单词边界或其他任何东西;这样肯定能提高性能。

    2. 这里提到:例如,Xcode只会给当前屏幕上的文本上色,并在你滚动文档时再给其余部分上色。那要怎么实现呢?

    3. 使用NSLayoutManager – 通过临时属性[仅用于屏幕绘制,任何方式都不持久化...],正如文档所说,但在输入空格字符之前,不会给最后编辑的范围上色。

    4. UKSyntaxColoredDocument这样的自定义助手 – 不错,但语言定义是通过属性列表完成的;如何使用额外的/现有的语言定义?

在我看来,这些方法都不是特别灵活或稳健(除了第4个,可能还行...)。

我知道有一些现成的强大库可以实现语法高亮,比如pygments;还有PyObjC

问题:如何能在Cocoa的TextView中使用现有的库,比如pygments,来实现一个灵活且高效的语法高亮?

注意:我知道这个问题很宽泛(而且太长了)。欢迎分享经验、建议和解决方案。谢谢。


我发现了另一个类似的讨论:Cocoa应用的语法高亮

1 个回答

7

我建议你去看看Smultron的源代码。这个软件的语法高亮做得非常好。它使用了NSTextView的一个子类来处理大部分复杂的工作。代码里用布局管理器给文本添加属性,还用了一些聪明的技巧,只对文档中必要的部分进行高亮显示。

撰写回答