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

Здесь обсуждается всё, что касается макросов.
Post Reply
buniak_a_h
Posts: 1610
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 109 times
Been thanked: 141 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 - давно забытая утилитка. Получился довольно небольшой и вполне пригодный модуль. Позволяет открывать-закрывать узлы дерева, задавать глубину, на которую первоначально открываются узлы; просматривать в пассивной панели текущую папку и переходить в панели дерева на выбранную папку.



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

Версия 1.4.1
  1. Реализовано построение дерева при вызове из панели плагина ArcLite (с некоторыми ограничениями)
  2. Очередная попытка навести порядок с корневой папкой при старте модуля и с папкой возврата.
  3. Положено начало локализации скрипта. Для этого требуется модуль BAX.GetMsg (обсуждение)
TreePanel_1_4_1.7z
(10.45 KiB) Downloaded 14 times


1)Корневой каталог - каталог, который вместе с вложенными показан на дереве.
Last edited by buniak_a_h on Mon 30 Mar, 2020 04:37, edited 11 times in total.

User avatar
John Doe
Бюрократ
Posts: 12740
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 36 times
Been thanked: 283 times

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

Post by John Doe »

Latest post of the previous page:

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

Я разумеется глубоко не вникал в код вашего скрипта, и не вполне представляю что там происходит, но возможно надо учитывать тот факт, что папка попадает в историю не при заходе в неё, а при выходе.
https://t.me/FarManager — Telegram чат

buniak_a_h
Posts: 1610
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 109 times
Been thanked: 141 times
Contact:

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

Post by buniak_a_h »

HaRT wrote:
Wed 25 Mar, 2020 17:20
Вас попросили привести пример кода (конкретный и самодостаточный), где не работает отключение занесения директорий в историю.
TreePanel.lua.7z
Вот.
(6.84 KiB) Downloaded 3 times
John Doe wrote:
Wed 25 Mar, 2020 17:35
Наиболее вероятно что Far.DisableHistory просто может не иметь смысла вне клавиатурного макроса: например, назначьте вспомогательный макрос для навигации на какую-либо клавишу, и примените Far.DisableHistory там.

Я разумеется глубоко не вникал в код вашего скрипта, и не вполне представляю что там происходит, но возможно надо учитывать тот факт, что папка попадает в историю не при заходе в неё, а при выходе.
Я так и подумал. Панельный модуль - это не макрос, а в описании Far.DisableHistory написано:
Позволяет выключать добавление пунктов в истории во время воспроизведения текущего макроса.
Значит, надо выключать как-то через far:config("System.SaveFoldersHistory"). Или через SQLite (key : System, name : SaveFoldersHistory)

buniak_a_h
Posts: 1610
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 109 times
Been thanked: 141 times
Contact:

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

Post by buniak_a_h »

DV wrote:
Tue 24 Mar, 2020 22:27
И небольшое пожелание по поведению: на мой взгляд, при активном "Автоматически отображать содержимое папки на пассивной панели" имеет смысл либо опционально, либо безусловно отключать добавление просмотренных папок в историю папок. А то сейчас при навигации по дереву история папок может резко увеличиться на несколько сотен пунктов.
Версия 1.3.3.
Last edited by buniak_a_h on Thu 26 Mar, 2020 11:52, edited 1 time in total.

DV
Posts: 394
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 15 times
Been thanked: 14 times

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

Post by DV »

Пожалуй, меня смущает в макросе вот что: я не понимаю, каким образом выбирается папка, в которую я попадаю при выходе из дерева (когда панель дерева закрывается и я возвращаюсь в файловую панель)...
Мои ожидания: либо та папка, которая была активна в файловой панели до показа дерева, либо та папка, в которой я находился в дереве до его закрытия.
Реальность: ??? (я так и не понял, что эта за папка)
Last edited by DV on Thu 26 Mar, 2020 14:19, edited 1 time in total.

buniak_a_h
Posts: 1610
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 109 times
Been thanked: 141 times
Contact:

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

Post by buniak_a_h »

