Подсветка синтаксиса NSTextView

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

16
задан igul222 7 February 2010 в 21:27
поделиться

3 ответа

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

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

29
ответ дан 30 November 2019 в 16:00
поделиться

Существует возможность фонового изображения , но его трудно поддерживать, и он не реагирует на изменения размера шрифта, что делает его менее оптимальным выбором для ИМО.

Лучшим способом в моем opionion было бы:

  • Поместите < span > $ рядом с входом (до него, на самом деле).

  • дать ему положение: относительное; слева: 20рх .

  • Символ $ затем перемещается в поле ввода.

  • Затем введите поле ввода padding-left: 24px .

  • Войла! Знак $ находится в поле ввода, ничего не скрывает и не может быть удален.

-121--2249231-

Два варианта:

  1. Эксперимент с \rlap , который наберет его аргумент, а затем продолжит набор текста над ним. Ужасно верен, как правило, но это должно работать на ваш пример.
  2. Используйте Metopost для размещения элементов.
-121--4435149-

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

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

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

2
ответ дан 30 November 2019 в 16:00
поделиться

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

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

4
ответ дан 30 November 2019 в 16:00
поделиться