On-line: гостей 2. Всего: 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: 1421
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 18.09.20 13:00. Заголовок: Выложен новый релиз ..


Выложен новый релиз HbEdit: http://www.kresin.ru/hbedit.html
Исправлена ошибка в модуле trie, которая иногда приводила к вылету программы.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3370
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.09.20 17:32. Заголовок: alkresin пишет Вылож..


alkresin пишет
 цитата:
Выложен новый релиз HbEdit


Выделение верт. блока и вставка его в позицию больше 1, как и раньше, работает (вставляет) неправильно, я раньше писал об этом. Far делает эту операцию правильно.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3371
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.09.20 17:59. Заголовок: PS При работе с одни..


PS
При работе с одним файлом (из одного места в другое) верт. блок вставка работает правильно, но между 2-мя запусками hbedit нет и если выйти из hbedit и перезапуститься, то блок из буфера так же будет вставлен неправильно.

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


Пост N: 1422
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 24.09.20 09:42. Заголовок: Т.е., проблема именн..


Т.е., проблема именно при работе с разными сеансами (копиями, запусками) редактора?
Это понятно, ведь информация о том, что блок - вертикальный, хранится только во время сеанса.
Я раскопал, как это делает Far. Он регистрирует новый формат Clipboard: Far_VerticalBlock_Unicode, в Winapi есть такая возможность, и сохраняет блок в этом формате, т.е. данные хранятся вместе с соответствующей пометкой в системном буфере Windows.
Мне не хотелось бы идти по этому пути, т.к. он только для Windows, ну и возни много.
Можно при копировании в буфер вертикального блока помещать перед текстом какой-нибудь непечатный символ, типа Chr(31). Тогда hbedit будет это дело обрабатывать правильно и между запусками, а в другие редакторы вертикальный блок попадет как обычный и с лишним символом. Может, это и нормально - вряд ли кто часто передает вертикальный блок между разными редакторами, да и удалить лишний символ нетрудно.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3375
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.09.20 12:08. Заголовок: alkresin пишет Может..


alkresin пишет
 цитата:
Может, это и нормально - вряд ли кто часто передает вертикальный блок между разными редакторами, да и удалить лишний символ нетрудно.


Иметь в работе 3 Far с ассоциацией на запуск редакторов (F4 - родной, Alt+F4 - Akelpad, Enter - hbedit) вполне нормальная практика + прогр. ведения проекта с запуском hbedit. Для меня это нормальный процесс. Потому просил когда то и режим подсветки фона для readonly запуска, как доп. опция, а не полностью новая секция цветов. Сейчас для различия source и target prg сдвигаю один из hbedit, к примеру, в правый угол экрана. С akelpad и far этого делать не надо, т.к. цветовые гаммы разные.
У себя решил проблему верт. блока (писал об этом ранее) добавкой строки (хотелось бы иметь текст оригинал без моих правок, иначе трудно вести свою версию с LV866 кодировкой)
 
FUNCTION cb2Text( oEdit, nReg, lToText, s, lVert )
...
IF Chr(13) $ s
s := Strtran( s, Chr(13), "" )
ENDIF

lVert := lVert .or. ( oEdit:nPos > 1 .and. chr(10) $ s )

IF lVert
oEdit:Undo( oEdit:nLine, oEdit:nPos,,, UNDO_OP_START )
...


т.е. вставка не с 1ой позиции - это верт. блок вставка. Это работает правильно во всех случаях и с akelpad, far нет конфликта по переносу от них верт. блоков.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3376
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.09.20 12:18. Заголовок: PS Если делать встав..


PS
Если делать вставку из буфера не с первой позиции, в вашей версии (разные запуски), будет искажение как для строк так и для верт. блока, т.е. по любому надо делать Ctrl+Z и мудрить как что делать, для строк перемещаться в 1ю позицию, для блока ... сейчас не работает, т.е не вставить

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


Пост N: 1423
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 24.09.20 13:49. Заголовок: SergKis пишет: т.е...


SergKis пишет:

 цитата:
т.е. вставка не с 1ой позиции - это верт. блок вставка.


Я помню, вы это предлагали - и я тогда же ответил, что мне не кажется логичным такое предположение, для среднестатистического пользователя оно просто неверно. Не с 1-ой позиции можно вставлять и не вертикальный блок, в программном коде - реже, в обычном тексте - чаще.

 цитата:
