PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » My_Notepad_Sci


My_Notepad_Sci

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

1

My_Notepad_Sci

Скачать: yandex.ru upload.ee).
Скриншоты: поиск, автозавершение, синтаксис, англ, регвыр
https://i.imgur.com/up9P8jn.png

устаревшее

Для изучения Scintilla решил сделать блокнот со стандартными функциями и даже больше, насколько запалу хватит.
в исходнике я добавил функционал поиска и замены, но компилировать не стал, так как понял что надо переделывать, замена увеличивает документ и надо перемещать границу или вообще я не той функцией воспользовался, ведь там есть "замена целевого", то есть не пошагово в цикле. В том числе в справке есть функции назад-вперёд, но они с C++ библиотекой (cxx11...), в общем сегодня уже времени нет. И я не понял как стандартные лексеры прикрутить языка С++ например. Хотя и есть примеры, но я пока не уверен, там нет #SCI_SETLEXER, а значит собственные теги используются.

И я в PB User.7z добавил 4 функции из Scintilla для пробы, с теми что разберусь и которые вызывают проблемы в понимании добавлю, так как справку переведённую гуглом долго приходится понимать.

Обновление (последние)

17.06.2023 v0.3.5
Исправление автозавершения при открытии 2-го файла с тем же расширением.

14.06.2023 v0.3.4
Добавлено переменная ${hSci}
Для Linux компилирование с gtk2 исключило проблему прокрутки.

13.06.2023 v0.3.3
Добавлено меню "Запуск"

09.06.2023 v0.3.2
Добавлена поддержка плагинов

Отредактировано AZJIO (19.06.2023 21:56:10)

0

2

Оказывается Scintilla.dll может быть скомпилирован с лексерами и функционалом SCFIND_CXX11REGEX, а может и без этого. Например в Notepad++ файл Scintilla.dll размером 1 Мб, а в PureBasic 372 кб. Попытка подменять Scintilla.dll другими файлами из других редакторов вызывает сбои.

Как я понял из справки SCI_FINDTEXT работает со структурой FINDTEXTEX, которая должна включать функционал SCFIND_CXX11REGEX, и также это будет поддерживать SCI_SEARCHPREV и SCI_SEARCHNEXT.

Выписал для себя правило поиска/замены (для переделки):
Понятие TARGET в функциях поиска и замены. TARGET это цель, то есть диапазнон. В данном случае "SEARCH IN TARGET" является вполне понятным, поиск внутри заданной цели, например от символа 5 до символа 105. А вот SCI_REPLACETARGET не содержит IN поэтому это не замена в диапазоне, а замена самого диапазона. Например SCI_SEARCHINTARGET вернул начало найденного, есть длина найденного из этого мы задаём цель для замены SCI_SETTARGETRANGE (SET TARGET RANGE). Но после замены надо учесть, что длина текста может увеличиться или уменьшиться, а значит нельзя пользоваться старым понятием конца цели. Также надо снова задать цель для поиска внутри этой цели, так как при замене цель заявлялась как найденный текст для замены, и надо вернуть цель - диапазон, в котором производился поиск, при этом начало цели это конец вставленного текста (так как поиск далее), а конец это сдвиг на величину, насколько вставленное больше искомого.
Для указания "SEARCH IN TARGET" используются SCI_SETTARGETSTART и SCI_SETTARGETEND, а для указания цели для замены используется SCI_SETTARGETRANGE. И это не взаимозаменяемо почему-то. Для каждого диапазона проверять какие функции подходят для этого.

Отредактировано AZJIO (20.11.2022 12:01:34)

0

3

Может пригодится? Ссылка

0

4

Обновление
Кто не следил на кибер-форуме, обновил всвязи с новыми идеями.

Кстати, скачав исходник IDE, чтобы поизучать как там сделано удалось скомпилировать и даже сделать некоторые правки

Отредактировано AZJIO (14.12.2022 10:00:39)

0

5

Сделал пример автозавершения, пока не уверен, что есть смысл внедрять, так как надо делать списки.

