Реализовать дерево директорий панельным модулем на Луа

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks wrote: Sun 08 Mar, 2020 21:37
buniak_a_h wrote: Sat 07 Mar, 2020 19:41 Я начинал делать дерево в виде панельного модуля. Вот это мне показалось наиболее удобным. Но… Отвлекли на работе.
ну положите куда-нибудь на видное место если там есть хоть что-то полезное, может кто-нибудь продолжит
Спасибо citRiks-у за наводку на tree.com - давно забытая утилитка. Получился довольно небольшой и вполне пригодный модуль. Позволяет открывать-закрывать узлы дерева, задавать глубину, на которую первоначально открываются узлы; просматривать в пассивной панели текущую папку и переходить в панели дерева на выбранную папку.



Чего может не хватать:
  • обновления дерева (по таймеру, например);
  • вывода характеристик (суммарный размер поддерева, самого нового файла, количество файлов).
  • Что ещё - не знаю.
Если кому-нить это интересно, перечисленные недоделки я по возможности доделаю. Также принимаются предложения, чего может ещё не хватать для нормальной работы. Но так-то вроде вполне удобненько получилось … :-)
Опять же если будут добровольцы - локализацию и перевод хелпа были бы полезны. Если скрипт кому-нить покажется полезным …

Версия 2.6.5
  1. Исправлена ошибка, возникавшая при перестроении всего дерева по клавише Ctrl+R (обновить). Кроме того, по этой клавише возможно обновление кэша.
  2. При выходе из дерева состояние другой панели теперь восстанавливается только в случае, если включено немедленное открытие текущего каталога на противоположной панели.
  3. Добавлен минимальный контроль актуальности данных о папке в кэше: если в корневой папке имеются подпапки, а дерево формируется пустым, то выводится сообщение о критической неактуальности кэша и предлагается его перестроить. В случае отказа только перестраивается в памяти ветка корневого каталога дерева.
  4. При обновлении дерева по Ctrl+R также предлагается обновить кэш диска.
  5. Экспериментально!] При смене каталога на другой (не_древесной) панели (если она активна) указатель в дереве переносится на соответствующий узел дерева; при этом он помечается символом «►».
TreePanel_2_6_5.7z
(30.63 KiB) Downloaded 10 times


1)Корневой каталог - каталог, который вместе с вложенными показан на дереве.
Last edited by buniak_a_h on Tue 17 Nov, 2020 18:12, edited 35 times in total.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

Latest post of the previous page:

citRiks wrote: Mon 20 Jul, 2020 17:38 CSV - потому что читабельность
citRiks, а что такое CSV?
citRiks wrote: Mon 20 Jul, 2020 17:38 json потому что компактность и относительная читабельность тоже
Я не знаю json, и нет никакого желания изучать.
citRiks wrote: Mon 20 Jul, 2020 17:38 если sqlite, то по идее эффективно, хоть и не читабельно
Если сохранять в БД SQLite при помощи mf.msave, то таблица сохраняется в виде строки, возвращаемой mf.serialize. Т.е. разница только в том, сохранять в базу или в виде отдельного файла. При этом с файлом легче работать (проверять, обновлять).
User avatar
HaRT
Moderator
Posts: 9600
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 114 times
Been thanked: 233 times

Реализовать дерево директорий панельным модулем на Луа

Post by HaRT »

buniak_a_h wrote: Mon 20 Jul, 2020 18:28 Я не знаю json, и нет никакого желания изучать.
Это очень простой и полезный иерархический текстовый формат, и хотя бы прочитать статью по-русски в Википедии точно оправданно.
Фар есть инструмент, а не нянька. © 2009 DrKnS
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks, на самом деле я не готов придумывать какой-то формат для дерева и делать свои процедуры чтения/записи.
Вся задача сводится к сохранению/чтению таблицы. Это самый короткий (с точки зрения трудоёмкости разработки). Главный минус - возможность чтения только целого диска. Возможно, действительно, имеет смысл хранить каждую папку в отдельной записи SQL, а для вложенных папок писать ссылку на соответствующую запись. Ну, я не знаю, стоит ли овчинка выделки …
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