Если делать вставку из буфера не с первой позиции, в вашей версии (разные запуски), будет искажение как для строк так и для верт. блока,


Только для вертикального блока. Я предлагал вставить Chr(31) только для него - если вы об этом. Впрочем, это, конечно, "грязное" решение.
Можно еще, конечно, каждый раз при copy вертикального блока сохранять его в спец.файле, а при каждом paste читать оттуда - и, если содержимое совпадает с текстом в буфере - значит это вертикальный блок.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3377
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.09.20 14:00. Заголовок: alkresin пишет оно п..


alkresin пишет
 цитата:
оно просто неверно. Не с 1-ой позиции можно вставлять и не вертикальный блок, в программном коде - реже, в обычном тексте - чаще.


Не очень понимаю, что можно вставлять не 1-ой позиции ?
Если во вставке есть chr(10) -> верт. блок, нет -> строка с позиции. Какие еще варианты ?
Просто строки, так они сработают так же как и раньше, первая строка с позиции курсора, остальные вставятся с 1-ой позиции.
Это обработка есть в команде lVert := lVert .or. ( oEdit:nPos > 1 .and. chr(10) $ s )
Если такое не катит, то лучше ничего не делать

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3378
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.09.20 14:05. Заголовок: SergKis пишет Просто..


SergKis пишет
 цитата:
Просто строки, так они сработают так же как и раньше, первая строка с позиции курсора, остальные вставятся с 1-ой позиции.


Это без команды добавленной и это "плохая" вставка, логичнее ее превращать в верт. блок и вставлять ровненько

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3379
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.09.20 14:11. Заголовок: PS2 в Akelpad из Far..


PS2
в Akelpad из Far верт. блок так же правильно переносится, т.е. если SergKis пишет
 цитата:
то лучше ничего не делать


Но осадочек остается

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


Пост N: 1424
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 24.09.20 15:33. Заголовок: Ладно, уговорили. До..


Ладно, уговорили. Добавлю опцию в ini, которая разрешит подобное поведение.

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


Пост N: 1425
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 25.09.20 11:15. Заголовок: Выложен новый релиз ..


Выложен новый релиз hbedit - v2.0-17, http://www.kresin.ru/hbedit.html.
В ini добавлена опция autovertical. Если ее раскомментировать и установить в On, то при вставке многострочного блоке не в первой позиции строки он будет рассматриваться как вертикальный. Эту опцию можно включить/отключить во время работы в меню View.

Расширена база слов для автодополнения для Harbour и С: теперь туда включаются и все вызовы функций, найденные в редактируемом файле.
Расширена база слов для автодополнения для Golang: теперь туда включаются методы и типы из импортируемых пакетов. Кроме того, для Golang - файлов теперь доступна помощь по пакетам и их функциям (Alt-I, как и для Harbour).

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3380
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.20 13:35. Заголовок: alkresin У меня ост..


alkresin
У меня остался вопрос, как из OnKey вызвать работу скрипта конкретного plugins и списка по Alt+L ?
У меня есть свои события для работы в ф-ии обработчике
 
STATIC FUNCTION EdOnKey( o, n )
LOCAL m := n, b, i, j, k
LOCAL s := hb_BitAnd( n, SHIFT_PRESSED ) != 0
LOCAL a := hb_BitAnd( n, ALT_PRESSED ) != 0
LOCAL c := hb_BitAnd( n, CTRL_PRESSED ) != 0
LOCAL p := hb_keyStd( n )
LOCAL r := -1

// ToLog(.T., n, s, a, c, p)

IF p == K_F1 // help
RETURN r

ELSEIF p == K_F8 // colored syntaxis enabled\disabled
bkDir( o, n, '*.prg' )
RETURN r

ELSEIF p == K_F10 // exit
RETURN r

ELSEIF p == K_ALT_X // close all
n := 30110

ENDIF
// мои события
b := hb_HGetDef( h_Key, n, Nil )

If b != Nil
If HB_ISBLOCK( b ) .and. ( k := EVal( b, o, n ) ) != Nil
n := k
Else
n := b
EndIf
EndIf

RETURN n
// Список событий
STATIC FUNCTION h_KeyInit()

