通过NSAttributedString提高NSTextView语法高亮显示的性能

时间:2013-03-11 12:03:36

标签: syntax-highlighting nstextview nsattributedstring parsekit

我正在努力为应用添加一些语法突出显示。在测试课程中,我目前有NSTextViewtextDidChange通知。与此类似:

-(void)textDidChange:(NSNotification *)notification
{
    [self highlightText];
}

突出显示的内容是什么,它从NSTextView中抓取字符串并创建NSMutableAttributedString并最终显示字符串。代码与此类似:(我使用ParseKit进行解析。下面的示例只是突出显示代码注释)。

- (void) highlightText
{
    NSMutableAttributedString * resultString = [[NSMutableAttributedString alloc] initWithString: inputTextView.string];

    PKTokenizer *t = [PKTokenizer tokenizerWithString: inputTextView.string];
    [t setTokenizerState: t.quoteState from: '[' to: ']'];

    // We want comments
    t.commentState.reportsCommentTokens = YES;

    [t enumerateTokensUsingBlock: ^(PKToken * token, BOOL * stop)
     {
        // Comments take presidense.
        if(token.isComment)
        {
            [resultString addAttribute: NSForegroundColorAttributeName
                                 value: [self commentColor]
                                 range: NSMakeRange(token.offset, token.stringValue.length)];
        }
     }];

    // Monospace
    [resultString addAttribute: NSFontAttributeName
                         value: [NSFont userFixedPitchFontOfSize:0.0]
                         range: NSMakeRange(0, inputTextView.string.length)];

    [[inputTextView textStorage] setAttributedString: resultString];
}

现在,如果我正在使用少量文本,这可以正常工作,但我希望在处理大量文本时提高其性能。我对这个问题有两个想法:

  1. 在后台进行处理。当用户输入时,这意味着文本可以在几秒钟内无格式化。我真的不喜欢这个想法。
  2. 仅在文本的可见部分执行突出显示。在用户滚动时进行更多突出显示。这仍然存在这样的问题:当用户滚动时,文本将被取消格式化,但会慢慢变为格式化的样式。
  3. 有没有人对这方面有任何建议?我错过了另一种方法来做到这一点,还是应该这样做?有没有人可能知道任何样本代码做类似/更好的事情?我正在考虑选择#2选项。

1 个答案:

答案 0 :(得分:4)