NSTextView语法突出显示

问题描述 投票:17回答:5

我正在使用NSTextView的可可文本编辑器上工作。是否可以更改文本某些部分的颜色?

objective-c cocoa syntax-highlighting nstextview
5个回答
30
投票

您应将控制器添加为NSTextStorageNSTextView)的[textView textStorage]对象的委托,然后实现委托方法‑textStorageDidProcessEditing:。每当文本更改时都会调用它。

在委托方法中,您需要使用NSTextStorage-textStorage方法从文本视图中获取当前的NSTextView对象。 NSTextStorageNSAttributedString的子类,包含视图的属性内容。

您的代码然后必须解析该字符串并将颜色应用于您感兴趣的任何文本范围。您可以使用以下方法将颜色应用于范围,这将对整个字符串应用黄色:

//get the range of the entire run of text
NSRange area = NSMakeRange(0, [textStorage length]);

//remove existing coloring
[textStorage removeAttribute:NSForegroundColorAttributeName range:area];

//add new coloring
[textStorage addAttribute:NSForegroundColorAttributeName 
                    value:[NSColor yellowColor] 
                    range:area];

如何解析文本取决于您。 NSScanner是在解析文本时使用的有用类。

请注意,此方法绝不是处理语法着色的最有效方法。如果您正在编辑的文档非常大,则您很可能会考虑将解析工作转移到一个单独的线程上,并且/或者对于要解析的文本部分比较聪明。


10
投票

Rob Keniger's answer很好,但是对于正在寻找更具体示例的人来说,这是我写的一个简短的语法突出显示器,应该突出显示RegEx模板语法。我希望\为灰色,紧随其后的字符为黑色。我希望$为红色,紧随$之后的数字字符也为红色。其他所有东西都应该是黑色的。这是我的解决方案:


4
投票

我建议您首先阅读有关语法高亮的CocoaDev page。许多人都提出了针对各种目标的解决方案。


2
投票

当然。您可以给NSTextView一个NSAttributedString,并且您可以对属性字符串进行的一些操作是将颜色应用于字符串的某些子范围。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.