DV, вообще-то, должна быть та папка, которая была открыта до показа дерева. Хотя пару раз я почему-то попадал не туда, повторить не могу. Эта болезнь была и в других плагиновых панелях, я даже где-то писал, и со мной согласились. Искать не буду. Тоже сейчас не могу воспроизвести на временной панели. Может, исправили и я зря там предпринимал действия для выхода "обратно". Опишите, пож., как сделать, чтоб попасть не туда. Начиная от того, как дерево вызывается (есть 3 варианта) и до того, как выходите (CtrlPgDn - намеренный переход на текущую) (Enter на .., CtrlPgUp, F10)?

DV
Posts: 394
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 15 times
Been thanked: 14 times

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

Post by DV »

Вхожу через F11 - Tree panel (кстати, у себя я убрал '[ ' и ' ]' вокруг имени макроса).
Выхожу через F10 или по Enter на самом верхнем (пустом) элементе дерева.
Кстати, при навигации по дереву я часто нажимаю Enter (например, для раскрытия вложенных узлов). И у меня такое впечатление, что нажатия Enter, равно как и нажатия на стрелочки (вверх, вниз, вправо, влево) передаются из панели дерева в реальную файловую панель.

buniak_a_h
Posts: 1610
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 109 times
Been thanked: 141 times
Contact:

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

Post by buniak_a_h »

DV, спасибо. Неправильно запоминался стартовый каталог при вызове через меню плагинов (F11). Исправил (версия 1.3.4).
DV wrote:
Thu 26 Mar, 2020 15:35
кстати, у себя я убрал '[ ' и ' ]' вокруг имени макроса
Я специально для себя вставил, чтоб в начале МЕНЮ было. Во время разработки часто вызывать приходилось - чтоб (а) не искать и (б) не присваивать символ-акселератор

User avatar
HaRT
Moderator
Posts: 9336
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 100 times
Been thanked: 213 times

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

Post by HaRT »

buniak_a_h wrote:
Thu 26 Mar, 2020 17:38
не присваивать символ-акселератор
А какая ценность в таком решении? Акселераторы ведь как раз для быстрого частого вызова и предназначены.
Фар есть инструмент, а не нянька. © 2009 DrKnS

buniak_a_h
Posts: 1610
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 109 times
Been thanked: 141 times
Contact:

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

Post by buniak_a_h »

HaRT wrote:
Thu 26 Mar, 2020 18:15
buniak_a_h wrote:
Thu 26 Mar, 2020 17:38
не присваивать символ-акселератор
А какая ценность в таком решении? Акселераторы ведь как раз для быстрого частого вызова и предназначены.
1. В меню выбора букву не хочу принципиально; буква должн быть буквой диска. А цифры у меня заняты с 1 до 7.
2. В меню плагинов - все буквы и цифры уже заняты. Почти. Ну, т.е. искать надо… А мне лень.
Last edited by buniak_a_h on Thu 26 Mar, 2020 18:57, edited 1 time in total.

DV
Posts: 394
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 15 times
Been thanked: 14 times

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

Post by DV »

Я назначил '[' на вызов Tree panel что в меню плагинов, что в меню дисков :)

citRiks
Posts: 493
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 149 times
Been thanked: 41 times

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

Post by citRiks »

buniak_a_h, Лень - мать всех пороков :)
А я поражаюсь что дерево архива никому не надо. И кэш. Вроде просто же делается.
планирую переписать ваше дерево, но у меня нет не только лени, но еще и времени :(

buniak_a_h
Posts: 1610
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 109 times
Been thanked: 141 times
Contact:

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

Post by buniak_a_h »

citRiks wrote:
Thu 26 Mar, 2020 21:00
дерево архива никому не надо
Вообще-то, надо. Просили уже после Вас.

citRiks
Posts: 493
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 149 times
Been thanked: 41 times

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

Post by citRiks »

buniak_a_h wrote:
Thu 26 Mar, 2020 22:30
Вообще-то, надо. Просили уже после Вас.
Олени.
Ок, "Олени" интересуются, когда будет? :)

buniak_a_h
Posts: 1610
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 109 times
Been thanked: 141 times
Contact:

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

Post by buniak_a_h »