Из последнего обновления исправил установку шрифта и добавил подсветку регулярных выражений и css.

0

6

Добавил исходник с суффиксом "Тест" - это промежуточный вариант, уже работают вкладки, можно кидать файлы в окно программы. Сохранение точно не работает, остальные пункты меню по везению, если в них используется только ссылка на гаджет, то работают, иначе нет. Надо отдельный тип данных вводить, чтобы регвыр открывать не для каждого Pb-файла, а сделать связь между типом и текущим файлом, чтобы для однотипных загружать только один экземпляр регулярных выражений.
Надо делать закрытие по двойному клику на вкладке, тоже не работает.

Кстати, тестировал Notepad++ на скорость открытия файлов, например PureAutoIt.pb с 6500 строк Notepad++ открывает мгновенно, при этом я сразу пытаюсь прокрутить в конец файла и он весь подсвечен и не пытается препятствовать прокрутке, не зависает, ни других проблем. В PureBasic IDE этот же файл открывается 3 сек, немного быстрее, а может и также как в моём My_Notepad_Sci. Пытался разобрать способ подсветки в IDE, так и не понял, похоже какой-то сложный метод, который сам по себе тормозит открытие файла. Просто напрягает, когда открыто штук 20 файлов, он пол минуты как минимум открывает, недождёшся.

Отредактировано AZJIO (02.05.2023 05:13:36)

0

7

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

Просто напрягает, когда открыто штук 20 файлов, он пол минуты как минимум открывает, недождёшся.

Может оперативной памяти мало?

0

8

Пётр
Памяти 8 гиг, и Notepad++ в 2 раза больше файлов, стартует мгновенно. Может он как FF вкладки есть, но контент в них появляется в момент выбора вкладки. В каждой вкладке недавние планы и тесты, какие то используются для грабинга (грабли и грабить оказывается один корень), чтобы копировать готовые решения. AkelPad и Notepad++ ведь в равных условиях.

0

9

Обновление (только Windows)
Добавлена UTF16LE в меню "Кодировка".
При смене вкладки происходит переключение галки в меню "Кодировка" и "Синтаксис"
При отмене продолжения поиска теперь не выделяется текст.
Исправлено вставка текста при открытии файла.

Убрал кодовую страницу 866, оказывается это работает только в Linux. В документации Scintilla есть таблица с указанием какие кодовые страницы где и как работают, можно их добавить, чтобы переключать на иные кодировки, а по умолчанию и так включается определяемая системой. Там так и написано, если у вас (у англоязычных) в коде русские комментарии (которые отображаются неправильно), то включите соответствующую кодовую страницу.

Запуск по F5 легко добавить RunProgram(путь)
Ещё интересный момент казалось бы UTF16LE популярная, но в Notepad++ есть UTF16BE, при этом непонятно, действует ли это на уровне системы, скорее всего нет, так как во всех функциях не указана расширенная кодировка кроме 3-х, а вот WriteStringFormat() и ReadStringFormat() имеет расширенный набор, хотя там только начало файла прочитать, ничего сложного, поэтому добавлено до кучи, а что толку если функции чтения/записи не могут это задействовать. В любом случае эти кодировки как собаке 5-я нога.

0

10

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

Notepad++ в 2 раза больше файлов, стартует мгновенно.

Он только синтаксис подсвечивает.
PB IDE кроме этого анализирует код для составления списков автодополнения, процедур, переменных и т. д.

0

11

Пётр написал(а):

Он только синтаксис подсвечивает.
PB IDE кроме этого анализирует код для составления списков автодополнения, процедур, переменных и т. д.

Разве Notepad++ не поддерживает автозавершение? Ещё как поддерживает, для всех языков. Разве что PB IDE умнее подходит к структурам, показывая элементы, но опять же это в ходе ввода, а не при старте. И если при запуске кода переменные показывают свои значения в подсказках, тоже  вопрос, когда PB IDE анализирует переменные, чтобы в нужный момент присвоить значения подсказки.

Отредактировано AZJIO (08.05.2023 17:33:20)

0

12

