Подсветка синтаксиса NSTextView - PullRequest
16 голосов
/ 08 февраля 2010

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

Ответы [ 4 ]

29 голосов
/ 08 февраля 2010

Вы должны добавить свой контроллер в качестве делегата объекта 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 - это полезный класс для разбора текста.

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

9 голосов
/ 04 января 2014

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

4 голосов
/ 08 февраля 2010

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

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

2 голосов
/ 08 февраля 2010

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

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

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

...