citRiks wrote:
Fri 27 Mar, 2020 07:36
Ок, "Олени" интересуются, когда будет?
Передайте им, что вариант 1.4.1 сделан, не сильно тестирован - возможны ошибки и ограничения.

citRiks
Posts: 493
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 149 times
Been thanked: 41 times

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

Post by citRiks »

buniak_a_h wrote:
Sun 08 Mar, 2020 22:31
Опять же если будут добровольцы - локализацию и перевод хелпа были бы полезны. Если скрипт кому-нить покажется полезным …
я бы посоветовал просто сделать элементарный гугле-перевод и тиснуть на бусурманский форум.
Только обороты вроде "кому-нить" надо исправить на более литератруные предварительно )
чай не баре, прочитают как есть, не понравится перевод - пусть предложат свой.

citRiks
Posts: 493
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 149 times
Been thanked: 41 times

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

Post by citRiks »

buniak_a_h wrote:
Mon 30 Mar, 2020 04:39
Передайте им, что вариант 1.4.1 сделан, не сильно тестирован - возможны ошибки и ограничения.
Потестил, вродь работаить, пасиба )
То что не работает - это переход в архивах из дерева на противоположную панель
Это легко доделать?
Может быть вам в помошь тут окажется вот эта функция:

Code: Select all

local naive_path
local function fnc_set_same(the_pan, dir_enter)

	local dir = panel.GetPanelDirectory(nil, 1 - the_pan)
	local itm = panel.GetCurrentPanelItem(nil, 1 - the_pan)
	local is_dir, sz_full_path, hard_links_cnt
	local plain_path = dir.Name.."\\"..itm.FileName
	local time_now = Far.UpTime
	local is_fast_enough = dt_goto and plain_path == naive_path and (time_now - dt_goto < DIR_ENTER_INT)
	seq_cnt = is_fast_enough and not (seq_cnt > 2) and (seq_cnt or 0) + 1 or 0
	link_enter = seq_cnt > 1 and 1 or 0
	dir_enter = seq_cnt % 2 == 1
	dt_goto = time_now
        naive_path = plain_path

	if APanel.DriveType == -1
	then	is_dir = false
		sz_full_path = APanel.HostFile
	else	is_dir = itm.FileAttributes:find("d")
		sz_full_path = far.ConvertPath(dir.Name.."\\"..itm.FileName, link_enter)
		hard_links_cnt = Panel.Item(ACT_PAN, APanel.CurPos, 9)
		if	hard_links_cnt > 1 
		then	sz_full_path = fnc_show_hard_links_choice(sz_full_path) end
	end

	local	res_set_path
	if	is_dir and dir_enter
	then	panel.SetPanelDirectory(nil, the_pan, sz_full_path)
	else	res_set_path = APanel.DriveType == -1 and APanel.HostFile == PPanel.HostFile 
		if	APanel.DriveType ~= -1 or not res_set_path
		then	res_set_path = Panel.SetPath(1 - the_pan, mf.fsplit(sz_full_path, 3), mf.fsplit(sz_full_path, 12)) 
		end
	end
	if	APanel.DriveType == -1 and res_set_path 
	then	if	PPanel.DriveType ~= -1 and PPanel.HostFile == ""
		then	Keys("Tab CtrlPgDn Tab") end
		if	APanel.HostFile == PPanel.HostFile 
		then	Panel.SetPath(1, APanel.Path, APanel.Current) end
	end
end
она делает позиционирование на пассивной панели файла который в активной.
Прекрасно работает и в архивах, т.е. понимает что файл в архиве и позиционирует в архивe.
и еще нет перечитывания архива если, архив не поменялся, а был переход внутри архива, что важно для больших архивов.
Поделился добрый дедушка @XeRoX, из скрипта Shell-Same-File-position.@Xer0X.lua тута:
https://github.com/dr-dba/LUA-FAR-STUFF ... 0Xer0X.lua
Shell-Same-File-position.@Xer0X.Lua.7z
(1.99 KiB) Not downloaded yet
Last edited by citRiks on Mon 30 Mar, 2020 09:50, edited 2 times in total.

Post Reply

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