Подтвердить что ты не робот

Выделение синтаксиса NSTextView

Я работаю над текстовым редактором Cocoa, который использует NSTextView. Можно ли изменить цвет некоторых частей текста?

4b9b3361

Ответ 1

Вы должны добавить свой контроллер в качестве делегата объекта NSTextStorage NSTextView ([textView textStorage]), а затем реализовать метод делегата ‑textStorageDidProcessEditing:. Это вызывается всякий раз, когда изменяется текст.

В методе делегата вам нужно получить текущий объект NSTextStorage из текстового представления, используя метод -textStorage NSTextView. NSTextStorage является подклассом NSAttributedString и содержит атрибутное содержимое представления.

Затем ваш код должен проанализировать строку и применить раскраску к тем диапазонам текста, которые вам интересны. Вы применяете цвет к диапазону, используя что-то вроде этого, которое будет применять желтый цвет ко всей строке:

//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 - полезный класс, который следует использовать при анализе текста.

Обратите внимание, что этот метод отнюдь не самый эффективный способ обработки синтаксической раскраски. Если документы, которые вы редактируете, очень велики, вы, скорее всего, захотите рассмотреть возможность разгрузки синтаксического анализа на отдельный поток и/или умение в отношении того, какие разделы текста перерисовываются.

Ответ 2

Ответ Роба Кенигера хорош, но для кого-то, ищущего более конкретный пример, вот краткий синтаксис синтаксиса, который я написал, должен подчеркнуть синтаксис шаблона RegEx. Я хочу, чтобы \ был серым, а персонаж, следующий за ними, был черным. Я хочу, чтобы $ был красным, с символом цифры сразу после $, также красным. Все остальное должно быть черным. Здесь мое решение:

Я сделал класс highlighter шаблона с заголовком, который выглядит так:

@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 для доступа к отдельным символам... возможно, это спасет других людей несколько минут.

Ответ 3

Я рекомендую вам начать с чтения страницы CocoaDev о синтаксисе Highlighing. Многие люди приходят с решениями для различных целей.

Если вы хотите выполнить подсветку синтаксиса исходного кода, я предлагаю вам взглянуть на UKSyntaxColoredTextDocument из Uli Kusterer.

Ответ 4

Конечно. Вы можете дать NSTextView a NSAttributedString, и некоторые из вещей, которые вы можете сделать с атрибутной строкой, - это применить цвета к определенным поддиапазонам строки.

Или вы можете искать в Google и видеть, что многие люди уже делали это с этим.

Я бы рекомендовал использовать OkudaKit.