On-line: NickSam, гостей 1. Всего: 2 [подробнее..]
АвторСообщение
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)

Если есть идеи для реализации - буду рад услышать.

Спасибо: 0 
Профиль
Ответов - 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. Заголовок: Ну тогда надо вернут..


Ну тогда надо вернуть простые и все должно работать.

Спасибо: 0 
Профиль
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


Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 1240
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 02.05.19 19:09. Заголовок: Ну а что получает bO..


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

Спасибо: 0 
Профиль
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а байта, срабатыват, нет игнорируется

Спасибо: 0 
Профиль
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 появились

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 1241
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 02.05.19 20:20. Заголовок: Ну, вообще говоря, п..


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

Спасибо: 0 
Профиль
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+... не сработали


Спасибо: 0 
Профиль
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



Спасибо: 0 
Профиль
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)?

Спасибо: 0 
Профиль
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

Спасибо: 0 
Профиль
SergKis



Пост N: 2510
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.05.19 08:57. Заголовок: alkresin пишет bOnKe..


alkresin пишет
 цитата:
bOnKey должен возвращать расширенные коды.


Подскажите, как перевести реал. коды клавиш в расширенные, буду переводить

Спасибо: 0 
Профиль
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

Жму клавишу и смотрю код.
Другого способа нет. Расширенный код на то и расширенный, что там содержится информация, которой нет в простых кодах.

Спасибо: 0 
Профиль
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
}


Спасибо: 0 
Профиль
SergKis



Пост N: 2512
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.05.19 10:23. Заголовок: PS В блок кода правк..


PS
В блок кода правку, наверно, надо
 
bBlk := {|o,n|
Local k := n

или n использовать без k переменной

Спасибо: 0 
Профиль
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.


Спасибо: 0 
Профиль
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" ), например.

Спасибо: 0 
Профиль
SergKis



Пост N: 2514
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.05.19 11:01. Заголовок: alkresin пишет Зачем..


alkresin пишет
 цитата:
Зачем? Почему просто не передать расширенный код клавиши? Их в вашем меню всего ничего.


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

Спасибо: 0 
Профиль
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-ам

Спасибо: 0 
Профиль
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" )

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 1246
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 03.05.19 21:28. Заголовок: Я добавил функцию ed..


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

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 674
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет