Pull to refresh

Comments 28

> Ссылки на несколько стоящих проектов на Qt
Ещё Code::Blocks есть, тоже неплохая. Ну, ещё valide. А из редакторов — gedit и mcedit =)

За статью спасибо, редко бывают адекватные статьи с критикой.
Code::Blocks вроде на WxWidgets, а gedit на Gtk+.
По ссылке, приведённой автором, перечислены различные текстовые редакторы и IDE, которые рассматриваются как конкуренты. И не обязательно на Qt.
А, ну просто написано

Ссылки на несколько стоящих проектов на Qt

И вы тоже этот кусок скопировали
Так а не проще тогда кусок ответственный за подсветку синтаксиса выдрать из QtCreator'а?
Но он же умеет только C++, qmake, js подсвечивать.
А как же generic highlighter? Он конфигурационные файлы от kate прекрасно понимает.
Извините. Понял уже. Я не сообразил просто.
Заглянул в QtSDK. В директории generic-highlighter обнаружено несколько xml-файлов синтаксиса для katepart. Если он действительно хорошо их поддерживает — список языков легко расшитить, скачав полную базу katepart файлов.
Но я с этим еще не разбирался и не тестил.
В современных версиях криейтора их можно скачивать напрямую из настроек:
Спасибо за скриншот. Теперь знаю где искать.
Он всё подсвечивает для чего есть правила, а правила в kate есть почти для всего на свете.
Спасибо. Я всегда почему-то думал что она наследуется от QTextEdit. Это беда, правда. Спасибо за вашу статью, она как раз пришлась к концу моей трилогии).
По-моему, основной проблемой QScintill'ы является отсутствие гибкости, ввиду чего добавление простейшего функционала или небольшое изменение поведения превращается в головную боль.
Если вы про добавление функционала в саму QScintilla — то да.
Я как-то предлагал автору фичу добавить. Но его политика — я только делаю порт на Qt. Так что сначала придется пропихнуть свой патч в Scintilla, только потом в QScintilla.
А если вы собираетесь делать программу для дистрибутивов Linux — то еще и долго ждать, пока новая версия войдет в популярные дистрибутивы.
Ну, речь идёт скорее даже о том, как QScintilla использует собственно Scintill'у. Вот как автору вздумалось, так он и написал тот или иной метод, не оставляя возможности определить другое поведение. Вот и приходится либо костыли впиливать, либо исходники править.
Иногда спасает то, что доступен низкоуровневый интерфейс к Scintill'е. (Метод SendScintilla)
Ключевое слово «иногда». :)
Прошёл через всё, описанное автором, всё чистая правда, однако некоторые вещи не настолько катастрофичны, как может показаться.

>QScintilla позволяет настроить шрифт и фон для каждого из синтаксических элементов (числа, строки, ключевые слова...)
Но, настроить можно только конкретный лексер. На скриншоте — страничка настройки C++. Если пользователю захочется создать свою цветовую схему, придется настраивать по очереди каждый из используемых языков.


А это уже на усмотрение разработчика редактора. Да, с точки зрения кода нужно задавать шрифт и фон для каждого лексера отдельно, но вот с точки зрения пользователя всё может настраиваться централизовано. Задал в настройках шрифт/цвет фона — и он стал таким у всех лексеров. В JuffEd, например, так и сделано.

Насчёт общего цвета для чисел/строк/ключевых слов — тут тоже никто не мешает сделать единую настройку для всех лексеров одним махом. Решается простейшим мапом.
Другой разговор, что лично я предпочитаю, чтобы подсветки разных языков различались визуально (у кого-то может быть другие предпочтения — тут уж кому как нравится), но в целом, наверное, неплохо иметь такую опцию.

>Мы сделали поиск на QScintilla, потом пришлось его выбросить и написать собственный.

Я выбросил его сразу же после беглого с ним знакомства :)

В общем и целом — увидел строку «мы решили отказаться от QScintilla», но не увидел, в пользу чего вы решили это сделать. QSyntaxHighlighter? Ну что ж… искренне желаю удачи. Я с него начинал. Но потом послал к чертям и переключился на QScintilla :)
> Да, с точки зрения кода нужно задавать шрифт и фон для каждого лексера отдельно, но вот с точки зрения пользователя всё может настраиваться централизовано. Задал в настройках шрифт/цвет фона — и он стал таким у всех лексеров. В JuffEd, например, так и сделано.
Да, естественно. Мои проекты и Eric делают так же. Я имел в виду именно «настроить цвет для всех чисел».

