NSTextView语法高亮显示

时间:2010-02-07 21:27:30

标签: objective-c cocoa syntax-highlighting nstextview

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

5 个答案:

答案 0 :(得分:29)

您应该将控制器添加为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是解析文本时使用的有用类。

请注意,此方法绝不是处理语法着色的最有效方法。如果您正在编辑的文档非常大,您很可能会考虑将解析卸载到单独的线程和/或明确重新分析文本的哪些部分。

答案 1 :(得分:9)

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

我制作了一个模板荧光笔类,其标题如下所示:

@interface RMETemplateHighlighter : NSObject <NSTextStorageDelegate>

@end

我在nib文件中初始化它作为一个对象,然后将它连接到带有插座的视图控制器。在视图控制器的awakeFromNib中,我有这个(replacer是我的NSTextView出口,而templateHighlighter是上面课程的出口):

self.replacer.textStorage.delegate = self.templateHighlighter;

我的实现看起来像这样:

- (void)textStorageDidProcessEditing:(NSNotification *)notification {
    NSTextStorage *textStorage = notification.object;
    NSString *string = textStorage.string;
    NSUInteger n = string.length;
    [textStorage removeAttribute:NSForegroundColorAttributeName range:NSMakeRange(0, n)];
    for (NSUInteger i = 0; i < n; i++) {
        unichar c = [string characterAtIndex:i];
        if (c == '\\') {
            [textStorage addAttribute:NSForegroundColorAttributeName value:[NSColor lightGrayColor] range:NSMakeRange(i, 1)];
            i++;
        } else if (c == '$') {
            NSUInteger l = ((i < n - 1) && isdigit([string characterAtIndex:i+1])) ? 2 : 1;
            [textStorage addAttribute:NSForegroundColorAttributeName value:[NSColor redColor] range:NSMakeRange(i, l)];
            i++;
        }
    }
}

所以,你去,一个完整的例子。有一些细节让我绊倒了大约10分钟,就像你必须从textStorage中取出字符串来访问各个角色......也许这可以节省其他人几分钟。

答案 2 :(得分:4)

我建议您先阅读有关语法高亮的CocoaDev page。很多人都为各种目标提供了解决方案。

如果您想执行源代码语法突出显示,建议您查看UKSyntaxColoredTextDocument中的Uli Kusterer

答案 3 :(得分:2)

不确定。您可以将NSTextView设为NSAttributedString,并且您可以对属性字符串执行的一些操作将颜色应用于字符串的某些子范围。

或者你可以search on Google看到很多人以前都做过这件事。

我可能建议使用OkudaKit

答案 4 :(得分:0)

如果您对WebView没问题,可以使用https://github.com/ACENative/ACEView

它将ACE editor加载到WebView中