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

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 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.6.
  1. Исправлен «снос» имени текущей папки в командную строку: теперь оно заменяет отмеченную часть командной строки или (если ничего не отмечено) вставляется в текущую позицию строки.
  2. Исправлена мелкая неточность: вопрос о пересоздании кэша задаётся только в том случае, если задан период актуализации кэша
TreePanel_2_6_6.7z
(31.08 KiB) Downloaded 143 times


1)Корневой каталог - каталог, который вместе с вложенными показан на дереве.
Last edited by buniak_a_h on Mon 14 Dec, 2020 07:40, edited 37 times in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Latest post of the previous page:

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

Я разумеется глубоко не вникал в код вашего скрипта, и не вполне представляю что там происходит, но возможно надо учитывать тот факт, что папка попадает в историю не при заходе в неё, а при выходе.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

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

Post by buniak_a_h »

HaRT wrote: Wed 25 Mar, 2020 17:20 Вас попросили привести пример кода (конкретный и самодостаточный), где не работает отключение занесения директорий в историю.
TreePanel.lua.7z
Вот.
(6.84 KiB) Downloaded 21 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)
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 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: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

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

Post by DV »

Пожалуй, меня смущает в макросе вот что: я не понимаю, каким образом выбирается папка, в которую я попадаю при выходе из дерева (когда панель дерева закрывается и я возвращаюсь в файловую панель)...
Мои ожидания: либо та папка, которая была активна в файловой панели до показа дерева, либо та папка, в которой я находился в дереве до его закрытия.
Реальность: ??? (я так и не понял, что эта за папка)
Last edited by DV on Thu 26 Mar, 2020 14:19, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

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

Post by buniak_a_h »

DV, вообще-то, должна быть та папка, которая была открыта до показа дерева. Хотя пару раз я почему-то попадал не туда, повторить не могу. Эта болезнь была и в других плагиновых панелях, я даже где-то писал, и со мной согласились. Искать не буду. Тоже сейчас не могу воспроизвести на временной панели. Может, исправили и я зря там предпринимал действия для выхода "обратно". Опишите, пож., как сделать, чтоб попасть не туда. Начиная от того, как дерево вызывается (есть 3 варианта) и до того, как выходите (CtrlPgDn - намеренный переход на текущую) (Enter на .., CtrlPgUp, F10)?
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

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

Post by DV »

Вхожу через F11 - Tree panel (кстати, у себя я убрал '[ ' и ' ]' вокруг имени макроса).
Выхожу через F10 или по Enter на самом верхнем (пустом) элементе дерева.
Кстати, при навигации по дереву я часто нажимаю Enter (например, для раскрытия вложенных узлов). И у меня такое впечатление, что нажатия Enter, равно как и нажатия на стрелочки (вверх, вниз, вправо, влево) передаются из панели дерева в реальную файловую панель.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 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: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

buniak_a_h wrote: Thu 26 Mar, 2020 17:38 не присваивать символ-акселератор
А какая ценность в таком решении? Акселераторы ведь как раз для быстрого частого вызова и предназначены.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 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: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

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

Post by DV »

Я назначил '[' на вызов Tree panel что в меню плагинов, что в меню дисков :)
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

buniak_a_h, Лень - мать всех пороков :)
А я поражаюсь что дерево архива никому не надо. И кэш. Вроде просто же делается.
планирую переписать ваше дерево, но у меня нет не только лени, но еще и времени :(
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

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

Post by buniak_a_h »

citRiks wrote: Thu 26 Mar, 2020 21:00 дерево архива никому не надо
Вообще-то, надо. Просили уже после Вас.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

buniak_a_h wrote: Thu 26 Mar, 2020 22:30 Вообще-то, надо. Просили уже после Вас.
Олени.
Ок, "Олени" интересуются, когда будет? :)
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

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

Post by buniak_a_h »

citRiks wrote: Fri 27 Mar, 2020 07:36 Ок, "Олени" интересуются, когда будет?
Передайте им, что вариант 1.4.1 сделан, не сильно тестирован - возможны ошибки и ограничения.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

buniak_a_h wrote: Sun 08 Mar, 2020 22:31 Опять же если будут добровольцы - локализацию и перевод хелпа были бы полезны. Если скрипт кому-нить покажется полезным …
я бы посоветовал просто сделать элементарный гугле-перевод и тиснуть на бусурманский форум.
Только обороты вроде "кому-нить" надо исправить на более литератруные предварительно )
чай не баре, прочитают как есть, не понравится перевод - пусть предложат свой.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 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) Downloaded 15 times
Last edited by citRiks on Mon 30 Mar, 2020 09:50, edited 2 times in total.
Post Reply

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