Colorer — гибкая раскраска синтаксиса в редакторе и др.

Здесь можно обсудить ваш любимый плагин.
User avatar
ctapmex
Posts: 1010
Joined: Fri 11 Apr, 2008 07:53
Been thanked: 4 times
Contact:

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by ctapmex » Wed 04 May, 2005 14:45

Far Colorer — плагин подсветки синтаксиса в редакторе, основанный на Colorer Library Игоря Русских.
  • Изначальный автор плагина — Игорь Русских (lomecb, он же cail).
  • После того как плагин портирован на Far 2, поддержкой занимается Алексей Добрунов (ctapmex, он же на форуме ctapmex).
  • Официальная поддержка осуществляется через google-группу colorer_ru (на форуме бывает только ctapmex).
  • Актуальные версии основаны на Colorer Library версии take5.
GitHub | Анонс | Старые домашние страницы библиотеки Colorer и плагина для FAR

Плагин входит в дистрибутив Far Manager с v3.0.2948 (старые версии доступны тут)



Что не разжёвано в документации плагина:
  • Как подключить собственные цветовые стили *.hrd
  • Как подключить собственную схему:
    • используя пользовательский файл прототипов:
    • используя папку auto:
    • через пользовательский catalog.xml:
  • Как переопределить существующую схему
  • Как правильно "удалить" какую-либо стандартную схему
  • Как использовать относительные пути и переменные окружения
  • Если раскраска неправильна:
  • Неочевидные настройки: maxlinelength (в теме)
  • Тонкая настройка подсветки для отдельной схемы: в теме.

2useven10
Posts: 3817
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 157 times

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by 2useven10 » Thu 24 Jan, 2019 14:36

Latest post of the previous page:

grnt666 wrote:
Thu 24 Jan, 2019 14:32
Можно ли узнать подробности, в чем же было дело?
А читать не пробовали? В теме всё есть.

grnt666
Posts: 2
Joined: Tue 22 Jan, 2019 13:21

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by grnt666 » Thu 24 Jan, 2019 14:47

2useven10 wrote:
Thu 24 Jan, 2019 14:36
А читать не пробовали? В теме всё есть.
В теме - суть исправлений размыта. Автор закоммитил несколько багов одновременно. А та ошибка, о которой я написал (и писали до меня), как оказалось, давно исправлена, а автор просто не знал, что она не включена в релиз! Этой ошибке в FAR 3 как минимум 3 года, она некоторое время прожила и во втором фаре. Поэтому интересно узнать подробности.

2useven10
Posts: 3817
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 157 times

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by 2useven10 » Thu 24 Jan, 2019 15:29

grnt666 wrote:
Thu 24 Jan, 2019 14:47
А та ошибка, о которой я написал (и писали до меня), как оказалось, давно исправлена, а автор просто не знал, что она не включена в релиз!
нет.
grnt666 wrote:
Thu 24 Jan, 2019 14:47
Этой ошибке в FAR 3 как минимум 3 года
да.
grnt666 wrote:
Thu 24 Jan, 2019 14:47
она некоторое время прожила и во втором фаре
нет.

Читайте ещё раз.

User avatar
ctapmex
Posts: 1010
Joined: Fri 11 Apr, 2008 07:53
Been thanked: 4 times
Contact:

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by ctapmex » Fri 25 Jan, 2019 05:23

grnt666 wrote:
Thu 24 Jan, 2019 14:32
ctapmex wrote:
Thu 24 Jan, 2019 05:46
попробую с таймером. но разницы с точки зрения "неубиваемо" не будет. EditorSet - общий класс, уничтожается только при выгрузке плагина/остановке фара.
Спасибо, что наконец исправили багу
https://bugs.farmanager.com/view.php?id=3696
Можно ли узнать подробности, в чем же было дело?
в 2015 году в far отключили генерацию пустых событий, за счет которых colorer брал управление для прокраски в фоне. исправление - генерация этих событий внутри colorer

User avatar
John Doe
Бюрократ
Posts: 12255
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 163 times

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by John Doe » Fri 25 Jan, 2019 10:14

Баг. В списке типов не работает F1.
В справке соответствующий раздел предусмотрен: @filetypechoose

User avatar
Sim
Posts: 387
Joined: Fri 12 Jun, 2009 09:43
Has thanked: 2 times
Been thanked: 1 time
Contact:

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by Sim » Fri 25 Jan, 2019 10:31

сейчас, в Far 3.0.5356 Colorer раскрашивает файлы с длинными строками, но редактировать такой файл не возможно, любое нажатие клавиши, которое вносит изменение в код, вызывает алгоритм раскраски и фар замирает пока colorer не раскрасит все заново, это очень плохо.
Last edited by Sim on Fri 25 Jan, 2019 10:36, edited 2 times in total.
Случайности не случайны.

User avatar
ctapmex
Posts: 1010
Joined: Fri 11 Apr, 2008 07:53
Been thanked: 4 times
Contact:

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by ctapmex » Fri 25 Jan, 2019 11:01