Обновление
Добавил автозавершение, но пока с привязкой к конкретному расширению, например pb, а не к группе pb, pbf, pbi. Видимо придётся вводить имя языка и группировать расширения, по другому не получится.

Подсветка выделенного слова по тексту только если слово целое и кроме самого выделяемого.
Добавлена подсветка bbcode, xml

Отредактировано AZJIO (13.05.2023 18:28:35)

0

13

Обновление
Добавлено "Переименовать файл" в контекстное меню.
Ширина табуляции 4, а при вставке фрагмента добавляются отступы.
При отмене у нового файла пропадало имя вкладки.

0

14

Пётр
Я в архив добавил исходник с тестом плагинов от Notepad++. Закинул два своих плагина в папку Plugins\Highlight\Highlight.dll, то есть я решил сделать совместимость с плагинами Notepad++, так как у меня 5 плагов уже написаны, так зачем мне что-то менять. Меню я уже разгадал как добавить, то есть оно уже появляется в проге если добавить плаги, там же я создаю массив указателей, где пункт меню является индексом массива чтобы вызвать функцию по указателю. Проблема на данный момент получить дескрипторы окна и Scintilla. Во первых я не пойму, почему для х86 передаётся через 3 параметра, а в х64 как структура. Вот вторых там прототип. На минутку опустим это, задача получить активный элемент Scintilla в плаг.
В плаге функция

