Форум » [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: Выложен новый релиз HbEdit: http://www.kresin.ru/hbedit.html Исправлена ошибка в модуле trie, которая иногда приводила к вылету программы.

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

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


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

SergKis: alkresin пишет Может, это и нормально - вряд ли кто часто передает вертикальный блок между разными редакторами, да и удалить лишний символ нетрудно. Иметь в работе 3 Far с ассоциацией на запуск редакторов (F4 - родной, Alt+F4 - Akelpad, Enter - hbedit) вполне нормальная практика + прогр. ведения проекта с запуском hbedit. Для меня это нормальный процесс. Потому просил когда то и режим подсветки фона для readonly запуска, как доп. опция, а не полностью новая секция цветов. Сейчас для различия source и target prg сдвигаю один из hbedit, к примеру, в правый угол экрана. С akelpad и far этого делать не надо, т.к. цветовые гаммы разные. У себя решил проблему верт. блока (писал об этом ранее) добавкой строки (хотелось бы иметь текст оригинал без моих правок, иначе трудно вести свою версию с LV866 кодировкой)[pre2] 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 ) ... [/pre2] т.е. вставка не с 1ой позиции - это верт. блок вставка. Это работает правильно во всех случаях и с akelpad, far нет конфликта по переносу от них верт. блоков.

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

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

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

SergKis: SergKis пишет Просто строки, так они сработают так же как и раньше, первая строка с позиции курсора, остальные вставятся с 1-ой позиции. Это без команды добавленной и это "плохая" вставка, логичнее ее превращать в верт. блок и вставлять ровненько

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

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

alkresin: Выложен новый релиз hbedit - v2.0-17, http://www.kresin.ru/hbedit.html. В ini добавлена опция autovertical. Если ее раскомментировать и установить в On, то при вставке многострочного блоке не в первой позиции строки он будет рассматриваться как вертикальный. Эту опцию можно включить/отключить во время работы в меню View. Расширена база слов для автодополнения для Harbour и С: теперь туда включаются и все вызовы функций, найденные в редактируемом файле. Расширена база слов для автодополнения для Golang: теперь туда включаются методы и типы из импортируемых пакетов. Кроме того, для Golang - файлов теперь доступна помощь по пакетам и их функциям (Alt-I, как и для Harbour).

SergKis: alkresin У меня остался вопрос, как из OnKey вызвать работу скрипта конкретного plugins и списка по Alt+L ? У меня есть свои события для работы в ф-ии обработчике[pre2] 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 ... [/pre2] Выделенное цветом не работает, т.к. у вас работа плагина инициируется до ::OnKey()

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

SergKis: alkresin пишет А edi_RunPlugin( oEdit, xPlugin ) не пробовали? Спасибо, попробую

SergKis: alkresin пишет А edi_RunPlugin( oEdit, xPlugin ) не пробовали? Здесь xPlugin - номер плагина в списке или его имя. Работает, но надо обвешивать кодом от расширения загруженных файлов Сделал так[pre2] 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 } ... [/pre2]

SergKis: alkresin Попытался собрать последнюю версию, получил[pre2] .\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' [/pre2] Как с этим бороться ? А можно ли вкл. trie технику в сборку по переменной. Я в VO не пользовался, считал лишним, мешающим работе и мнение не поменялось (это нужно в незнакомом языке)

alkresin: Пока даже не знаю, что и сказать. Это обычная конструкция, она и в Harbour во многих местах. У меня без проблем компилится и с bcc и с gcc под Линукс. А можно ли вкл. trie технику в сборку по переменной. Ну это, наверное, неправильный подход к решению проблемы. Надо выяснить, в чем причина. Может, хоть это и диковато звучит, MSVS хочет, чтобы в typedef struct XXXX это XXXX было обязательно в верхнем регистре или начиналось с знака подчеркивания. Я в VO не пользовался, считал лишним, мешающим работе и мнение не поменялось (это нужно в незнакомом языке) По мне, автодополнение - чтоб по клавишам меньше бить. Меня, например, достало FUNCTION и RETURN целиком набивать)

SergKis: alkresin пишет Может, хоть это и диковато звучит, MSVS хочет, чтобы в typedef struct XXXX это XXXX было обязательно в верхнем регистре или начиналось с знака подчеркивания. Не помогло. Сообщение[pre2] 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' [/pre2] MSVC208. Подключаю к сборке через prg файл[pre2] 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; ... [/pre2] Меня, например, достало 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

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



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