Автор | Сообщение |
alkresin
|
| moderator
|
Пост N: 1174
Зарегистрирован: 06.07.06
|
|
Отправлено: 04.04.19 14:37. Заголовок: Hbedit - текстовый редактор
Довел, наконец, свой текстовый редактор до того состояния, когда можно показать его общественности. Я начал писать его сначала как замену 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
|
| moderator
|
Пост N: 1239
Зарегистрирован: 06.07.06
|
|
Отправлено: 02.05.19 17:43. Заголовок: Ну тогда надо вернут..
Ну тогда надо вернуть простые и все должно работать.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2505
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.05.19 17:52. Заголовок: alkresin пишет Ну то..
alkresin пишет цитата: | Ну тогда надо вернуть простые и все должно работать. |
| Работают, вызывают окна при выборе пункта меню (это все через расширенные коды) 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
|
|
|
alkresin
|
| moderator
|
Пост N: 1240
Зарегистрирован: 06.07.06
|
|
Отправлено: 02.05.19 19:09. Заголовок: Ну а что получает bO..
Ну а что получает bOnKey, если отбросить мышиные события?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2506
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.05.19 19:24. Заголовок: bBlk := {|..
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 =) приходит в расширенном виде, вторая колонка реал. код клавиши Получается, при расширенном коде, что проходит в меню item в 2а байта, срабатыват, нет игнорируется
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2507
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.05.19 19:29. Заголовок: т.е. K_CTRL_F4 и K_C..
т.е. K_CTRL_F4 и K_CTRL_F7 уложились в 2а байта, потому и выполнились - окна запросов open file и find появились
|
|
|
alkresin
|
| moderator
|
Пост N: 1241
Зарегистрирован: 06.07.06
|
|
Отправлено: 02.05.19 20:20. Заголовок: Ну, вообще говоря, п..
Ну, вообще говоря, поскольку у вас есть bOnKey, вы можете подавать туда любые коды. Т.е., не обязательно привязываться к реальным кодам, расширенным или нет, можно подать любой код, а в bOnKey прописать его обработку. Главное, чтобы этот код не совпадал с чем-то существующим и нужным.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2508
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.05.19 21:21. Заголовок: alkresin пишет Т.е.,..
alkresin пишет цитата: | Т.е., не обязательно привязываться к реальным кодам, расширенным или нет, можно подать любой код, а в bOnKey прописать его обработку. |
| Сделал в меню коды 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+... не сработали
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2509
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.05.19 21:41. Заголовок: PS K_F2 -> -1 ту..
PS K_F2 -> -1 тут проверка на -1 i := Eval( ::bOnKey, Self, nKeyExt ) IF i == - 1 RETURN Nil
|
|
|
alkresin
|
| moderator
|
Пост N: 1242
Зарегистрирован: 06.07.06
|
|
Отправлено: 03.05.19 08:44. Заголовок: bOnKey должен возвра..
bOnKey должен возвращать расширенные коды. TEdit():OnKey() проверяет наличие бита, соответствующего нажатому Ctrl в расширенном коде, так как Клипперовские коды для ряда клавиш совпадают, например, Up arrow и Ctrl-E, Down arrow и Ctrl-X, ... SergKis пишет: цитата: | Значения k < 0, не учтено тут (красным добавил) |
| А почему они должны быть < 0 (кроме -1)?
|
|
|
alkresin
|
| moderator
|
Пост N: 1243
Зарегистрирован: 06.07.06
|
|
Отправлено: 03.05.19 08:54. Заголовок: Обновлен hbedit. Доб..
Обновлен hbedit. Добавлена поддержка макросов. Добавлена возможность переопределения клавиш через ini-файл: опция keymap а [OPTIONS], например: keymap=Ctrl-N=>Shift-F4,Ctrl-O=>Ctrl-F4
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2510
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.19 08:57. Заголовок: alkresin пишет bOnKe..
alkresin пишет цитата: | bOnKey должен возвращать расширенные коды. |
| Подскажите, как перевести реал. коды клавиш в расширенные, буду переводить
|
|
|
|
alkresin
|
| moderator
|
Пост N: 1244
Зарегистрирован: 06.07.06
|
|
Отправлено: 03.05.19 09:40. Заголовок: Для себя написал мал..
Для себя написал маленькую программку: #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 Жму клавишу и смотрю код. Другого способа нет. Расширенный код на то и расширенный, что там содержится информация, которой нет в простых кодах.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2511
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.19 10:17. Заголовок: alkresin пишет Для с..
alkresin пишет цитата: | Для себя написал маленькую программку: |
| Может можно так обыграть, добавив 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 }
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2512
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.19 10:23. Заголовок: PS В блок кода правк..
PS В блок кода правку, наверно, надо bBlk := {|o,n| Local k := n или n использовать без k переменной
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2513
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.19 10:26. Заголовок: PPS Правка ::lAl..
PPS Правка ::lAlt := ::lCtrl := lShift := .F. IF !Empty( ::bOnKey ) // ::lAlt := ::lCtrl := lShift := .F.
|
|
|
alkresin
|
| moderator
|
Пост N: 1245
Зарегистрирован: 06.07.06
|
|
Отправлено: 03.05.19 10:45. Заголовок: SergKis пишет: Може..
SergKis пишет: цитата: | Может можно так обыграть, добавив |
| Зачем? Почему просто не передать расширенный код клавиши? Их в вашем меню всего ничего. К тому же, :lctrl не спасет - не отделит, например, Ctrl-Left arrow от Ctrl-Z. Если так трудно поставить несколько кодов, можете использовать новую функцию edi_KeyCToN( cKey ) - я добавил вчера спец.модуль для возможности переопределения клавиш, записи макросов и пр.: edi_KeyCToN( "Ctrl-N" ), например.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2514
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.19 11:01. Заголовок: alkresin пишет Зачем..
alkresin пишет цитата: | Зачем? Почему просто не передать расширенный код клавиши? Их в вашем меню всего ничего. |
| В планах заменить + добавить все меню существующие, с учетом языковых текстов (англ., рус., латв.) перенеся на main menu по горизонтали и popup на них, а так же организовать меню на правый клик мыши + заменить окна консоли на окна windows варианта, которые в нашем варианте gtwvt есть (open file, save file, ...). Выискивать соответствия кодов - отвык работать с консолью\wvt, где то 2011 г. когда "брал в руки шашки" Функцию попробую, спасибо
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2515
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.19 14:23. Заголовок: alkresin С функцией..
alkresin С функцией получилось заменить коды клавиш в блоке кода 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 ... Получил вывод данных по Statusbar item-ам
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 2516
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.19 18:50. Заголовок: alkresin Как застав..
alkresin Как заставить автоматом выполнить первую строку меню плагинов, т.е. клавишами F11 -> меню -> 0 -> список функций файла prg CASE K_F11 mnu_Plugins( Self ) ::lTextOut := .T. EXIT т.е. создать команду меню ElseIf n == 30105; n := <что то тут> // edi_KeyCToN( "Ctrl-F7" )
|
|
|
alkresin
|
| moderator
|
Пост N: 1246
Зарегистрирован: 06.07.06
|
|
Отправлено: 03.05.19 21:28. Заголовок: Я добавил функцию ed..
Я добавил функцию edi_RunPlugin( xPlugin ) - можно непосредственно запустить нужный плагин из списка в ini. xPlugin - имя плагина или его номер в списке.
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|