HaRT, я глянул. На самом деле у меня есть функция TableToString, которая преобразовывает таблицу в строку, ну ооооочень (!!!) похожую на пример json-записи. Зато она делает синтаксически корректный код на LUA вида (пример настройки скрипта Active-Help):

Code: Select all

return
{ExecKey="CtrlEnter";
p7z_exe="7z.exe";
Prefixc="acc:achh";
Prefix="ach";
Version=10;
HelpKey="CtrlF1";
AutoSearch=true;
HelpTable={{Mask="*.lua,*.hlf,*.lng,*.moon";
Helps={{File="C:\\Program Files\\Far Manager\\Encyclopedia\\macroapi_manual.ru.chm";
Alias="Справка по системе макросов"};
{File="C:\\Program Files\\Far Manager\\Encyclopedia\\luafar_manual.chm";
Alias="Manual of LuaFAR 3"};
{File="C:\\Program Files\\Far Manager\\Encyclopedia\\FarEncyclopedia.ru.chm";
Alias="Энциклопедия"};
{File="C:\\Program Files\\Far Manager\\Encyclopedia\\lua-5.1.rus.chm";
Alias="Lua 5.1 - Справочное руководство"}}};
{Mask="<Delphi>";
Helps={{File="D:\\Delphi7\\Help\\d7.hlp";
Alias="Помощь по Delphi"};
{File="D:\\4DEL7\\Apollo60\\Help\\ApolloVCL6.hlp";
Alias="Помощь по Apollo"};
{File="D:\\4DEL7\\Jedi\\help\\JCLHELP.HLP";
Alias="Помощь по JEDI"};
{File="D:\\4DEL7\\EhLib\\Hlp\\RUS\\EHLIB.HLP";
Alias="Помощь по EhLib"};
{File="D:\\4DEL7\\Jedi\\help\\JVCL3.chm";
Alias="Jedi (chm)"}}}};
SetupKey="ALtShiftF12"}
Если отформатировать, то получите как раз тоже самое.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

HaRT, на самом деле моя функция меня бы полностью устроила кроме одного "но": в таблицах я формирую элемент Self, ссылающийся на таблицу. Т.е. рекурсия. Возможно, это я сделал зря (если определить метод Self в мета-таблице или как-то так).Просто на тот момент мне было не до красот. А моя функция некорректно обрабатывает такие рекурсии (не зацикливается, но и и не может записать такое в текст). Т.е. для работы с таким кэшем надо перед сохранением вычищать Self-ы, а после чтения в рекурсивной процедуре прописывать (восстанавливать) снова.
Сейчас поэкспериментирую с мета-таблицами и, возможно, откажусь от поля Self. Правда, я так и не понял, что такое metatable, хотя и использую… ;-)
citRiks
Posts: 899
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 274 times
Been thanked: 47 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 20 Jul, 2020 18:28 citRiks, а что такое CSV?
Видел библиотеки на Луа для этого, но там все элементарно и без библиотек
Comma Separated Values, flat file
buniak_a_h wrote: Mon 20 Jul, 2020 18:28 Я не знаю json, и нет никакого желания изучать.
Похоже на XML, но более компактный и простой как три рубля.
например: {а = 111, б = 222, ц = "333", табель = {123, "абц"} }
теперь знаете :)
buniak_a_h wrote: Mon 20 Jul, 2020 18:28 Если сохранять в БД SQLite при помощи mf.msave, то таблица сохраняется в виде строки, возвращаемой mf.serialize.
Ну я имел ввиду другое, сделать таблицу с записями, а не пихать в sqlite произвольные строки.
Т.е. не надо делать serialize-deserialize все время.
мне кажется с реляционной таблицей, и легче человеку и производительнеее управлятся чем с любыми файлами, serialize-deserialize.

Ну дело вкуса все это конечно
Last edited by citRiks on Mon 20 Jul, 2020 19:47, edited 1 time in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 899
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 274 times
Been thanked: 47 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 20 Jul, 2020 18:46 а самом деле у меня есть функция TableToString, которая преобразовывает таблицу в строку, ну ооооочень (!!!) похожую на пример json-записи
ну да, по научному и называется json такой формат
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks wrote: Mon 20 Jul, 2020 19:43 ну да, по научному и называется json такой формат
не-не! Это - lua! Там и =, а не :, и разделители ; или ,, и строки приспособленные для интерпретации lua (удвоение слэшей, экранирование кавычек). И даже реально сделать такую таблицу:

