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

Hbedit - текстовый редактор (продолжение)

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

Ответов - 215, стр: 1 2 3 4 5 6 7 8 9 10 11 All

SergKis: alkresin Можно вызов меню выбора кодовых страниц, сделать на клавиши и комбинацию их задавать в ini ?

SergKis: alkresin В параметры командной строки можно добавить кодовую страницу для файла (из списка ini указанные)

SergKis: alkresin Добавил в параметры командной строки (своя сборка) -cp=<кодовая страница> -his=<режим savehis = 0> Это понадобилось при подключении hbedit в проектах вместо Akelpad, дополнительно к Far Alt+F4 режиму. Возможно, похожее надо в вашей сборке hbedit.exe ? К примеру, когда prg файлы в кодировках RU866, RU1251, Utf8


SergKis: PS Far Alt+F4 режим работает с savehis=1 и cp=RU1251, а запуски из проекта savehis=0 и cp=LV866, при этом prg Utf8 с bom отлично понимаются.

SergKis: alkresin Можно ли уст. palette из параметра командной строки ? Например в ini palette=solarized light из командной строки поставить far или notepad

alkresin: SergKis пишет: отсутствие каталога мешает нормальной работе hbedit в др. кусках кода Отсутствие каталога plugins/ мешает только работе плагинов. В обсуждаемом случае это вызов плагина по горячей клавише. Можно вызов меню выбора кодовых страниц, сделать на клавиши и комбинацию их задавать в ini ? Так ведь Shift-F8 для этого предназначен - в help'е и на сайте про это написано. Ну а комбинацию эту можно переназначить в ini, если надо.

SergKis: alkresin пишет Так ведь Shift-F8 для этого предназначен - в help'е и на сайте про это написано Пропустил, не увидел. Все работает. Спасибо.Отсутствие каталога plugins/ мешает только работе плагинов Понятно

alkresin: По поводу добавления новых параметров командной строки: сделать-то можно, но, по моему, более универсальным решением было бы просто указать в командной строке другой ini - так можно задать любую комбинацию нужных параметров.

SergKis: alkresin пишет По поводу добавления новых параметров командной строки: сделать-то можно, но, по моему, более универсальным решением было бы просто указать в командной строке другой ini - так можно задать любую комбинацию нужных параметров. В проектах свои ini и в них все есть. Размножать доп. ini не очень хочется. Попробовал 2а каталога с hbedit и запуски в Far с одного, в проектах с другого. Уже не очень удобно, т.к. чувствую где то понадобится savehis=2. Смотрел на замену Palete, вроде, на уровне TEdit сложновато получается. Если не делать в вашей сборке (может кроме меня никому не нужно), то перекиньте FUNCTION edi_IniRead( cFileName ) в файл falert.prg. Буду делать подмену на этом уровне (разбор строк в секциях)

alkresin: Хорошо, добавлю. Смотрел на замену Palete, вроде, на уровне TEdit сложновато получается. Если не делать в вашей сборке (может кроме меня никому не нужно), то перекиньте FUNCTION edi_IniRead( cFileName ) в файл falert.prg. Я пока не вижу проблемы с объявлением в комадной строке palette (вы ведь об этом?). А вот edi_IniRead() нельзя - она пользуется статическими переменными.

SergKis: alkresin пишет edi_IniRead() нельзя - она пользуется статическими переменными. Нельзя edi_ReadIni( xIni ) из fedit.prg, edi_iniRead() из ffiles.prg там нет статик переменных

SergKis: PS Для Palette параметра начал набирать (не доделал пока) так, сам параметр -clr=0\1\2\3\4 по именам секций [PALETTE_0], ..., [PALETTE_4], что бы не привязываться к длинным именам Значение palette=far секции [OPTIONS] брать из name=... [PALETTE_?]

alkresin: Зачем так сложно-то? Добавил я три параметра (залил на github): -cp= -his= -pal=