> никто не мешает сделать единую настройку для всех лексеров одним махом. Решается простейшим мапом.
С таким подходом мап для всех языков должен делать автор редактора. Я не уверен, что у меня получится сделать действительно качественный мап и получить действительно хорошую подсветку для всех поддерживаемых языков, ведь я их не знаю.
Мне намного больше нравится подход katepart, когда автор файла ситнаксиса сам мапит элементы Своего языка на стандартный набор, видит и Понимает, что получилось, если нужно — принимает решение что для этого конкретного элемента стандартные стили не подходят и нужно применить уникальный стиль.

> Но потом послал к чертям и переключился на QScintilla :)
Таким образом ты получил возможность быстро сделать Хороший редактор. Но упустил возможность сделать Великолепный редактор, часть истории, такой, как, например, Vim и Emacs.
А я для себя осознал, что мне Хороший редактор делать не интересно, их и так много существует.
Это мое личное скромное мнение. Не хотелось бы, чтобы по этому поводу разгорелся холивар. Во первых, правильное решение по формуле не посчитаешь, во вторых, люди разные и вкусы разные, правильных решений много.

По поводу того, в пользу чего мы решили отказаться я не писал сознательно. Эта статья — про QScintilla. Потому что про нее мне уже есть что написать. А про альтернативу писать пока рано. История еще только начинается…
>Таким образом ты получил возможность быстро сделать Хороший редактор. Но упустил возможность сделать Великолепный редактор, часть истории, такой, как, например, Vim и Emacs.

Тут всё просто: не было такой цели. Цель была именно «быстро сделать хороший редактор». А раз такую характеристику моему редактору даёт кто-то помимо меня, то наверное этой цели я достиг :)

>По поводу того, в пользу чего мы решили отказаться я не писал сознательно. Эта статья — про QScintilla. Потому что про нее мне уже есть что написать. А про альтернативу писать пока рано. История еще только начинается…

Тогда с нетерпением ждём продолжения!
Изучаю QScintilla не предмет использования в своем приложении для редактирования fb2-файлов.

У меня сложилось впечатление, что QScintilla не способен работать с файлами большого объема. При открытии больших файлов с включенным переносом слов QScintilla надолго «зависает» и очень тормозит при редактировании. Такую же проблему я увидел у текстового редактора JuffEd.

Однако другие проекты, использующие движок Scintilla (но не использующие QScintilla) легко справляются с файлами больших объемов, в том числе wxStyledTextCtrl из библиотеки wxWidgets 2.9.3 и конечно текстовый редактор SciTE. Файл открывается быстро, обрабатывается в фоновом режиме, не мешая пользователю его редактировать.

Подскажите, существует ли возможность заставить QScintilla, обрабатывать большие файлы в фоновом режиме не подвешивая на несколько секунд пользовательский интерфейс.
SciTE (по крайней мере в дефолтных настройках на Debian stable) не переносит строки.
У этого есть недостаток — горизонтальный скроллбар виден всегда, даже если длинных строк нет.
Либо переносы и тормоза, либо большие файлы и скроллбар.
Даже если в программе SciTE переносы включены, всё равно он быстро большие файлы открывает. Посмотрите как при этом ведет себя вертикальная полоса прокрутки если переместиться в середину документа. Заметно, что после прокрутки в фоновом режиме происходит пересчет ее позиции. Какое-то время после перемещения она как бы подстраивается, меняя свою позицию и размеры.
Поведение wxStyledTextCtrl можно увидеть собрав пример, поставляемый с библиотекой wxWidgets. Приложение легко открывает большие файлы с включенным переносом слов. Горизонтальный скроллбар при этом отсутствует, вертикальный пересчитывается в фоновом режиме. При изменении размера окна интерфейс не тормозит, а вертикальный скроллбар несколько секунд скачет взад-вперед.

wxWidgets-2.9.3/samples/stc
Разобрался. Чтобы перенос слов выполнялся в фоновом режиме нужно создавать наследника от класса Scintilla::Editor и переопределять функцию:

virtual bool SetIdle(bool) { return false; }

Подобно тому, как это сделано в библиотеке wxWidgets:

bool ScintillaWX::SetIdle(bool on) {
  if (idler.state != on) {
    // connect or disconnect the EVT_IDLE handler
    if (on)
      stc->Connect(wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(wxStyledTextCtrl::OnIdle));
    else
      stc->Disconnect(wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(wxStyledTextCtrl::OnIdle));
    idler.state = on;
  }
  return idler.state;
}
Соответственно пропатчить нужно класс QsciScintillaQt.
Sign up to leave a comment.

Articles