h_Key := { ;
1004 => {| | Nil }, ; // K_RBUTTONDOWN
30001 => {| | hb_keyPut( {K_RIGHT, K_LEFT} ) }, ; //
30101 => {| | edi_KeyCToN( "Shift-F4" ) }, ; // New file
30102 => {| | edi_KeyCToN( "Ctrl-F4" ) }, ; // Open file
30103 => {| | edi_KeyCToN( "F2" ) }, ; // Save
30104 => {| | edi_KeyCToN( "Shift-F4" ) }, ; // Save as
30105 => {| | edi_KeyCToN( "Shift-F8" ) }, ; // Code page
30109 => {| | edi_KeyCToN( "F9" ) }, ; // F9-Menu
30110 => {|o,n| Window_OnKey(o, n) }, ; // Close all window Alt+X
30201 => {| | edi_KeyCToN( "F7" ) }, ; // Find...
30202 => {| | edi_KeyCToN( "Shift-F7" ) }, ; // Find Next
30203 => {| | edi_KeyCToN( "Alt-F7" ) }, ; // Find Prev
30204 => {| | edi_KeyCToN( "Ctrl-F7" ) }, ; // Replace...
30205 => {| | edi_KeyCToN( "Alt-F8" ) }, ; // Goto...
30206 => {| | edi_KeyCToN( "Alt-B" ) }, ; // Goto the previous position
30207 => {| | edi_KeyCToN( "Alt-L" ) }, ; // Function list

30301 => {| | edi_KeyCToN( "F12" ) }, ; // List of open files
30302 => {|o,n| Window_OnKey(o, n) }, ; // Split window horizontally
30303 => {|o,n| Window_OnKey(o, n) }, ; // Split window vertically
30304 => {|o,n| Window_OnKey(o, n) }, ; // Switch window
30305 => {|o,n| Window_OnKey(o, n) }, ; // Open window fully
30306 => {|o,n| Window_OnKey(o, n) }, ; // Close window
30999 => {| | (-1) } ; // dummy
}
// 30110 => {|o,n| Window_CloseAll(o, n) }, ; // Close all window Alt+X

RETURN Nil
...

Выделенное цветом не работает, т.к. у вас работа плагина инициируется до ::OnKey()

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


Пост N: 1426
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 25.09.20 14:57. Заголовок: А edi_RunPlugin( oEd..


А edi_RunPlugin( oEdit, xPlugin ) не пробовали?
Здесь xPlugin - номер плагина в списке или его имя.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3383
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.20 15:16. Заголовок: alkresin пишет А edi..


alkresin пишет
 цитата:
А edi_RunPlugin( oEdit, xPlugin ) не пробовали?


Спасибо, попробую

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3471
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.10.20 12:10. Заголовок: alkresin пишет А edi..


alkresin пишет
 цитата:
А edi_RunPlugin( oEdit, xPlugin ) не пробовали?
Здесь xPlugin - номер плагина в списке или его имя.


Работает, но надо обвешивать кодом от расширения загруженных файлов
Сделал так
 
CLASS TEdit
...
DATA nKeyExt INIT 0

...
METHOD Edit() CLASS TEdit
...
DO WHILE ::lShow
SetCursor( Iif( ::lIns, SC_NORMAL, SC_SPECIAL1 ) )
IF Empty( ::nKeyExt )
nKeyExt := Inkey( 0, HB_INKEY_ALL + HB_INKEY_EXT )
ELSE
nKeyExt := ::nKeyExt
::nKeyExt := 0
ENDIF

IF !Empty( hKeyMap ) .AND. !Empty( i := hb_hGetDef( hKeyMap, nKeyExt, 0 ) )
...
Тогда в своем боке кода делаю так, для работы ваших обработчиков
STATIC FUNCTION h_KeyInit()
h_Key := { ;
1004 => {| | Nil }, ; // K_RBUTTONDOWN
30001 => {| | hb_keyPut( {K_RIGHT, K_LEFT} ) }, ; //
...
30207 => {|o | o:nKeyExt := edi_KeyCToN( "Alt-L"), -1 }, ; // Function list

...
30999 => {| | (-1) } ; // dummy
}
...


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3472
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.10.20 18:40. Заголовок: alkresin Попытался ..


alkresin
Попытался собрать последнюю версию, получил
 
.\cfuncs.c(321) : warning C4996: 'freopen': This function or variable may be unsafe. Consider using freopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\BK32\MSVC\include\stdio.h(252): см. объявление 'freopen'
c:\bk32\test\hbedit-master\source\trie.h(15) : error C2011: trieITEM: переопределение типа "struct"
c:\bk32\test\hbedit-master\source\trie.h(15): см. объявление 'trieITEM'
c:\bk32\test\hbedit-master\source\trie.h(25) : error C2011: trieBASE: переопределение типа "struct"
c:\bk32\test\hbedit-master\source\trie.h(25): см. объявление 'trieBASE'


Как с этим бороться ?
А можно ли вкл. trie технику в сборку по переменной.
Я в VO не пользовался, считал лишним, мешающим работе и мнение не поменялось (это нужно в незнакомом языке)

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


Пост N: 1433
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 12.10.20 11:08. Заголовок: Пока даже не знаю, ч..


Пока даже не знаю, что и сказать. Это обычная конструкция, она и в Harbour во многих местах. У меня без проблем компилится и с bcc и с gcc под Линукс.

 цитата:
А можно ли вкл. trie технику в сборку по переменной.


Ну это, наверное, неправильный подход к решению проблемы. Надо выяснить, в чем причина. Может, хоть это и диковато звучит, MSVS хочет, чтобы в typedef struct XXXX это XXXX было обязательно в верхнем регистре или начиналось с знака подчеркивания.

 цитата:
Я в VO не пользовался, считал лишним, мешающим работе и мнение не поменялось (это нужно в незнакомом языке)


По мне, автодополнение - чтоб по клавишам меньше бить. Меня, например, достало FUNCTION и RETURN целиком набивать)

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3473
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.10.20 13:48. Заголовок: alkresin пишет Может..


