Page 1 of 2
Меню со списком родительских папок (CD up)
Posted: Mon 18 Jul, 2011 11:47
by Shmuel
DV wrote: Портировал ли кто этот (или подобный) макрос под FAR3?
Независимая реализация той же функциональности + выравнивание по правому краю слишком длинных пунктов меню:
local function FillTable( t, path)
while true do
path = path: match( "(.*)\\ [^\\ ]+$" )
if path== nil then break end
t[ # t+ 1 ] = { path= path.. "\\ " }
end
end
local function ShowMenu( )
local items = { }
if APanel. Plugin then
FillTable( items, APanel. Path)
if items[ 1 ] then items[ # items+ 1 ] = { separator= true } end
items[ # items+ 1 ] = { path= APanel. Path0 }
end
FillTable( items, APanel. Path0)
if items[ 1 ] then
for k, v in ipairs ( items) do
if v. path then
local extra = v. path: len( ) - Far. Width + 8
v. text = extra<= 0 and v. path or "..." .. v. path: sub( extra+ 4 )
end
end
local item = far. Menu( { Title= "Go to ..." } , items)
if item then Panel. SetPath( 0 , item. path) end
end
end
Macro {
description= "Menu with list of parent directories (CD up)" ;
area= "Shell" ; key= "CtrlBS" ;
condition= function ( ) return CmdLine. Empty and APanel. Visible end ;
action= ShowMenu;
}
Есть и ещё одна реализация на основе этого кода:
GoUp .
HaRT wrote: ↑ Mon 09 May, 2016 21:05 Представляю на суд общественности свой вариант, сделанный на основе выложенного в шапке.
Отличия:
1. Добавлены горячие клавиши от 0 до Z, далее просто выравнивание пробелами.
2. Выбор элемента означает
не переход
в директорию,
а переход
на директорию — об этом напоминает отсутствие разделителя (‘\’) на концах путей.
3. При попытке перехода на саму букву диска открывается меню дисков.
4. Макрос назначен на
AltPgUp
.
Re: Меню со списком родительских папок (CD up)
Posted: Mon 18 Jul, 2011 12:16
by Kerberos464
DV wrote: Помнится, был такой плагин - CDup - позволяющий прыгать из текущей папки в любую родительскую, вплоть до корня диска.
Теперь, с появлением макрофункции
Menu.Show , это стало возможно и без плагина:
Code: Select all
$If (CmdLine.Empty && APanel.Visible && !APanel.Plugin) %mm = ""; %p = APanel.Path; %i = rindex(%p,"\\"); $While (%i >= 2) %p = substr(%p,0,%i); %mm = %mm + %p + "\\\r\n"; %i = rindex(%p,"\\"); $End $If (%mm != "") %p = Menu.Show(%mm, "Go to ..."); $If (%p != "") panel.setpath(0,%p); $End $End $End
Вешаем макрос на клавишу BS - и вуаля!
спасибо, удобно!
Re: Меню со списком родительских папок (CD up)
Posted: Mon 18 Jul, 2011 12:31
by Wave
Не работает на нефайловых панелях. В частности, на RegBrowser. Ну и на Bs лично у меня висит гораздо более привычный CtrlPgUp. Этот повесил на CtrlBs в обвязке с ещё одним.
Re: Меню со списком родительских папок (CD up)
Posted: Mon 18 Jul, 2011 12:38
by HaRT
Лично у меня
подобное дано назначено на
AltPgUp .
Re: Меню со списком родительских папок (CD up)
Posted: Mon 18 Jul, 2011 13:04
by DV
HaRT wrote: Лично у меня
подобное дано назначено на
AltPgUp .
Но где же сам макрос?
Re: Меню со списком родительских папок (CD up)
Posted: Mon 18 Jul, 2011 13:26
by HaRT
DV wrote: Но где же сам макрос?
У меня не макрос, а скрипт для
SHPCE (мир его праху).
Да к тому же
вроде бы похожая функциональность уже была реализована в плагине HotDir .
Re: Меню со списком родительских папок (CD up)
Posted: Mon 18 Jul, 2011 14:19
by Maximus5
макрос, поддерживающий плагиновые панели
Re: Меню со списком родительских папок (CD up)
Posted: Mon 18 Jul, 2011 20:17
by DAtaMan
Code: Select all
$If (APanel.Visible)
%Items = "";
%Path = APanel.Path;
$If(%Path == "")
%Items = APanel.Path0 + "\n";
%FileName = FSplit(APanel.HostFile, FSPLIT_NAME) + FSplit(APanel.HostFile, FSPLIT_EXT);
$Else
%FileName = FSplit(APanel.Path, FSPLIT_NAME);
%I = RIndex(%Path, "\\");
$While (%I >= 0)
%Path = Substr(%Path, 0, %I);
%Items = %Items + %Path + "\\\n";
%I = RIndex(%Path, "\\");
$End
$End
%Items = %Items + "\1 Disks\n";
%I = 65;
$While (%I <= 90)
$If (FExist(Chr(%I) + ":"))
%Items = %Items + Chr(%I) + ":\\\n";
$End
%I = %I + 1;
$End
$If (%Items != "")
%Path = Menu.Show(%Items, "Go to ...");
$If (%Path != "")
Panel.SetPath(0, %Path, %FileName);
$End
$End
$End
Во флагах макроса:
Вроде работает в редакторах реестра, ArcLite и Observer.
Re: Меню со списком родительских папок (CD up)
Posted: Tue 19 Jul, 2011 07:09
by igor_andreev
Вах, как сразу удобно стало, всем спасибо
Re: Меню со списком родительских папок (CD up)
Posted: Wed 20 Jul, 2011 20:55
by DAtaMan
Code: Select all
$If (APanel.Visible)
%Items = "";
%Path = APanel.Path;
$If(%Path == "")
%Items = APanel.Path0 + "\n";
%FileName = FSplit(APanel.HostFile, FSPLIT_NAME) + FSplit(APanel.HostFile, FSPLIT_EXT);
$Else
%FileName = FSplit(APanel.Path, FSPLIT_NAME) + FSplit(APanel.Path, FSPLIT_EXT);
%I = RIndex(%Path, "\\");
$While (%I >= 0)
%Path = Substr(%Path, 0, %I);
%Items = %Items + %Path + "\\\n";
%I = RIndex(%Path, "\\");
$End
$End
%InitDiskItems = "\1 Disks\n";
%Items = %Items + %InitDiskItems;
%I = 65;
$While (%I <= 90)
$If (FExist(Chr(%I) + ":"))
%Items = %Items + "&" + Chr(%I) + ":\\\n";
$End
%I = %I + 1;
$End
$If (%Items != ("\n" + %InitDiskItems))
%Path = Menu.Show(%Items, "Go to ...", 0x290);
$If (%Path != "")
%LfPos = Index(%Path, "\n");
$If(%LfPos >= 0)
%APath = Substr(%Path, 0, %LfPos);
$If(Substr(%APath, 0, 1) == "&")
%APath = Substr(%APath, 1);
$End
Panel.SetPath(0, %APath, %FileName);
%PPath = Substr(%Path, %LfPos + 1);
%LfPos = Index(%PPath, "\n");
$If(%LfPos >= 0)
%PPath = Substr(%PPath, 0, %LfPos);
$If(Substr(%PPath, 0, 1) == "&")
%PPath = Substr(%PPath, 1);
$End
Panel.SetPath(1, %PPath, %FileName);
$End
$Else
$If(Substr(%Path, 0, 1) == "&")
%Path = Substr(%Path, 1);
$End
Panel.SetPath(0, %Path, %FileName);
$End
$End
$End
$End
1. Добавлены хоткеи.
2. Возможна пометка нескольких путей. Тогда 1-ый отмеченный сверху - путь для активной панели, 2-ой - для пассивной.
Re: Меню со списком родительских папок (CD up)
Posted: Wed 20 Jul, 2011 22:18
by Wave
Макролиб ругается на FSPLIT_NAME (подозреваю, что следом ругнётся и на FSPLIT_EXT).
Re: Меню со списком родительских папок (CD up)
Posted: Wed 20 Jul, 2011 23:06
by DAtaMan
Wave wrote: Макролиб ругается на FSPLIT_NAME (подозреваю, что следом ругнётся и на FSPLIT_EXT).
Даже если импортировать "Addons\Macros\MacroConsts.reg" ?
Re: Меню со списком родительских папок (CD up)
Posted: Thu 21 Jul, 2011 08:38
by DV
Раз уж пошла такая пьянка
то вот расширенный вариант самого первого макроса:
Code: Select all
$If (CmdLine.Empty && APanel.Visible)
%p = APanel.Path; %mm = ""; %n = 0;
$While (%n < 2)
%i = rindex(%p,"\\");
$If (%i >= 0)
%a = 1;
$If (%i == len(%p) - 1)
%a = 0;
$End
%p = substr(%p,0,%i);
$If (%a == 1 && %p != "\\" && (%p != "" || rindex(%mm, "\\\\") < 0))
%mm = %mm + %p + "\\\n";
$End
$Else
%n = %n + 1;
$If (%n == 1 && APanel.Plugin && APanel.Path != APanel.Path0)
%p = APanel.Path0;
$If (%mm != "")
%mm = %mm + "\1\n";
$End
%mm = %mm + %p + "\n";
$Else
%n = 2;
$End
$End
$End
$If (%mm != "" && %mm != "\1")
%p = Menu.Show(%mm, "Go to ...");
$If (%p != "" && %p != 0)
panel.setpath(0,%p);
$End
$End
$End
Что умеет: находясь внутри архива (плагин arclite) или же реестра (плагин registry), показывает двойной список "родительских" папок - сначала для плагиновой панели, потом для файловой панели, позволяя "выпрыгнуть" из архива в любую реальную папку выше. Также добавлена некоторая "магия" для исключения элементов "\" и "\\" из списка для плагина network.
Не умеет: показывать буквы дисков, но это можно прикрутить по желанию
Re: Меню со списком родительских папок (CD up)
Posted: Fri 13 Dec, 2013 16:41
by DV
Портировал ли кто этот (или подобный) макрос под FAR3?
Re: Меню со списком родительских папок (CD up)
Posted: Fri 13 Dec, 2013 16:55
by Shmuel
DV wrote: Портировал ли кто этот (или подобный) макрос под FAR3?
Только что, конвертером.
local function ff( )
if CmdLine. Empty and APanel. Visible then
p = APanel. Path; mm = "" ; n = 0 ;
while n < 2 do
i = mf. rindex( p, "\\ " ) ;
if i >= 0 then
a = 1 ;
if i == mf. len( p) - 1 then
a = 0 ;
end
p = mf. substr( p, 0 , i) ;
if a == 1 and p ~= "\\ " and ( p ~= "" or mf. rindex( mm, "\\ \\ " ) < 0 ) then
mm = mm .. p .. "\\ \n " ;
end
else
n = n + 1 ;
if n == 1 and APanel. Plugin and APanel. Path ~= APanel. Path0 then
p = APanel. Path0;
if mm ~= "" then
mm = mm .. "\1 \n " ;
end
mm = mm .. p .. "\n " ;
else
n = 2 ;
end
end
end
if mm ~= "" and mm ~= "\1 " then
p = Menu. Show( mm, "Go to ..." ) ;
if p ~= "" and p ~= 0 then
Panel. SetPath( 0 , p) ;
end
end
end
end
Macro {
description= "Меню со списком родительских папок (CD up)" ;
area= "Shell" ; key= "CtrlShiftA" ;
action= function ( ) ff( ) end ;
}