SergKis: alkresin пишет Зачем так сложно-то? По мне, наоборот, просто. Не надо помнить длинные названия. Тут текст мой (сделал как у вас -pal=<только тут число>) [pre2] #include "hbgtinfo.ch" FUNCTION bkInit( cIniName, aParams ) Local cPath := hb_curDrive() + ":\" + Curdir() + '\' Local cName := hb_ProgName(), cTmp, cCP, nHis Local cExe := Lower(hb_fnameName(cName)) LOCAL cCapt := cExe LOCAL aPal := {}, cPal, nPal FOR nPal := 0 TO 9 cTmp := Lower( gIniC7(cIniName, [PALETTE_]+hb_ntos(nPal), 'Name', '') ) IF Empty(cTmp) EXIT ENDIF AAdd(aPal, cTmp) NEXT FOR EACH cTmp IN aParams IF Left( cTmp,4 ) == "-cp=" cCP := Upper( Substr( cTmp, 5 ) ) ELSEIF Left( cTmp,4 ) == "-his=" nHis := Val( Substr( cTmp, 6 ) ) IF nHis < 0 .OR. nHis > 2 nHis := Nil ENDIF ELSEIF Left( cTmp,5 ) == "-pal=" nPal := Val( Substr( cTmp, 6 ) ) + 1 IF nPal > 0 nPal := iif( nPal > Len(aPal), Len(aPal), nPal ) cPal := aPal[ nPal ] ENDIF ENDIF NEXT IF !Empty(cCP) hb_cdpSelect( cCP ) ENDIF IF nHis != NIL TEdit():options["savehis"] := nHis ENDIF IF !Empty(cPal) TEdit():cDefPal := cPal ENDIF cTmp := Lower(gIniC7(cIniName, [OPTIONS], 'PathInHead', 'off')) If 'off' $ cTmp cCapt := cPath + Repl(' .', 3) + space(1) + '-' + space(1) + cExe EndIf CLS ; hb_gtInfo( HB_GTI_WINTITLE, cCapt ) TEdit():bNew := {|oe| iif( oe:y1 == oe:aRectFull[1]+1, ( oe:lTopPane := .F., oe:y1-- ), ), ; oe:bWriteTopPane := {|o,l,y| StbLine(o,l,y) } } RETURN Nil [/pre2] Добавил я три параметра (залил на github): Спасибо, буду использовать.