Code: Select all

{1,2,"q3",nil,'F5',
 AddField1='AF1';
 AddField2={Af2_1='AF2'; Af2_2=2.2}
}
Т.е. в одной таблице и последовательные поля, и именованные. Причём последовательные могут быть с пропуском! Не уверен, что json такое съест…
Last edited by buniak_a_h on Mon 20 Jul, 2020 20:05, edited 1 time in total.
Yegor
Posts: 1092
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 15 times
Been thanked: 26 times

Реализовать дерево директорий панельным модулем на Луа

Post by Yegor »

citRiks wrote: Mon 20 Jul, 2020 19:41 Похоже на XML, но более компактный и простой как три рубля.
например: {а = 111, б = 222, ц = "333", табель = {123, "абц"} }
Буду занудой, но это даже близко не json.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
citRiks
Posts: 899
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 274 times
Been thanked: 47 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

Yegor, buniak_a_h,
осознал свою ошибку насчет двоеточий а не "равно",
но думаю что вы все меня правильно поняли в целом
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 899
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 274 times
Been thanked: 47 times

Реализовать дерево директорий панельным модулем на Луа

Post by citRiks »

buniak_a_h wrote: Mon 20 Jul, 2020 20:02 Т.е. в одной таблице и последовательные поля, и именованные. Причём последовательные могут быть с пропуском! Не уверен, что json такое съест…
Освежил себ про json,
все НЕименованое должно быть в квадратных скобках, и тогда это будет секвенциальный array, а именованное должно быть в фиигурных скобках и тогда это будет dictionary.
и не смешивается, да
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

citRiks, ну т.е. согласны, что моя функциюха универсальнее, чем json? просто она (ну, за исключением рекурсии) способна представить любую lua-таблицу. А mf.serialize может и рекурсию обработать.
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

Вышла экспериментальная версия с сохранением списка каталогов диска в файл и чтения их из файла («кэш»). Скорость на одном из моих дисков выросла с 70-ти секунд до 4-х (при том, что диск - SSD).
----
UPD.
В версию 2.3.1 вкралась ошибка. Исправлена в 2.3.2
Last edited by buniak_a_h on Mon 27 Jul, 2020 05:15, edited 1 time in total.
DV
Posts: 437
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 23 times
Been thanked: 15 times

Реализовать дерево директорий панельным модулем на Луа

Post by DV »

buniak_a_h wrote: Sun 26 Jul, 2020 20:41Исправлена в 2.3.2
В версии 2.3.2 выдаёт при старте:
"FAR3\Profile\Macros\modules\BAX\DialogTools.lua:1: module 'BAX.FlagsTools' not found"
buniak_a_h
Posts: 2129
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Реализовать дерево директорий панельным модулем на Луа

Post by buniak_a_h »

DV, Спасибо, дозалил.
Уж очень муторно каждый раз проверять на чистом профиле …
DV
Posts: 437
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 23 times
Been thanked: 15 times

Реализовать дерево директорий панельным модулем на Луа

Post by DV »

Спасибо!
Несколько пожеланий касательно дружественности к пользователю:
1. Построение дерева для всего диска занимает порядка полутора минут для не самого большого SSD-диска (300 ГБ в моём случае). Всё это время FAR Manager не подаёт никаких признаков жизни. Лучше было бы показать диалог с текстом "Прочитано %u папок" подобно тому, как это делалось в стандартной панели дерева.
2. При чтении дерева из кеша Far Manager выделяет порядка 350 МБ памяти (размер файла кеша - 85 МБ). При повторном чтении дерева из кеша опять выделяется 350 МБ. И, согласно Process Explorer, эта память не освобождается!
3. Закрытие Far Manager при этом (с деревом в памяти) происходит достаточно долго (порядка 20-30 секунд).
Last edited by DV on Tue 28 Jul, 2020 10:13, edited 1 time in total.
Post Reply

Return to “Обсуждение макросов”