Форум » [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: Ну тогда надо вернуть простые и все должно работать.

SergKis: alkresin пишет Ну тогда надо вернуть простые и все должно работать. Работают, вызывают окна при выборе пункта меню (это все через расширенные коды) [pre2] wvt_AppendMenu( hMnu1, "Open file " + c9 + "Ctrl+F4", K_CTRL_F4 ) wvt_AppendMenu( hMnu1, "Find " + c9 + "Ctrl+F7", K_CTRL_F7 ) Не работают F11, Shift+F8, Shift+F2 [/pre2]

alkresin: Ну а что получает bOnKey, если отбросить мышиные события?


SergKis: [pre2] bBlk := {|o,n| ToLog(.T., 'nKey =', n, hb_keyStd(n)) Return 0 } результат по нажатиям клавиш в лог ========================= это по нажатию клавиш F4, Esc, F9, Esc, Esc - выход nKey = 1103 1103 nKey = 1157632003 1001 nKey = 1090519044 -3 nKey = 1090519049 -8 nKey = 1090519065 27 n (первая колонка после nKey =) приходит в расширенном виде, вторая колонка реал. код клавиши [/pre2] Получается, при расширенном коде, что проходит в меню item в 2а байта, срабатыват, нет игнорируется

SergKis: т.е. K_CTRL_F4 и K_CTRL_F7 уложились в 2а байта, потому и выполнились - окна запросов open file и find появились

alkresin: Ну, вообще говоря, поскольку у вас есть bOnKey, вы можете подавать туда любые коды. Т.е., не обязательно привязываться к реальным кодам, расширенным или нет, можно подать любой код, а в bOnKey прописать его обработку. Главное, чтобы этот код не совпадал с чем-то существующим и нужным.

SergKis: alkresin пишет Т.е., не обязательно привязываться к реальным кодам, расширенным или нет, можно подать любой код, а в bOnKey прописать его обработку. Сделал в меню коды [pre2] bBlk := {|o,n| Local k := 0 If n == 30101; k := K_CTRL_F4 ElseIf n == 30102; k := K_CTRL_F7 ElseIf n == 30103; k := K_SH_F2 ElseIf n == 30104; k := K_SH_F8 EndIf ToLog(.T., 'nKey =', n, hb_keyStd(n), k) Return k } Значения k < 0, не учтено тут (красным добавил) IF !Empty( ::bOnKey ) i := Eval( ::bOnKey, Self, nKeyExt ) IF i == - 1 RETURN Nil ELSEIF i > 0 nKeyExt := i nKey := hb_keyStd(nKeyExt) ELSEIF i < 0 nKey := i ENDIF ENDIF что делать с nKeyExt не знаю, ниже по коду проверки nKeyExt на Alt, Ctrl с правкой сработали назначения на Shift+... - вывелись соответствующие окна, Ctrl+... не сработали [/pre2]

SergKis: PS K_F2 -> -1 тут проверка на -1[pre2] i := Eval( ::bOnKey, Self, nKeyExt ) IF i == - 1 RETURN Nil [/pre2]

alkresin: bOnKey должен возвращать расширенные коды. TEdit():OnKey() проверяет наличие бита, соответствующего нажатому Ctrl в расширенном коде, так как Клипперовские коды для ряда клавиш совпадают, например, Up arrow и Ctrl-E, Down arrow и Ctrl-X, ... SergKis пишет: Значения k < 0, не учтено тут (красным добавил) А почему они должны быть < 0 (кроме -1)?

alkresin: Обновлен hbedit. Добавлена поддержка макросов. Добавлена возможность переопределения клавиш через ini-файл: опция keymap а [OPTIONS], например: keymap=Ctrl-N=>Shift-F4,Ctrl-O=>Ctrl-F4

SergKis: alkresin пишет bOnKey должен возвращать расширенные коды. Подскажите, как перевести реал. коды клавиш в расширенные, буду переводить

alkresin: Для себя написал маленькую программку: [pre2]#include "hbgtinfo.ch" #include "inkey.ch" FUNCTION main LOCAL nkey, nkeyExt ? hb_gtVersion( 1 ), "GT" + hb_gtVersion() ? "Host codpage: " + hb_cdpSelect() DO WHILE .T. nKeyExt := Inkey( 0, HB_INKEY_ALL + HB_INKEY_EXT ) nkey := hb_keyStd( nKeyExt ) ? nKey, " ext: 0x" + hb_numToHex( nkeyExt, 8 ), hb_keyVal( nKeyExt ) IF nKey == 27 EXIT ENDIF ENDDO RETURN Nil [/pre2] Жму клавишу и смотрю код. Другого способа нет. Расширенный код на то и расширенный, что там содержится информация, которой нет в простых кодах.

SergKis: alkresin пишет Для себя написал маленькую программку: Может можно так обыграть, добавив[pre2] DATA lAlt INIT .F. DATA lCtrl INIT .F. DATA lShift INIT .F. ... METHOD onKey( nKeyExt ) CLASS TEdit ... IF !Empty( ::bOnKey ) ::lAlt := ::lCtrl := lShift := .F. i := Eval( ::bOnKey, Self, nKeyExt ) IF ::lAlt .or. ::lCtrl .or. lShift nKey := i ELSEIF i == - 1 RETURN Nil ELSEIF i > 0 nKeyExt := i nKey := hb_keyStd(nKeyExt) ENDIF ENDIF ... IF !lSkip lShift := ( hb_BitAnd( nKeyExt, SHIFT_PRESSED ) != 0 .AND. Ascan( aKeysMove, nkey ) != 0 ) .or. ::lShift IF lShift ... IF hb_BitAnd( nKeyExt, ALT_PRESSED ) != 0 .or. ::lAlt ... IF hb_BitAnd( nKeyExt, CTRL_PRESSED ) != 0 .or. ::lCtrl ... И в блоке кода ставить bBlk := {|o,n| Local k := 0 If n == 30101; k := K_CTRL_F4; o:lCtrl := .T. ElseIf n == 30102; k := K_CTRL_F7; o:lCtrl := .T. ElseIf n == 30103; k := K_SH_F2; o:lShift := .T. ElseIf n == 30104; k := K_SH_F8; o:lShift := .T. EndIf Return k } [/pre2]

SergKis: PS В блок кода правку, наверно, надо[pre2] bBlk := {|o,n| Local k := n [/pre2] или n использовать без k переменной

SergKis: PPS Правка[pre2] ::lAlt := ::lCtrl := lShift := .F. IF !Empty( ::bOnKey ) // ::lAlt := ::lCtrl := lShift := .F. [/pre2]

alkresin: SergKis пишет: Может можно так обыграть, добавив Зачем? Почему просто не передать расширенный код клавиши? Их в вашем меню всего ничего. К тому же, :lctrl не спасет - не отделит, например, Ctrl-Left arrow от Ctrl-Z. Если так трудно поставить несколько кодов, можете использовать новую функцию edi_KeyCToN( cKey ) - я добавил вчера спец.модуль для возможности переопределения клавиш, записи макросов и пр.: edi_KeyCToN( "Ctrl-N" ), например.

SergKis: alkresin пишет Зачем? Почему просто не передать расширенный код клавиши? Их в вашем меню всего ничего. В планах заменить + добавить все меню существующие, с учетом языковых текстов (англ., рус., латв.) перенеся на main menu по горизонтали и popup на них, а так же организовать меню на правый клик мыши + заменить окна консоли на окна windows варианта, которые в нашем варианте gtwvt есть (open file, save file, ...). Выискивать соответствия кодов - отвык работать с консолью\wvt, где то 2011 г. когда "брал в руки шашки" Функцию попробую, спасибо

SergKis: alkresin С функцией получилось заменить коды клавиш в блоке кода[pre2] bBlk := {|o,n| If n == 30101; n := edi_KeyCToN( "Ctrl-F4" ) // K_CTRL_F4 ElseIf n == 30102; n := edi_KeyCToN( "Ctrl-F7" ) // K_CTRL_F7 ElseIf n == 30103; n := edi_KeyCToN( "Shift-F2" ) // K_SH_F2 ElseIf n == 30104; n := edi_KeyCToN( "Shift-F8" ) // K_SH_F8 EndIf Return n } Для вывода в StatusBar добавил DATA bWriteTopPane ... METHOD WriteTopPane( lClear ) CLASS TEdit LOCAL y := ::y1 - 1, nCol := ::nCol, nRow := ::nRow LOCAL cLen := Ltrim(Str(Len(::aText))), nchars := Len(cLen) IF Valtype( ::bWriteTopPane ) == 'B' Eval( ::bWriteTopPane, Self, lClear ) ENDIF IF ::lTopPane ... и в hbedit.prg ... FOR i := 1 TO Len( aFiles ) TEdit():New( Iif(!Empty(aFiles),Memoread(aFiles),""), aFiles, 0, 0, nScreenH-1, nScreenW-1, , .F. ) ATail(TEdit():aWindows):bOnKey := bBlk ATail(TEdit():aWindows):bWriteTopPane := {|o,c| STBsay(o, c) } IF lRO ATail(TEdit():aWindows):lReadOnly := .T. ENDIF NEXT IF Empty( TEdit():aWindows ) TEdit():New( "", "", 0, 0, nScreenH-1, nScreenW-1, , .F. ) ATail(TEdit():aWindows):bOnKey := bBlk ATail(TEdit():aWindows):bWriteTopPane := {|o,c| STBsay(o, c) } IF lRO ATail(TEdit():aWindows):lReadOnly := .T. ENDIF ENDIF ... [/pre2] Получил вывод данных по Statusbar item-ам

SergKis: alkresin Как заставить автоматом выполнить первую строку меню плагинов, т.е. клавишами F11 -> меню -> 0 -> список функций файла prg [pre2] CASE K_F11 mnu_Plugins( Self ) ::lTextOut := .T. EXIT [/pre2] т.е. создать команду меню ElseIf n == 30105; n := <что то тут> // edi_KeyCToN( "Ctrl-F7" )

alkresin: Я добавил функцию edi_RunPlugin( xPlugin ) - можно непосредственно запустить нужный плагин из списка в ini. xPlugin - имя плагина или его номер в списке.



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