SergKis: alkresin Нарушилась прорисовка разделения окна по Ctrl-w,s, Ctrl-w,v (вся клиентская область в работе edit) Добавка из пред. версии в METHOD WriteTopPane( lClear ) [pre2] METHOD WriteTopPane( lClear ) CLASS TEdit LOCAL y := ::y1 - 1, nCol := Col(), nRow := Row(), nF9 := 0 LOCAL cLen := Ltrim(Str(Len(::aText))), nchars := Len(cLen) IF ::oParent != Nil .AND. ::x1 == ::oParent:x2 + 2 Scroll( ::y1, ::x1-1, ::y2, ::x1-1 ) ENDIF If ::lTopPane DispBegin() SetColor( ::cColorPane ) Scroll( y, ::x1, y, ::x2 ) IF ::oParent != Nil .AND. ::x1 == ::oParent:x2 + 2 Scroll( ::y1, ::x1-1, ::y2, ::x1-1 ) ENDIF SetColor( ::cColor ) DevPos( nRow, nCol ) DispEnd() EndIf IF ::bWriteTopPane != Nil Eval( ::bWriteTopPane, Self, lClear, y ) ELSE IF ::lTopPane DispBegin() /* SetColor( ::cColorPane ) Scroll( y, ::x1, y, ::x2 ) */ IF Empty( lClear ) DevPos( y, ::x1 ) IF ::x2 - ::x1 > 54 DevOut( "F9-menu" ) DevPos( y, ::x1+8 ) nF9 := 8 ENDIF DevOut( Iif( hb_hGetDef(::options,"pathinhead",.F.), NameShortcut(::cFileName,::nTopName,'~'), ; cp_Left( ::lUtf8, hb_fnameNameExt(::cFileName), ::nTopName ) ) ) IF !Empty( cDopMode ) DevPos( y, ::x1 ) DevOut( Padr( cDopMode, 8 ) ) ENDIF DevPos( y, ::x1 + nF9 + ::nTopName + 2 ) DevOut( Iif( ::lUpdated, "* ", " " ) + Lower( ::cp ) ) DevPos( y, ::x1 + nF9 + ::nTopName + 12 ) DevOut( PAdl(Ltrim(Str(::nLine)),nchars) + "/" + cLen ) DevPos( y, ::x1 + nF9 + ::nTopName + 12 + nchars*2 + 3 ) DevOut( "[" + Ltrim(Str(::PosToCol()-::x1+::nxFirst)) + "]" ) SetColor( ::cColorWB ) DevPos( y, ::x2-3 ) IF ::lF3 .OR. (::nby1 >= 0 .AND. ::nby2 >= 0) DevOut( "Sele" ) ELSE DevOut( Iif( ::nMode == 0, Iif( ::lReadOnly, "View", "Edit" ), ; Iif( ::nMode == 1, " Vim", " Cmd" ) ) ) ENDIF ENDIF SetColor( ::cColor ) DevPos( nRow, nCol ) DispEnd() ENDIF ENDIF RETURN Nil [/pre2] восстановила прорисовку только горизонтальное разделения при вертикальном, прорисовка делается и убирается, видно мелькание

alkresin: Там просто вертикальный разделитель не прорисовывался . Поправил.

SergKis: alkresin пишет Там просто вертикальный разделитель не прорисовывался . Поправил. Вертикальный разделитель прорисовался, а горизонтальный нет, пропал Моих правок нет. :New такой и StbLine() - пустышка пока [pre2] TEdit():bNew := {|oe| iif( oe:y1 == oe:aRectFull[1]+1, ( oe:lTopPane := .F., oe:y1-- ), ), ; oe:bWriteTopPane := {|o,l,y| StbLine(o,l,y) } } [/pre2]

SergKis: PS добавил, вроде, стало прорисовывать как надо[pre2] SetColor( ::cColorPane ) IF ::lTopPane Scroll( y, ::x1, y, ::x2 ) ENDIF IF ::oParent != Nil .AND. ::x1 == ::oParent:x2 + 2 Scroll( ::y1, ::x1-1, ::y2, ::x1-1 ) ENDIF IF ::bWriteTopPane != Nil [/pre2]

alkresin: SergKis пишет: TEdit():bNew := {|oe| iif( oe:y1 == oe:aRectFull[1]+1, ( oe:lTopPane := .F., oe:y1-- ), ), ; oe:bWriteTopPane := {|o,l,y| StbLine(o,l,y) } } Вы берете прорисовку панели статуса на себя, но функция соответствующая у вас пустая... Вставьте в нее хотя бы [pre2]IF ::lTopPane Scroll( y, ::x1, y, ::x2 ) ENDIF[/pre2]

SergKis: alkresin пишет Вы берете прорисовку панели статуса на себя, но функция соответствующая у вас пустая... В функции будет вывод в windows StatusBar по item-ам, а прорисовка разделителей экрана (полос) - как бы свойство TEdit. Что выводить в StatusBar и сколько item-ов не определился пока, т.к. нет загрузок нескольких файлов (всегда 1) для работы и переключения между окнами по Ctrl+TAB (исп. только при разделении окна на части для работы в др. местах загруженного текста). Сейчас пробую вывод полного имени и cdp в Title окна - вроде неплохо Строки [pre2] IF ::lTopPane Scroll( y, ::x1, y, ::x2 ) [/pre2] повторяться будут и в блоке кода и без блока, потому вынес эти строки к вашим



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