John Doe wrote:
Fri 25 Jan, 2019 10:14
Баг. В списке типов не работает F1.
В справке соответствующий раздел предусмотрен: @filetypechoose
работает, проверь еще раз. может макросы или что еще

User avatar
John Doe
Бюрократ
Posts: 12255
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 163 times

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by John Doe » Fri 25 Jan, 2019 13:20

ctapmex wrote:
Fri 25 Jan, 2019 11:01
работает, проверь еще раз. может макросы или что еще
Проверил, действительно работает.
Не знаю что за глюк был.

BioSpb
Posts: 13
Joined: Thu 13 Jan, 2011 22:18
Has thanked: 2 times

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by BioSpb » Fri 25 Jan, 2019 15:06

ура, фоновая раскраска заработала!
но только оооочень медленно.
changelog раскрашивается до конца за 24 секунды!
FAR2 делает это за 8 секунд.
можно как то это ускорить?

User avatar
ctapmex
Posts: 1010
Joined: Fri 11 Apr, 2008 07:53
Been thanked: 4 times
Contact:

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by ctapmex » Fri 25 Jan, 2019 17:55

ускорить - вынесу в настройки. но для этого надо формы перерисовать, уже вставлять параметры некуда

buniak_a_h
Posts: 707
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 67 times
Been thanked: 19 times
Contact:

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by buniak_a_h » Fri 25 Jan, 2019 18:14

ctapmex wrote:
Fri 25 Jan, 2019 17:55
для этого надо формы перерисовать
Если Трудоёмко, то может в файле, аналогичном hrcsettings.xml (hrcsettings.xml.user)?

BioSpb
Posts: 13
Joined: Thu 13 Jan, 2011 22:18
Has thanked: 2 times

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by BioSpb » Fri 25 Jan, 2019 18:14

на сегодняшнем билде - больше 30 сек!
если вяло перемещаться по редактору, то больше минуты.

я могу ошибаться, но мне кажется решение проблемы кроется в этих двух местах:

Code: Select all

int FarEditor::editorInput(const INPUT_RECORD &Rec)
{
  if (Rec.EventType == KEY_EVENT && Rec.Event.KeyEvent.wVirtualKeyCode == 0) {

    if (baseEditor->haveInvalidLine()) {

      idleCount++;
      if (idleCount > 10) {
        idleCount = 10;
      }
      baseEditor->idleJob(idleCount * 10);
      info->EditorControl(editor_id, ECTL_REDRAW, 0, nullptr);
    }
  } else if (Rec.EventType == KEY_EVENT) {
    idleCount = 0;
  }

  return 0;
}

Code: Select all

#define IDLE_PARSE(time) (100+time*4)

void BaseEditor::idleJob(int time)
{
  if (invalidLine < lineCount) {
    if (time < 0) {
      time = 0;
    }
    if (time > 100) {
      time = 100;
    }
    validate(invalidLine + IDLE_PARSE(time), false);
  }
}
максимально передается число 100 - дальше оно пребразуется в 500. почему то считается, что это время, и возможно поэтому в queuetimer тоже используется 500 (мс). наверно просто совпадение).
но по факту: 500 - это число строк, которое за раз парсит колорер.
32000 строк, минус 6000, разделить на 500 - 52 вызова через полсекунды - это 26 секунд, не учитывая плавный набор. с ним больше 30.
использование idleCount=10 уменьшает время только если одновременно что то делать в редакторе.

наверное стоит поправить в libcolorer ограничение или просто умножить на 10. ну или вынести это в конфиг.
это позволит сократить время раскрашивания changelog до 3 - 3,5 сек.
при отключенном backparse, он раскрашивается за 2,5 секунды. но эта задержка перед открытием жутко бесит.
на многих файлах поменьше задержка в полсекунды тоже заметна.

User avatar
HaRT
Moderator
Posts: 8714
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 81 times
Been thanked: 147 times

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by HaRT » Fri 25 Jan, 2019 18:37

ctapmex wrote:
Fri 25 Jan, 2019 17:55
ускорить - вынесу в настройки
Сложно ли сформулировать настройку в пользовательских терминах? Например, как долю времени, отводимую на очередную порцию покраски; или как допустимый уровень использования процессора; и т.п.
Фар есть инструмент, а не нянька. © 2009 DrKnS

BioSpb
Posts: 13
Joined: Thu 13 Jan, 2011 22:18
Has thanked: 2 times

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by BioSpb » Fri 25 Jan, 2019 18:54

можно за основу взять значение backparse.
например, так:

Code: Select all

int FarEditor::editorInput(const INPUT_RECORD &Rec)
{
  if (Rec.EventType == KEY_EVENT && Rec.Event.KeyEvent.wVirtualKeyCode == 0) {

    if (baseEditor->haveInvalidLine()) {

      idleCount++;
      if (idleCount > 5)
        idleCount = 5;
      baseEditor->idleJob(BackParse*(idleCount+1)/6);
      info->EditorControl(editor_id, ECTL_REDRAW, 0, nullptr);
    }
  } else if (Rec.EventType == KEY_EVENT) {
    idleCount = 0;
  }
  return 0;
}

