- PVSM.RU - https://www.pvsm.ru -
Недавно на Хабре начали появляться статьи (1 [1], 2 [2]) про замечательный компонент QScintilla.
Я один из разработчиков проекта Monkey Studio [3], и, последние полтора года, mksv3 [4]. Мы пользуемся QScintilla уже 5 лет. Периодически делаем для него баг репорты и патчи. Мы решили от него отказаться. И нам мучительно больно за потраченные на него годы.
Пишу этот пост, чтобы у других не случилось так же.
Я делюсь своим опытом. Мы разрабатываем свободный универсальный кроссплатформенный текстовый редактор. То, что критично для нас, может быть не важно для вас. И наоборот. Анализируйте.
И так, наш опыт. Что плохо в QScintilla…
Лексер в терминологии Scintilla — класс, разбирающий, подсвечивающий, выравнивающий и т.д. определенный язык программирования.
Для большинства компонентов, позволяющих редактировать код, можно создавать текстовые файлы с описанием синтаксиса нового языка. Например, для katepart [5]. Для QScintilla лексер — это только C++ код. Соответственно:
QScintilla позволяет настраивать лексер. Вы можете выбрать, какие структуры будут сворачиваться (code folding), а какие нет в C++, и будет ли лексер подсвечивать неконсистентное выравнивание кода в Python. Но, у каждого лексера свой набор параметров. И код и для для настройки лексера приходится писать уникальный.
Если программисту захочется узнать, является ли строка файла Y символ X комментарием (например, чтобы проверять правописание в комментариях, но не в коде) — снова придется писать уникальную проверку для каждого из лексеров.
Еще больше проблема обостряется тем, что набор лексеров и их настроек меняется с каждым релизом. О том, что настройки изменились вам будут периодически напоминать баг репортами «У меня не собирается проект на QScintilla версии x.x.x». И вам очень пригодится конструкция
#if QSCINTILLA_VERSION >= ...
Люди разные, вкусы у них тоже разные. Кому-то нравится темный текст на светлом фоне, кому-то светлый текст на темном фоне. QScintilla позволяет настроить шрифт и фон для каждого из синтаксических элементов (числа, строки, ключевые слова...)
Вот, например, диалог настройки из Monkey Studio (кликните картинку для полного размера):
[7]
Но, настроить можно только конкретный лексер. На скриншоте — страничка настройки C++. Если пользователю захочется создать свою цветовую схему, придется настраивать по очереди каждый из используемых языков.
Если программист захочет создать цветовую схему для пользователей, вариант тот-же — придется настроить каждый из нескольких десятков языков, и не забывать обновлять тему с появлением новых.
Очень трудоемко. Kate и некоторые другие редакторы позволяют настраивать все языки одновременно. Так проще.
QScintilla не использует QTextEdit + QSyntaxHighlighter, а рисует все самостоятельно на QAbstractScrollArea. Велосипед местами получился кривой.
QScintilla поддерживает поиск в тексте. Он работает, даже можно использовать регулярные выражения. Но вот синтаксис регулярных выражений местами отличается от общепринятого (такого, как, например, у QRegExp). И пользователям эти мелкие отличия не понравятся. Для прототипа — сгодится, для стабильного проекта — нет.
Мы сделали поиск на QScintilla, потом пришлось его выбросить и написать собственный.
Из каких-то соображений Phil Thomson не открывает репозиторий QScintilla в публичный доступ, а только выкладывает архивы.
Из-за этого:
Надеюсь никто не подумал, что я не люблю QScintilla, или считаю его плохим компонентом. У него очень много полезной функциональности, он поддерживает большое количество языков, в большинстве случаев автор очень оперативно и адекватно реагирует на патчи и баг репорты. Для большинства проектов на Qt, которым нужен редактор кода, QScintilla — оптимальное решение. Тем более, что альтернатив не много. И очень здорово, что namespace [8] пишет про QScintilla полезные статьи.
Просто про положительные стороны уже написано. А я рассказал про найденные нами недостатки, которые не очевидны на начальных стадиях проекта. Надеюсь, это поможет составить полную картину и объективно оценить компонент.
Список недостатков — наш опыт. Вожможно мы что-то не поняли и делаем не правильно. Комментируйте. Давайте искать истину.
Если решите использовать QScintilla, полезные примеры можно найти в Eric [9], JuffEd [10] и моих проектах, ссылки на которые есть в начале.
И еще, если вы дочитали до конца, с некоторой долей вероятности вы планируете или уже начали сделать свой собственный текстовый редактор или IDE. И, может быть, на этом этапе вас еще не поздно остановить.
За пять лет я видел не менее десятка проектов, которые умерли через пару лет после старта. Запал автора иссякает, а функционал оказывается не намного больше того, что было в первые пару месяцев. Печально.
Иногда новые проекты начинать стоит. Но, только если есть действительно серьезные причины. Сначала просмотрите существующие и четко сформулируйте для себя, почему нельзя влиться в их комманду и продолжить работу вместе. Лучше один хороший проект, чем 10 плохих. Ссылки на несколько стоящих проектов на Qt, и в т.ч. на QScintilla есть здесь [11].
Удачи!
Автор: hlamer
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/qt-2/8545
Ссылки в тексте:
[1] 1: http://habrahabr.ru/post/144411/
[2] 2: http://habrahabr.ru/post/144714/
[3] Monkey Studio: http://monkeystudio.org
[4] mksv3: https://github.com/hlamer/mksv3
[5] katepart: http://kate-editor.org/2005/03/24/writing-a-syntax-highlighting-file
[6] поддержка go для vim: http://go-lang.cat-v.org/text-editors/vim/
[7] Image: http://hlamer.github.com/mksv3/habrahabr/lexer-settings.png
[8] namespace: http://habrahabr.ru/users/namespace/
[9] Eric: http://eric-ide.python-projects.org/
[10] JuffEd: http://habrahabr.ru/search/?q=[juffed]&target_type=posts
[11] здесь: https://github.com/hlamer/mksv3/wiki/Concurents
Нажмите здесь для печати.