alkresin пишет
 цитата:
Может, хоть это и диковато звучит, MSVS хочет, чтобы в typedef struct XXXX это XXXX было обязательно в верхнем регистре или начиналось с знака подчеркивания.


Не помогло. Сообщение
 
c:\bk32\test\hbedit-master\source\trie.h(15) : error C2011: TRIEITEM: переопределение типа "struct"
c:\bk32\test\hbedit-master\source\trie.h(15): см. объявление 'TRIEITEM'
c:\bk32\test\hbedit-master\source\trie.h(25) : error C2011: TRIEBASE: переопределение типа "struct"
c:\bk32\test\hbedit-master\source\trie.h(25): см. объявление 'TRIEBASE'

MSVC208. Подключаю к сборке через prg файл
 
trie.prg
#pragma BEGINDUMP
#include "trie.c"
#pragma ENDDUMP

hbtrie.prg
#pragma BEGINDUMP
#include "hbtrie.c"
#pragma ENDDUMP

trie.h
...
typedef struct TRIEITEM
{
char letter;
struct TRIEITEM * right;
struct TRIEITEM * next;
char suffix[SUFFIX_LEN];
} TRIEITEM;

typedef TRIEITEM TRIEPAGE[TRIE_PAGE_SIZE];

typedef struct TRIEBASE
{
//struct trieITEM ** [TRIE_PAGE_SIZE] pages;
TRIEPAGE ** pages;
int iPages;
int iLastPage;
int iLastItem;
unsigned int iWords;
int bUtf8;
int bCase;
} TRIE;
...


 цитата:
Меня, например, достало FUNCTION и RETURN целиком набивать


Посмотрел работу на вышей версии. При выборе по trie (клавиша TAB) менять надо все слово с первой позиции, иначе получаются
funCTION retURN, для ф-ий также вместо MyGotFocus( получаем mygotFocus( и т.д.
В список показа так же получается с искажением, т.е.
Если берем по 2м буквам my... получаем
myBrw1(
myBrw2(
...
Если берем по 3м буквам myb... получаем
mybrw1(
mybrw2(
...
Функции набраны реально
MyBrw1(
MyBrw2(
...

 цитата:
По мне, автодополнение - чтоб по клавишам меньше бить


Это дело привычки. Еси работать событиями, то исп. имени ф-ии где то 2а раза
1. тело самой ф-ии
2. ф-я в событии, т.е. написав тело, переносим имя в событие (Ctrl+C, Ctlr+V) и далее исп. только событие
Alt+L и потом Alt+B так же помогают в вопросе имен, Far на ваш файл hb_funcs.txt (или сайт) так же решают прав. написание имен
Альтернатива есть для trie

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3474
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.10.20 14:28. Заголовок: PS Если работать в к..


PS
Если работать в классе, к примеру TEdit, то ::writ + TAB не работает, а writ + TAB дает writeTopPane( надо :: отдельно добавлять, что не есть удобно.

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