void BaseEditor::idleJob(int lines)
{
  if (invalidLine < lineCount) {
    if (lines < 500) {
      lines = 500;
    }
    if (lines > INT_MAX) {
      lines = INT_MAX;
    }
    validate(invalidLine + lines, false);
  }

BioSpb
Posts: 13
Joined: Thu 13 Jan, 2011 22:18
Has thanked: 2 times

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by BioSpb » Fri 25 Jan, 2019 19:04

или просто половину от backparse, но не менее 500.

Code: Select all

int FarEditor::editorInput(const INPUT_RECORD &Rec)
{
  if (Rec.EventType == KEY_EVENT && Rec.Event.KeyEvent.wVirtualKeyCode == 0) {
    if (baseEditor->haveInvalidLine()) {
      baseEditor->idleJob(BackParse/2);
      info->EditorControl(editor_id, ECTL_REDRAW, 0, nullptr);
    }
  }
  return 0;
}

void BaseEditor::idleJob(int lines)
{
  if (invalidLine < lineCount) {
    if (lines < 500) {
      lines = 500;
    }
    validate(invalidLine + lines, false);
  }

User avatar
ctapmex
Posts: 1010
Joined: Fri 11 Apr, 2008 07:53
Been thanked: 4 times
Contact:

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by ctapmex » Fri 25 Jan, 2019 19:23

так, мы с вами почти в равных условиях. Вы код почти не видели, а я видел давно и все забыл -)
давайте разбираться, и прояснять разные моменты. Мне для памяти, вам для понимания что и как
на текущий момент есть 2 "потока" разбора.
Первый - это фоновый. Изначально он работал от событий фара. То "ускорение" в коде idleCount++ сделано специально, что скорость разбора, или иначе тормоза gui, надо наращивать постепенно. Вдруг пользователь печатает текст. Мы же в редакторе всё таки.
Второй - это разбор во время события раскраски экрана. Нам важно разобрать что на экране. И это быстро и легко, если мы в начале файла. А если в конце, то ждать можно долго.
для этого и задумывался параметр backparse. работает это так (не так как я вижу у вас в описаниях)

если (номер_строки_для_отображения - номер_последней_нераскрашенной_строки > backparse )
то не разбираем файл, не красим сейчас. оставляем для фона.
иначе пытаемся разобрать все до номер_строки_для_отображения

что мы имеем, если файл 1000 строк, backparse 100.
1. файл открывается на первой странице, нам видны первые 25 строк.
при открытии мы будем красить вторым потоком до конца экрана, потом перейдем в фон. если строки длинные, то будет подвисание. т.к. событие раскраски срабатывает до того как отобразился текст
2. файл открывается на 10 странице, текущая строка 250 - последняя 275.
файл открывается сразу, т.к. во втором потоке срабатывает параметр backparse. текст мы видим. разбор идет фоном раз в N мск.
если мы через некоторое время нажмем клавиши, то очень вероятно , что backparse не будет уже работать и экран быстро раскрасится
3. файл открываем в самом конце
ситуация как в пункте 2, только ждать раскраски экране дольше

если мы увеличиваем backparse до 500
1. не изменится
2. ждать дольше
3. ждать меньше

если мы увеличиваем backparse до 2000
1. не изменится
2. не изменится относительно предыдущего теста. но на строках после 500 будет медленнее
3. ждать дольше. будет медленнее работать

если мы уменьшаем backparse в плоть до 0
1. не изменится
2. будет быстрее разбираться, но открытие файла дольше. разбираем сразу 250 строк
3. будет быстрее разбраться, но открытие файла дольше. разбираем сразу 1000 строк

получается, скорость разбора зависит от того, где в файле мы находимся и значения backparse.

касательно примеров кода выше. Если мы увеличим число строк для разбора за один раз, то это негативно скажется на скорости реакции фара при изменении текста.Мы ведь в редакторе, и это критично. Но мы точно можем отказаться от постепенного наращивания idleCount++ , сделав его константой. Т.к. сейчас функция вызывается через известные равные таймауты.

кстати, для длинных строк не забываем про maxlinelength. надо будет его уменьшить по умолчанию до 500. будет легче.

как итог, получается надо обеспечить
а. быстрое открытие файла, пусть и не раскрашенного
б. учет положения в файле при работе с backparse

kobri
Posts: 15
Joined: Fri 15 Nov, 2013 14:42
Been thanked: 1 time

Colorer — гибкая раскраска синтаксиса в редакторе и др.

Post by kobri » Fri 25 Jan, 2019 19:35

Я когда-то уже предлагал другой вариант решения проблемы медленной раскраски - можно в самом колорере проверять, с помощью GetNumberOfConsoleInputEvents, активен ли в данный момент пользователь, и просто не отдавать управление фару пока нет никаких событий консоли. Тогда и настроек никаких не понадобится и раскраска будет идти на максимально возможной скорости, пока пользователь ничего не делает.

Post Reply

Return to “Обсуждение плагинов”