Код:
Procedure GetCurrentScintilla()
	Protected instance_sci
	SendMessage_(NppData\_nppHandle, #NPPM_GETCURRENTSCINTILLA, 0, @instance_sci)
	If instance_sci
    ProcedureReturn NppData\_scintillaSecondHandle
	Else
    ProcedureReturn NppData\_scintillaMainHandle
	EndIf
EndProcedure

и

Код:
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86

	ProcedureCDLL setInfo(*NppHandle, *ScintillaMainHandle, *ScintillaSecondHandle)
    ; Здесь мы заполняем элементы нашей структуры NppData, то есть получаем от NPP дескприторы NPP, Scintilla1, Scintilla2
    NppData\_nppHandle = *NppHandle
    NppData\_scintillaMainHandle = *ScintillaMainHandle
    NppData\_scintillaSecondHandle = *ScintillaSecondHandle

    ; получаем указатель на функцию Scintilla_DirectFunction
    Scintilla = SendMessage_(NppData\_scintillaMainHandle, #SCI_GETDIRECTFUNCTION, 0, 0)
    ; << Когда инфа Notepad++ изменилась >>
    ; Ваш код здесь

	EndProcedure

CompilerElse ; иначе для x64

	ProcedureCDLL setInfo(*Npp.NppData)

    CopyStructure(*Npp, NppData, NppData) ; копируем структуру переданную из NPP в нашу
    
    Scintilla = SendMessage_(NppData\_scintillaMainHandle, #SCI_GETDIRECTFUNCTION, 0, 0)
    ; << Когда инфа Notepad++ изменилась >>
    ; Ваш код здесь
	EndProcedure

CompilerEndIf

То есть моя задача при первом запуске вызвать setInfo() в dll и передать указатели, на данный момент важен указатель на дескриптор окна, плаг его получит и потом если ему надо получить текущий дескриптор он отправляет SendMessage_(), чтобы заставить программу вызвать функцию setInfo() и тем самым передать через неё текущий дескриптор. Пока обдумываю, как это должно работать. Может есть идеи. Пока непонятно как принять событие SendMessage_(). Кстати, если в проге с плагами нажать кнопку, так что плагу придётся обратится к Scintilla, то всё повиснет, а в остальном окно плага открывается, даже удивительно что удалось это проделать.

В Callback есть событие If Message = #WM_COPYDATA срабатывающее на

Код:
SendMessage_(TargetWnd, #WM_COPYDATA, WindowID(0), @copydata)

из этого вывод, я должен аналогичным образом? То есть я добавляю в Callback

Код:
	If Message = 2028
    Debug 1
    ; NppData\_nppHandle = WindowID(#Window)
    NppData\_scintillaMainHandle = SciGadget
    NppData\_scintillaSecondHandle = SciGadget
    ForEach LDirName()
    	CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
        CallFunction(LDirName()\id, "setInfo", @NppData\_nppHandle, @NppData\_scintillaMainHandle, @NppData\_scintillaSecondHandle)
    	CompilerElse ; 64
        CallFunction(LDirName()\id, "setInfo", @NppData)
    	CompilerEndIf
    Next
	EndIf

но пока не работает. Здесь 2028 это #NPPM_GETCURRENTSCINTILLA, далее вставляю текущий SciGadget в структуру и вызываю setInfo, чтобы обновить их в плаге. Но так как неизвестно какой плаг запросил обновление активного SciGadget, то я в цикле перечисляю все плаги, отправляю всем setInfo.

Отредактировано AZJIO (20.05.2023 18:06:28)

0

15

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

Проблема на данный момент получить дескрипторы окна и Scintilla. Во первых я не пойму, почему для х86 передаётся через 3 параметра, а в х64 как структура.

Несколько помню в x86 структура передается по значению, что эквивалентно 3 параметрам.
В x64 структура передается по указателю.

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

Пока непонятно как принять событие SendMessage_().

Его нужно принимать в Callback функции окна, дескриптор которого использован в SendMessage_().

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

но пока не работает.

А если так?

Код:
CallCFunction(LDirName()\id, "setInfo", NppData\_nppHandle, NppData\_scintillaMainHandle, NppData\_scintillaSecondHandle)

0

16

Добавил поддержку плагинов в Linux. В комплекте один плагин (в папке конфигов).
Ошибка при закрытии библиотеки "so" была связана с MessageRequester(), потом выяснилось, что и с GetClipboardText(), а ещё позже что и с оконной процедурой, в общем любая вещь, которая создаёт окно. Видимо библиотека в Linux не дружит с окнами.

0

17

Добавлено меню "Запуск" для Windows. Для примера 3 инструмента в комплекте.

0

18

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

Видимо библиотека в Linux не дружит с окнами.

В Linux окна не такие как в Windows.
Можно попробовать подсистемы GTK2, GTK3 или QT. Может с какой-то из них получится подружить so с окнами.

0

19

Пётр
А может Фред что-то недоделал? По факту окна работают и события, проблема только при выгрузке "so". Надо погуглить и если что отрапортовать.

Вот нагуглил
https://habr.com/ru/articles/534466/

Но почему-то при завершении работы программы при вызове FreeLibrary для всех плагинов происходила выдача исключения.

искал "библиотеки Linux в формате "so" поддерживают окна?"

Отредактировано AZJIO (13.06.2023 09:16:43)

0

20

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

А может Фред что-то недоделал?

Может и так.
Нужно на официальном форуме написать. Если баг, может исправят.

0

21

меню "Запуск" теперь и для Linux. Один исходник на обе ОС и исходник мультиязычный.

0

22

Избавился от проблемы прокрутки на Linux, скомпилировав с gtk2.

0

23

о! скриншот классный :) хочу что-то подобное... задумал сделать что-то типа того, что делает Ida с ромами на сегу мегадрайв (генезиз) - типа ром в код ассемблера переводит. вот думаю было бы классно редактор для этого самого кода бахнуть. еще было бы круче сделать переводчик из этого сраного непонятного асма в PB, чтобы понимать чо там происходит :) сейчас смотрю на то что получается на выходе - всякая вакханалия творится :) move a1, d2... и тому подобное. толи дело в PB - If, Else, Endif, For, Procedure - все понятно... а в этом асме... тьфу. гадость.

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

значится вопросы на текущий момент:
1. полоска раздражающая горизонтальная. на вертикальную я еще согласен :) причем хотелось бы её заранее насильно отображать.
2. возможно ли там сделать что-то типа екселя? мне на три колонки надо разбить - нумерация строк (вроде она есть в сурсах), зона меток, и сам код.
3. при нажатии ентера можно ли новую строку начинать с той-же позиции, что и предыдущая строка начинается, добавляя пробелы или табуляции?
4. почему не работает кнопка таб?

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

Отредактировано SeregaZ (15.06.2023 17:44:52)

0

24

справка Scintilla на русском
горизонтальную прокрутку можно отключить - SCI_SETHSCROLLBAR

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

Отредактировано AZJIO (15.06.2023 18:11:48)

0

25

так это готовое приложение. мне свое надо. блекджеки не нужны :) нужны минимальные возможности редактирования текста. с канвасом связываться вааааще не охота. но там зато все понимаю. здесь же эта синтрила вещь незнакомая, но зато куча базовых вещей, что мне нужны - там изначально есть, как уже упомянул нумерация, ввод текста и редактирование, копирование, вставка... красота! на первом этапе надо понять как включать нумерацию и можно ли добавить вторую колонку, как в екселе.

