Форум » [x]Harbour » Hbedit - текстовый редактор » Ответить

Hbedit - текстовый редактор

alkresin: Довел, наконец, свой текстовый редактор до того состояния, когда можно показать его общественности. Я начал писать его сначала как замену Memoedit(), но потом увлекся) и решил сделать что-то помощнее, как нормальный редактор для повседневного использования. Мне приходится в течение дня работать и под виндами, и под Линуксом - использую Far и mc, соответственно. Иногда Vim - но к некоторым вещам в нем так и не привык. Но хочется иметь что-то одно для всех платформ - не слишком навороченный, но чтоб было все что надо. Сегодня выложил на github: https://github.com/alkresin/hbedit. F9 (или мышкой по соответствующей надписи) - главное меню. В ближайших планах: - Lower/Upper для utf8 - новые режимы подсветки ( директивы препроцессора и пр. ) - скобки - подсветка парных и переход на парные - undo - решить проблемы с табуляцие - сохранение истории открытых файлов, поиска - написать help (hbedit.help) Если есть идеи для реализации - буду рад услышать.

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

alkresin: Есть еще кодоблок :bNew - это CLASS VAR, отрабатывает при открытии каждого файла. Можно (и лучше) устанавливать bonkey и bWriteTopPane там.

SergKis: alkresin пишет Есть еще кодоблок :bNew - это CLASS VAR, отрабатывает при открытии каждого файла. Можно (и лучше) устанавливать bonkey и bWriteTopPane там. Это верно для 2го oEdi и далееt, для первого bNew не установить, т.к. выполняется он в :New(...) и больше нигде. Если выделить установки и расчет координат в др. метод, к примеру :Def(), то тогда да oE :=TEdit():New(...) oE:bOnKey := ... oE:bWriteTopPane := ... oE:lTopPane := .F. oE:Def()

alkresin: SergKis пишет: Это верно для 2го oEdi и далееt, для первого bNew не установить, Почему? Это же CLASS VAR, я специально отметил. Просто пишете до появления первых объектов редактора: TEdit():bNew := ...


SergKis: alkresin пишет Просто пишете до появления первых объектов редактора Спасибо, почти все получилось[pre2] DATA lTopPane INIT .T. hbedit.prg ... TEdit():bNew := {|oe| oe:lTopPane := .F., ; oe:bOnKey := {|o,n| EdOnKey(o, n) }, ; oe:bWriteTopPane := {|o,n| StBline(o, n) } } nScreenH -= 1 FOR i := 1 TO Len( aFiles ) TEdit():New( Iif(!Empty(aFiles),Memoread(aFiles),""), aFiles, 0, 0, nScreenH-1, nScreenW-1, , .F. ) IF lRO ATail(TEdit():aWindows):lReadOnly := .T. ENDIF NEXT IF Empty( TEdit():aWindows ) TEdit():New( "", "", 0, 0, nScreenH-1, nScreenW-1, , .F. ) IF lRO ATail(TEdit():aWindows):lReadOnly := .T. ENDIF ENDIF ... [/pre2] Загруженные сразу при запуске hbedit.exe 3и файла перемещение курсора вверх\вниз - все ok New file + добавляем строки, перемещение курсора вверх\вниз до 1ой строки, т.е курсор во 2ой Open file перемещение курсора вверх\вниз до 1ой строки, т.е курсор во 2ой Ctrl+TAB на загруженные при старте,New file + добавляем строки, перемещение курсора вверх\вниз - все ok Ставлю DATA lTopPane INIT .F. Все ok во всех режимах выше

SergKis: PS читать Ctrl+TAB на загруженные при старте,New file + добавляем строки, перемещение курсора вверх\вниз - все ok

SergKis: PPS сделал так [pre2] TEdit():bNew := {|oe| oe:lTopPane := .F., oe:y2 := MaxRow()-1, oe:y1 := 0, ; oe:bOnKey := {|o,n| EdOnKey(o, n) }, ; oe:bWriteTopPane := {|o,n| StBline(o, n) } } [/pre2] his удалил. На сразу загруженных файлах - все ok. New file, Open file ставят курсор во 2ую строку, причем New file при стрелке вверх ставит в 1ю строку курсор и больше не перемещается - строка 1, позиция 1

alkresin: Обновлен hbedit. Реализована поддержка табуляции. Оптимизирован движок подсветки. Кое-что исправлено.

