Code: Select all
;;
;; Shell Bookmark - закладки в панелях
;; (c) Max Rusov
;; (c) IgorZ
;; (i) Kerberos464
;; http://forum.farmanager.com/viewtopic.php?f=15&t=6137
;;
;; RCtrlShift+БуквыИлиЦифры - Установить закладку
;; RCtrl+БуквыИлиЦифры - Перейти к закладке
;; Ctrl+/ - Меню закладок
;;
;; При переходе с предыдущей версии для корректной работы меню надо создать индекс
;; (RCtrl/ Ins Enter Rescan list). Тупо проверяет наличие всех возможных комбинаций,
;; поэтому увеличение максимальной проверяемой длины комбинации на 1 увеличивает
;; время работы в 36 раз. Надоест ждать - можно прервать Esc. Как альтернатива -
;; прогнать для 1-2-хсимвольных комбинаций, для более длиных отредактировать
;; переменную BookmarkList вручную (SQLiteDB Вам в помощь!).
const MacroLib = "84884660-5B2F-4581-9282-96E00AE109A2"
macro Area="Shell" Description="Shell Bookmark: Start"
Key="RCtrl:Down" EatOnRun=0
{{
%%BookmarkName = "";
}}
macro Area="Shell" Description="Shell Bookmark: Define"
//Key="/RCtrlShift\w/"
Key="RCtrlShift1 RCtrlShift2 RCtrlShift3 RCtrlShift4 RCtrlShift5 RCtrlShift6 RCtrlShift7 RCtrlShift8 RCtrlShift9 RCtrlShift0"
Key="RCtrlShiftA RCtrlShiftB RCtrlShiftC RCtrlShiftD RCtrlShiftE RCtrlShiftF RCtrlShiftG RCtrlShiftH RCtrlShiftI"
Key="RCtrlShiftJ RCtrlShiftK RCtrlShiftL RCtrlShiftM RCtrlShiftN RCtrlShiftO RCtrlShiftP RCtrlShiftQ RCtrlShiftR"
Key="RCtrlShiftS RCtrlShiftT RCtrlShiftU RCtrlShiftV RCtrlShiftW RCtrlShiftX RCtrlShiftY RCtrlShiftZ"
{{
%%BookmarkMode = 1;
%%BookmarkName = %%BookmarkName + substr(AKey(2), -1);
}}
macro Area="Shell" Description="Shell Bookmark: Go to"
//Key="/RCtrl\w/"
Key="RCtrl1 RCtrl2 RCtrl3 RCtrl4 RCtrl5 RCtrl6 RCtrl7 RCtrl8 RCtrl9 RCtrl0"
Key="RCtrlA RCtrlB RCtrlC RCtrlD RCtrlE RCtrlF RCtrlG RCtrlH RCtrlI"
Key="RCtrlJ RCtrlK RCtrlL RCtrlM RCtrlN RCtrlO RCtrlP RCtrlQ RCtrlR"
Key="RCtrlS RCtrlT RCtrlU RCtrlV RCtrlW RCtrlX RCtrlY RCtrlZ"
{{
%%BookmarkMode = 0;
%%BookmarkName = %%BookmarkName + substr(AKey(2), -1);
}}
// Если при нажата CtrlShift и раньше отпускается Ctrl, то макрос на Ctrl:Up не вызывается
// Это затычка, для обхода этой проблемы (ошибка в MacrLib?)
macro Area="Shell" Description="Shell Bookmark: Finish"
Key="Shift:Up"
{{
$if (%%BookmarkName && %%BookmarkMode)
CallPlugin(#%MacroLib, "call GotoBookmark");
$end
}}
macro Area="Shell" Name="GotoBookmark" Description="Shell Bookmark: Finish" Priority=-1
Key="RCtrl:Up"
{{
%Name = %%BookmarkName;
%%BookmarkName = "";
$If ((Len(%Name) == 1) && (Index("0123456789",%Name) != -1))
$If (Eval("RCtrl" + Iif(%%BookmarkMode, "Shift", "") + %Name)==0) $Exit $End
$End
$if (%Name)
%Bookmark = "Folder" + %Name; // FolderA, FolderB, FolderC,...
$if (%%BookmarkMode)
eval("%OldFolder=" + "%%" + %Bookmark + ";")
$if (APanel.Plugin)
%Folder = APanel.Prefix + ":" + APanel.Path;
$else
%Folder = APanel.Path;
$end
$if (%OldFolder)
%Replace = MsgBox("Bookmark " + %Name, "Already assigned to:\n" + %OldFolder + "\n Do you want redefine it?\n", 0x40000);
$if (%Replace != 1)
$exit
$end
$end
%Folder = Prompt("Bookmark " + %Name, "Assign to:", 0x10, %Folder, "Shell.Bokmark");
$if (%Folder == 0)
$exit
$end
eval("%%" + %Bookmark + "=@\"" + %Folder + "\";")
msave("%%" + %Bookmark)
$If (%%BookmarkList)
%%BookmarkList = %%BookmarkList + %Name + "\n";
$Else
%%BookmarkList = %Name + "\n";
$End
MSave("%%BookmarkList")
$else
eval("%Folder=" + "%%" + %Bookmark + ";")
$If (%Folder)
%Start = 0;
$While (%Start < Len(%Folder))
%N1 = Index(Substr(%Folder, %Start), "%")+%Start;
$If (%N1 == %Start-1)
%Start = Len(%Folder);
$Else
%N2 = Index(SubStr(%Folder, %N1+1), "%")+%N1+1;
$If (%N2 == %N1)
%Start = Len(%Folder);
$Else
%EVName = Substr(%Folder, %N1+1, %N2-%N1-1);
%EVVal = Env(%EVName);
$If (Len(%EVVal) != 0)
%Folder = Replace(%Folder, "%"+%EVName+"%", %EVVal);
%Start = 0;
$Else
%Start = %N2;
$End
$End
$End
$End
$if ((substr(%Folder, 1, 1) == ":") || (substr(%Folder, 0, 2) == @"\\"))
panel.setpath(0,%Folder)
$else
Print(%Folder)
Enter
$end
$else
Beep(0x10);
$End
$end
$end
}}
macro Area="Shell" Description="Shell Bookmark: Menu" Key="Ctrl/"
{{
$while (1==1)
%Lines = "";
%List = %%BookmarkList + "\n";
%N = Index(%List, "\n");
$While(%N != -1)
%Key = Substr(%List, 0, %N);
%List = Substr(%List, %N+1);
%N = Index(%List, "\n");
Eval("%Folder=" + "%%Folder" + %Key + ";")
$If(%Folder)
%Lines = %Lines + Iif(Len(%Key) == 1, "&", "") + %Key + Substr(" ", 0, 3 - len(%Key)) + " - " + %Folder + "\n";
$End
$End
%Res = Menu.Show(%Lines, "Bookmarks\nIns - select", 0x10);
$if (%Res == "")
$Exit
$end
$if (Index(%Res, "\n") >= 0)
%Code = Menu.Show("&Edit\n&Delete\n&Cancel\n\1\n&Rescan list", "Bookmarks", 0x8);
$if ((%Code == 0) || (%Code == 3))
$Exit
$end
$while (%Res)
%Pos = Index(%Res, "\n");
$if (%Pos >= 0)
%Str = substr(%Res, 0, %Pos);
%Res = substr(%Res, %Pos + 1);
$else
%Str = %Res;
%Res = "";
$end
%Key = trim(replace(substr(%Str, 0, index(%Str, "-")), "&", ""));
%Bookmark = "Folder" + %Key;
%Folder = substr(%Str, index(%Str, "-") + 2);
$if (%Code == 1)
%Folder = Prompt("Bookmark " + %Key, "Assign to:", 0x10, %Folder, "Shell.Bokmark");
$if (%Folder == 0)
$exit
$end
eval("%%" + %Bookmark + "=@\"" + %Folder + "\";")
msave("%%" + %Bookmark)
$else $If (%Code == 2)
eval("%%" + %Bookmark + "=\"\";")
msave("%%" + %Bookmark)
%%BookmarkList = Substr(Replace("\n"+%%BookmarkList, "\n"+%Key+"\n", "\n"),1);
MSave("%%BookmarkList")
$else//Code == 4
%KeyS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
%N = len(%KeyS);
$If (MsgBox("Rescan bookmark list", "Are You sure? It`s can be too long...", 0x20000) != 1) $Exit $End
%Size = Int(Prompt("Rescan bookmark list", "Input max sequence length"));
%NewList = "";
$Rep(%Size)
%KeySize = %Size - RCounter +1;
%All = 1;
$Rep(%KeySize)
%All = %All * %N;
$End
$Rep(%All)
$If (WaitKey(1, 0) == "Esc")
$If (MsgBox("Rescan bookmark list", "Abort operation?", 0x20000) == 1) $Exit $End
$End
%I = %All - RCounter;
%Key = "";
$Rep(%KeySize)
%J = Mod(%I, %N);
%I = (%I - %J) / %N;
%Key = Substr(%KeyS, %J, 1) + %Key;
$End
Eval("%Folder=" + "%%Folder" + %Key + ";")
$If(%Folder)
%NewList = %NewList + %Key + "\n";
$End
$End
$End
$If (MsgBox("Rescan bookmark list", "Old list:\n\n" + %%BookmarkList + "\nNewList:\n\n" + %NewList + "\nReplace old with new?", 0x20000) != 1)
$Exit
$End
%%BookmarkList = %NewList;
MSave("%%BookmarkList")
$end $end
$end
$Exit
$end
%Folder = substr(%Res, index(%Res, "-") + 2);
$If (%Folder)
%Start = 0;
$While (%Start < Len(%Folder))
%N1 = Index(Substr(%Folder, %Start), "%")+%Start;
$If (%N1 == %Start-1)
%Start = Len(%Folder);
$Else
%N2 = Index(SubStr(%Folder, %N1+1), "%")+%N1+1;
$If (%N2 == %N1)
%Start = Len(%Folder);
$Else
%EVName = Substr(%Folder, %N1+1, %N2-%N1-1);
%EVVal = Env(%EVName);
$If (Len(%EVVal) != 0)
%Folder = Replace(%Folder, "%"+%EVName+"%", %EVVal);
%Start = 0;
$Else
%Start = %N2;
$End
$End
$End
$End
// Goto
$if ((substr(%Folder, 1, 1) == ":") || (substr(%Folder, 0, 2) == @"\\"))
panel.setpath(0,%Folder)
$else
Print(%Folder)
Enter
$end
$Exit
$End
$end
}}