0

26

SeregaZ
PBEdit - a Canvas-based Texteditor - готовый на канвасе, его использует ChrisR в своём IceDesign.

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

блекджеки не нужны

мне с трудом приходится разгадывать твой сленг, я не картёжник и не хожу в казлиноазино. Типа прога-комбайн, крутой и блестящий? AkelPad можешь взять с такой минималкой, то он будет выглядеть как блокнот Windows. Так что его минималка определяется тобой. Тебе нужен всё-таки блокнот или код блокнота, чтобы вставить туда свои навороты, которые невозможно вставить в иной редактор? Просто то что ты описал подходит под описание любого из крутых редакторов, кроме конечно екселя. Не надо сравнивать текстовый редактор и табличный, это даже рядом не стояло по одинаковости, кроме текста, которые обои могут поддерживать. Вторая колонка там может вставлена не как ячейка, а только как текстовый разрыв, у меня даже в плаге есть возможность сделать слияние двух списков, как двух колонок, как это делалось мной раньше в ексель, но теперь я могу сделать это без сторонней двутысячерублёвой проги.

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

и можно ли добавить вторую колонку

нумерация строк это служебная колонка. Scintilla позволяет добавить колонку описания/комментария любой ширины, но как она будет связана с текстом и как к ней будет осуществляться доступ это уже тебе разбираться, так как я не использовал Scintilla не по назначению, возможно разберёшься и это будет считаться "по назначению".

0

27

Обновление для Windows (для Linux позже перекомпилирую)
Исправление: при открытии файла с одинаковым расширением не применялись настройки автозавершения.

0

28

Добавил исходник My_Notepad_Sci_TabBar.pb с крутыми вкладками TabBarGadget.pbi, но пока не создаётся объект Scintilla при создании 2-й и последующих вкладок. Разгадать не удалось. В демоверсии показан пример, где гаджеты созданы в контейнере, может мне тоже контейнер нужен, пока не понимаю.

0

29

Для PB тоже обещана большая правка в linux
https://forums.spiderbasic.com/viewtopi … 9415#p9415

0

30

Перезалил на яндексе, ради пробы исходника с новыми вкладками. Выдалось время проверить работу с контейнером и на удивление заработало. Конечно надо переделать все функции, так как используется функция HideGadget() для скрытия одного и показа другого. Просто эти вкладки имеют возможности уж точно не хуже чем в Notepad++, и кнопка-крестик закрытия и конт.меню, и многостроковое расположение вкладок, которое я обычно использую, и перетаскивание вкладок. А также в теме в конце были примеры чёрной темы взяв цвета системы.
Тестовая компиляция.

useful
да, я тоже это читал, и как только автор пообещал, тут же всплыли ошибка с рег.выр. и понимаешь что будет следующая версия без откладываний, потому что ошибку я бы назвал критической, я бы не хотел пользоваться такой версией, так как регвыр для меня имеет высокий приоритет. Ещё на пару месяцев откладывание. А mk-soft  подтвердил ошибку GTK3 в IDE, о которой я сообщил при проблеме со Scintilla. Так что не будем задерживать дыхания.

Отредактировано AZJIO (30.06.2023 21:27:14)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » My_Notepad_Sci