PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование на PureBasic » Плаги Notepad++


Плаги Notepad++

Сообщений 1 страница 6 из 6

1

Сделал плаг Help, тот же что для AkelPad, но для Notepad++.

Обновил плаг TextA, вместо StringField() использовал SplitL(), которая быстрее работает, но заметно на 3000 строк, старая 1 сек, новая, по ощущениям четверть секунды.

Highlight, AutoCompletion, Change, DB_RegExp.

выложил на upload.ee, так как на яндексе, почему-то скачивалась старая не работающая версия, может случайные глюки у яндекс.

Отредактировано AZJIO (17.07.2021 18:52:23)

0

2

Бывает провайдер кеш выдаёт. С женой часто сталкивались правишь на сайте PHP все изменения сразу видны, правишь CSS и от 5 минут до часа иногда ждать приходится прежде чем изменения у нас отобразятся. При том что не то что кеш браузера скинешь, а вообще заходишь с другого компа который по тому адресу никогда не был. При том что человек с другой страны пишет что у него поменялось, вот и думаешь как тут работать.

0

3

Восстановил ещё два плага: AutoCompletion, Change. Столкнулся с тем, что структура SCNotification (встроенная в PureBasic для scintilla) не работает в x64 соорудил тестовый вывод и поэкспериментировал с шириной, добился чтобы плаг заработал, выводил в соответствующих полях нужные числа (ширина вставляемого текста, номер строки и т.д.). Может стоит сообщить о проблеме?
И обновил плаг Help, вырезав обращение к scintilla, экспорт её функции, теперь слово не нужно выделять, достаточно поставить курсор на него.

0

4

AZJIO написал(а):

Столкнулся с тем, что структура SCNotification (встроенная в PureBasic для scintilla) не работает в x64

Вероятно в новых версиях Scintilla были внесены изменения в структуру.

Код:
struct Sci_NotifyHeader {   // This matches the Win32 NMHDR structure
    void *hwndFrom;     // environment specific window handle/pointer
    uptr_t idFrom;        // CtrlID of the window issuing the notification
    unsigned int code;  // The SCN_* notification code
};

struct SCNotification {
	struct Sci_NotifyHeader nmhdr;
	Sci_Position position;
	/* SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_MARGINCLICK, */
	/* SCN_MARGINRIGHTCLICK, SCN_NEEDSHOWN, SCN_DWELLSTART, SCN_DWELLEND, */
	/* SCN_CALLTIPCLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, */
	/* SCN_HOTSPOTRELEASECLICK, SCN_INDICATORCLICK, SCN_INDICATORRELEASE, */
	/* SCN_USERLISTSELECTION, SCN_AUTOCSELECTION, SCN_AUTOCSELECTIONCHANGE */

	int ch;
	/* SCN_CHARADDED, SCN_KEY, SCN_AUTOCCOMPLETE, SCN_AUTOCSELECTION, */
	/* SCN_USERLISTSELECTION */
	int modifiers;
	/* SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, */
	/* SCN_HOTSPOTRELEASECLICK, SCN_INDICATORCLICK, SCN_INDICATORRELEASE, */

	int modificationType;	/* SCN_MODIFIED */
	const char *text;
	/* SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION, SCN_URIDROPPED, */
	/* SCN_AUTOCSELECTIONCHANGE */

	Sci_Position length;    /* SCN_MODIFIED */
	Sci_Position linesAdded;	/* SCN_MODIFIED */
	int message;	/* SCN_MACRORECORD */
	uptr_t wParam;	/* SCN_MACRORECORD */
	sptr_t lParam;	/* SCN_MACRORECORD */
	Sci_Position line;    /* SCN_MODIFIED */
	int foldLevelNow;	/* SCN_MODIFIED */
	int foldLevelPrev;	/* SCN_MODIFIED */
	int margin;    /* SCN_MARGINCLICK, SCN_MARGINRIGHTCLICK */
	int listType;	/* SCN_USERLISTSELECTION, SCN_AUTOCSELECTIONCHANGE */
	int x;    	/* SCN_DWELLSTART, SCN_DWELLEND */
	int y;    /* SCN_DWELLSTART, SCN_DWELLEND */
	int token;    /* SCN_MODIFIED with SC_MOD_CONTAINER */
	int annotationLinesAdded;	/* SCN_MODIFIED with SC_MOD_CHANGEANNOTATION */
	int updated;	/* SCN_UPDATEUI */
	int listCompletionMethod;
	/* SCN_AUTOCSELECTION, SCN_AUTOCCOMPLETED, SCN_USERLISTSELECTION */
	int characterSource;	/* SCN_CHARADDED */
};

0

5

Ввиду того, что для "Grub2-generator" использовал Scintilla с подсветкой кода в реальном времени, решил попробовать написать плаг для Notepad++. Скачать: yandex upload.ee.
Сделано: при вводе текста подсвечивается только строка, в которой происходит набор текста. При вставке подсвечивается вставляемый текст. При смене вкладки подсвечивается видимый текст, а невидимый в фоне запуском вторым потоком, чтобы не мешать набирать текст. Сначала при быстрой смене вкладок у меня упал Notepad++, понятно что второй поток не окончил обработку, а калбак вызывает эту же функцию повторно. Нашёл мьютекст для блокировки потока, вроде исключило падение, но опять же при быстрой смене вкладки, когда обрабатывается предыдущая вкладка, то это переходит на текущую. То есть надо как-то сделать, чтобы повторный вызов фонового потока не блокировал, а прерывал, не давая докончить.
Для теста можно взять длинный текст grub.cfg (больше 1000 строк) и менять вкладки на html-файл например, туда-сюда и после cfg на html - спровоцирует подсветку html как cfg. Понятно что между каждым регвыр надо добавить проверку смены вкладки в виде флага 0/1, чтобы и не нагружать проц и прерывание было мгновенно, не дав ни одной функции подсветить что-то. А идеале прервать функцию.

Отредактировано AZJIO (02.11.2021 14:57:20)

0

6

В общем решил сделать внешние настройки, не пойму почему тормозить стало. Решил сделать регвыр PureBasic, то есть получить позиции найденного средствами PureBasic и подсветить по позициям, в общем несколько часов уже топчусь на одном месте

Код:
LenTxtSci = ScintillaSendMessage(*sciptr, #SCI_GETLENGTH) ; получает длину текста в байтах
OutputDebugString_("LenTxtSci = " + Str(LenTxtSci)) ; = 0  ???

этот код возвращает 0 длину текста и ничего не могу поделать. Чтобы не быть голословным, вот код
Уже всё перепроверил 100 раз, *sciptr валидный, константа SCI_GETLENGTH возвращает длину текста, при смене вкладки меняет. Самое интересное html файл подсвечивает, хотя не должен, даже когда делаю его игнор, а cfg нет.

Разгадал, вызовы разные одни для гаджета, другие для плага ScintillaMsg и ScintillaSendMessage, копируя из другого кода забыл это поправить.
Но новые подводные камни: там где русский текст происходит сдвиг сильный подсветки (разная ширина букв), думаю проблема что функции подсветки считают позиции в байтах, а рег.выр. в символах.

Отредактировано AZJIO (03.11.2021 13:54:04)

0


Вы здесь » PureBasic - форум » Программирование на PureBasic » Плаги Notepad++