SergKis: alkresin 1. Заменяю на "свои" окна (из MiniGui.lib подошло подключением) [pre2] FUNCTION edi_Alert( cText, cAns1, cAns2, cAns3 ) LOCAL aText := hb_aTokens( cText, ";" ), i LOCAL aGets := { {,,2," Ok ",4,"W+/R","W+/B",{||__KeyBoard(Chr(K_ENTER))}} } LOCAL nLen := 0, nBtnsLen := 6, cp, x1, y1 := 10, oldc, bufsc * =================================================================== cText := '' ; AEval(aText, {|ct,ni| cText += ct + ; iif( Len(aText) == ni, "", chr(13)+chr(10) ) }) If ! empty(cAns3) cp := 'Information' If Len( aText ) > 1 cp := ATail(aText) Else If ( i := RAt( '.', cText ) ) > 0 cp := Alltrim(subs(cText, i + 1)) EndIf EndIf If '?' $ cp; cp := StrTran(cp, '?', '') EndIf i := MsgYesNoCancel( cText, cp ) ElseIf ! empty(cAns2) cp := 'Information' If Len( aText ) > 1 cp := ATail(aText) Else If ( i := RAt( '.', cText ) ) > 0 cp := Alltrim(subs(cText, i + 1)) EndIf EndIf If '?' $ cp; cp := StrTran(cp, '?', '') EndIf i := MsgYesNo( cText, cp ) ElseIf ! empty(cAns1) If cAns1 == 'Quit' MsgBox( cText, "Error" + ". " + cAns1 ) Else MsgBox( cText, cAns1 ) EndIf Else MsgInfo( cText ) EndIf If i != Nil; i += 1 EndIf RETURN i * =================================================================== FOR i := 1 TO Len( aText ) nLen := Max( nLen, Len( aText[ i ] ) ) NEXT nLen += 4 ... [/pre2] Можно ли в этом месте поставить переменную с блоком кода, если задана, то выполнять блок кода из переменной, иначе код функции ? Что бы не лазить для правки каждый раз в текст edi_Alert() 2. Загружаю текст prg hbedit.exe fedit.prg , курсор на строке, к примеру 2153[pre2] RETURN Nil FUNCTION mnu_F3( oEdit ) [/pre2] между RETURN Nil и FUNCTION ... на пустой строке Смещаем курсор вправо стрелкой на n позиций, т.е. Col > 1 Делаем Backspace, строка пустая пропадает и имеем[pre2] RETURN Nil FUNCTION mnu_F3( oEdit )[/pre2] Это не правильно.

SergKis: PS К пункту 1. Хотел edi_Alert() перевести на #translate, но т.к. нет файла hbedit.ch с #include "hbedit.ch" в каждом *.prg, а заводить свой, это править все файлы prg, что по мне, хуже, то предложил переменную с блоком кода.

alkresin: SergKis пишет: Можно ли в этом месте поставить переменную с блоком кода, если задана, то выполнять блок кода из переменной Не понял. А откуда предполагается брать кодоблок, как он будет задан?

alkresin: Обновил hbedit. Расширена поддержка макросов (см. help). Всякие мелкие правки.

SergKis: alkresin пишет Не понял. А откуда предполагается брать кодоблок, как он будет задан? К примеру так[pre2] FUNCTION edi_Alert( cText, cAns1, cAns2, cAns3 ) ... STATIC b_Alert IF Valtype(cText) == 'B' b_Alert := cText RETURN Nil ENDIF IF empty( b_Alert ) ... как сейчас ELSE i := EVal( b_Alert, cText, cAns1, cAns2, cAns3 ) ENDIF RETURN i тогда в своем prg делаю установку блока и происходит подмена кода выполнения. Хорошо бы в oEdit добавить пару переменных CLASS VAR ... для блоков кода подмены запроса Open file и Save as ... Т.к. используем (у себя в работе) в gtwvt windows варианты запросов. Конечно и для окон запроса Search и Search&Replace такой механизм не помешал бы, но пока не так актуально. [/pre2]

SergKis: PS И совсем замечательно, если в oEdit добавить установку своего HB_GTI_PALETTE для каждого экземпляра окна. К примеру через блок кода CLASS VAR ... и вызовом его при смене\установки окна редактирования. Можно отработать разноцветность режимов, как минимум

alkresin: SergKis пишет: К примеру так Лучше я просто выделю edi_Alert() в отдельный файл. Хорошо бы в oEdit добавить пару переменных CLASS VAR ... для блоков кода подмены запроса Open file и Save as ... Вы же их все-равно вызываете из своего меню. Так вызывайте свои процедуры вместо них. И совсем замечательно, если в oEdit добавить установку своего HB_GTI_PALETTE для каждого экземпляра окна. Это вы можете сделать в кодоблоке bStartEdit, который вызывается каждый раз при вызове :Edit().

SergKis: alkresin пишет Лучше я просто выделю edi_Alert() в отдельный файл. Очень хорошо. Так вызывайте свои процедуры вместо них. Так и буду делать Это вы можете сделать в кодоблоке bStartEdit Увидел, что есть bStartEdit и bEndEdit - замечательно

SergKis: alkresin Запуск hbedit.exe New file Ставлю кодировку Utf8 что то набираю Save as ... Esc смотрим файл в Far F3, F4 -> у файла нет BOM Наверно, нужна галочка\пункт меню, сохранять с BOM или нет.

alkresin: SergKis пишет: Наверно, нужна галочка\пункт меню, сохранять с BOM или нет. Согласен, надо будет добавить в диалог по Save as. Плюс eol и, может быть, кодовую страницу.

SergKis: alkresin пишет и, может быть, кодовую страницу. Желательно, иметь режим, сменить кодировку текста, к примеру, RU866 -> Utf8 и т.д.

alkresin: Ну, кодировка менятся просто как и в Far'е: Выделяем все (Ctrl-A), вырезаем, меняем кодировку и вставляем.

SergKis: alkresin пишет Выделяем все (Ctrl-A), вырезаем, меняем кодировку и вставляем. Не самый удобный механизм. В Notepad3.exe есть режим переоткрыть в кодировке, кл. F8 (меню есть) -> табличка кодировок. Т.е. в файле Utf8, в работе RU1251, или RU866, или LV866. Просто и удобно



полная версия страницы