| 
 | 
| Название | TabTools | 
| Имя файла (*.txt) | TabTools.txt | 
| Описание | Выдает список всех вкладок на обеих панелях с названиями, путями и обозначением статуса. Содержит подменю операций со вкладками. | 
| Автор | Вахмурка | 
| Параметры | - | 
| Вызываемые плагины | win, ini, tc, childwin, miscplugin, file, vec | 
| Иконка | 
 | 
    
| Версия | 5.4 | 
| Дата обновления | 26.02.2011 | 
| Вызываемые модули | ReadTabs, ParsePath, TMTC, CloseAllTabs | 
static hwnd = win.handle("c=TTOTAL_CMD")
global Config = "путь/wincmd.ini"
global TT = cl.Create("Tabs", 1)
;директория "TabTools" папки "scripts" создается пользователем.
;В эту директорию копируются файлы TabTools.txt, TT.icl и TabTools.ini
global TW = pprofolder ++ "scripts/TabTools/TabTools.ini"
static Icons = pprofolder ++ "scripts/TabTools/TT.icl"
static Quote = esc(?+\"+, ?+\+)
static OpQuote = esc(?+\d171+, ?+\+)
static ClQuote = esc(?+\d187+, ?+\+)
static CR = esc(?+\n+, ?+\+)
static Slash = esc(?+\\+, ?+\+)
static NoMess
local LTabs, RTabs, Temp, Number, Stat, Comm, FS, BS, MaxText, i
win.sendmessage(hwnd, 0x400+51, 580, 0)
if(ini.check_exists(TW, "Configuration", "NoMessage") == 3) do
	Temp = ini.get(TW, "Configuration", "NoMessage")
	NoMess = case("lower", Temp)
endif
if(ini.check_exists(TW, "FontColor", "Source") == 3)
	FS = ini.get(TW, "FontColor", "Source")
if(ini.check_exists(TW, "BackColor", "Source") == 3)
	BS = ini.get(TW, "BackColor", "Source")
Comm = ini.get(TW, "Configuration", "Labels")
;Sub_ReadTabs - имя скрипта ReadTabs 
LTabs = runfile.Subs\Sub_ReadTabs("left")
RTabs = runfile.Subs\Sub_ReadTabs("right")
if(max(Ltabs, RTabs) > ini.get(TW, "Configuration", "MaxTabs"))
	TT.AddProperties("Format=IconSize: 16")
Number = TT.Length
MaxText = ini.get(TW, "Configuration", "MaxText")
for(i = 0; i < Number; i++)
	Temp = TT.GetMiddleCmd(i)
	if(Temp == 1 && tc.active(hwnd) == "left" && TT.GetLeftOnTop(i)) do
		TT.SetTextColor(i, FS)
		TT.SetBackColor(i, BS)
	endif
	if(Temp == 2 && tc.active(hwnd) == "right" && TT.GetLeftOnTop(i)) do
		TT.SetTextColor(i, FS)
		TT.SetBackColor(i, BS)
	endif
	Stat = TT.GetLeftCmd(i)
	TT.ClearRight(i)
;TabTools - имя скрипта TabTools (рекурсивный вызов)	
	TT.AddRight(i, cb("TabTools/TabTools@CloseTab", Stat))
	TT.SetHeight(i, Stat)
	Stat = ifelse(Temp == 1, 5201 + Stat, 5301 + Stat)
	TT.ClearLeft(i)
	TT.AddLeft(i, "win.sendmessage(hwnd, 0x400+51, " ++ Stat ++ ", 0)")
	if(Comm == 0) do
		Temp = TT.GetToolTip(i)
	elseif(Comm == 1)
		Temp = TT.GetId(i)
	elseif(Comm == 2)
		Temp = TT.GetId(i)
		Stat = TT.GetToolTip(i)
		if(Stat)
			Stat = " = " ++ OpQuote ++ Stat ++ ClQuote
		Temp = Temp ++ Stat
	endif
	if(length(Temp) > MaxText)
		Temp = select(Temp, MaxText) ++ "..."
	TT.SetLabel(i, Temp)
	Temp = "Path: " ++ OpQuote ++ TT.GetId(i) ++ ClQuote
	if(TT.GetToolTip(i))
		Temp = Temp ++ "/Caption: " ++ OpQuote ++ TT.GetToolTip(i) ++ ClQuote
	TT.SetTooltip(i, Temp)
endfor
TT.Insert(LTabs)
TT.AddLeft(LTabs, "Format NewColumnLine")
TT.SetId(LTabs, "Vertical Separator")
TT.AddRight(LTabs, RTabs)
TT.AddMiddle(LTabs, LTabs)
if(not ini.get(TW, "Configuration", "IncludeCommands")) do
	*menu show Tabs
	quit all
endif
if(LTabs < RTabs) do
	Temp = LTabs
	Number = RTabs - LTabs
elseif(LTabs > RTabs)
	Temp = LTabs + RTabs + 1
	Number = LTabs - RTabs
elseif(LTabs == RTabs)
	Number = 0
endif
for(i = 0; i < Number; i++)
	TT.Insert(Temp + i)
	TT.SetIconVisible(Temp + i, 0)
	TT.SetEnabled(Temp + i, 0)
	TT.SetTooltip(Temp + i, "TabTools 5.3/(C) Vochomurka/2005-2009")
endfor
Temp = TT.GetIdIndex("Vertical Separator")
TT.Insert(Temp)
TT.AddLeft(Temp, "Format Separator")
Number = TT.Length
TT.Insert(Number)
TT.AddLeft(Number, "Format Separator")
Comm = 6
Temp++
TT.Insert(Temp)
TT.AddLeft(Temp, "Format EndSubMenu")
TT.Insert(Temp)
TT.AddLeft(Temp, "Format StartSubMenu")
TT.SetLabel(Temp, "Left Panel Tabs")
Number = TT.Length
TT.Insert(Number)
TT.AddLeft(Number, "Format EndSubMenu")
TT.Insert(Number)
TT.AddLeft(Number, "Format StartSubMenu")
TT.SetLabel(Number, "Right Panel Tabs")
for(i = 1; i <= 2; i++)
	Stat = i*(Temp + i) + (i - 1)*Comm
	TT.Insert(Stat)
;TabTools - имя скрипта TabTools (рекурсивный вызов)
	TT.AddLeft(Stat, cb("TabTools/TabTools@PathVal", i, 1))
	TT.AddRight(Stat, cb("TabTools/TabTools@PathVal", i, 0))
	TT.SetLabel(Stat, "Check Path &Validity")
	TT.SetIcon(Stat, Icons, 3)
	TT.SetTooltip(Stat, "Left - Check & ask to close/Right - Close silently")
	TT.Insert(Stat)
	TT.AddLeft(Stat, cb("TabTools/TabTools@CloseDups", i))
	TT.SetLabel(Stat, "Close Opposite &Dups")
	TT.SetIcon(Stat, Icons, 4)
	TT.SetTooltip(Stat, "Close duplicate tabs in opposite panel")
	TT.Insert(Stat)
	TT.AddLeft(Stat, cb("TabTools/TabTools@Alias", i))
	TT.SetLabel(Stat, "&Alias")
	TT.SetIcon(Stat, Icons, 5)
	FS = "Change tab captions according to settings in TabTools.ini, sections [Caption] & [Alias]"
	TT.SetTooltip(Stat, FS)
	TT.Insert(Stat)
	TT.AddLeft(Stat, cb("TabTools/TabTools@Highlight", i, 1))
	TT.AddRight(Stat, cb("TabTools/TabTools@Highlight", i, 0))
	TT.SetLabel(Stat, "&Highlight Tab(s)")
	TT.SetIcon(Stat, Icons, 6)
	TT.SetTooltip(Stat, "Left - highlight tab(s)/Right - clear highlighting")
	TT.Insert(Stat)
	TT.AddLeft(Stat, cb("TabTools/TabTools@CloseAllTabs", i))
	TT.SetLabel(Stat, "&Close All Tabs")
	TT.SetIcon(Stat, Icons, 7)
	TT.SetTooltip(Stat, "Close all tabs, independent of lock status")
	TT.Insert(Stat)
	TT.AddLeft(Stat, cb("TabTools/TabTools@MultiFind", i))
	TT.SetLabel(Stat, "&Find in All Tabs")
	TT.SetIcon(Stat, Icons, 8)
	TT.SetTooltip(Stat, "Open 'Find File' dialog box with 'Search in' field filled with paths of all tabs")
endfor
if(ini.get(TW, "Configuration", "SmallIcons")) do
	TT.AddProperties("Format=IconSize: 16")
 else
	TT.AddProperties("Format=IconSize: 32")
endif
TT.AddProperties("Format=tooltips")
if(ini.check_exists(TW, "Configuration", "AnyProps") == 3)
	TT.AddProperties(ini.get(TW, "Configuration", "AnyProps"))
TT.showmenu()
quit all
//******************************************************************
Function Alias(Panel)
;Sub_TMTC - имя скрипта TMTC
local Temp = runfile.Subs\Sub_TMTC(hwnd, Panel)
if(not Temp) do
	messagebox("ok stop", "No tabs to rename", "TabTools script")
	quit all
endif
local i, j, Comm, Hand, Str, Caption
local Delim = ", "
static RH = "RightHistory"
static LH = "LeftHistory"
static C = "Caption"
static DM = "DirMenu"
static SI = "SearchIn"
static PD = "ParentDir"
flag clear 1 6
if(ini.check_exists(TW, C, "Alias") == 3) do
	if(ini.get(TW, C, "Alias"))
		flag set 1
endif
if(ini.check_exists(TW, C, SI) == 3) do
	if(ini.get(TW, C, SI))
		flag set 2
endif
if(ini.check_exists(TW, C, DM) == 3) do
	if(ini.get(TW, C, DM))
		flag set 3
endif
if(ini.check_exists(TW, C, PD) == 3)
	flag set 4
if(ini.check_exists(TW, C, LH) == 3)
	flag set 5
if(ini.check_exists(TW, C, RH) == 3)
	flag set 6
if(ini.check_exists(TW, C, "Delimiter") == 3)
	Delim = ini.get(TW, C, "Delimiter") ++ " "
if(not pproflag(1) && not pproflag(2) && not pproflag(3) && not pproflag(4) && not pproflag(5) && not pproflag(6)) do
	messagebox("ok warning", "No alias source specified", "TabTools script")
	quit all
endif
for(i = 0; i < TT.Length; i++)
	Temp = TT.GetMiddleCmd(i)
	if(Temp == Panel) do
		Temp = TT.GetId(i)
		Caption = Temp
		if(pproflag(4))
			Comm = ini.get(TW, C, PD)
;Sub_ParsePath - имя скрипта ParsePath 
		if(pproflag(4) && miscplugin.is_int(Comm) && Comm > 0)
			Caption = runfile.Subs\Sub_ParsePath(Temp, Comm)
		if(pproflag(1) && ini.check_exists(TW, "Alias", Temp) == 3)
			Caption = ini.get(TW, "Alias", Temp)
		if(pproflag(2)) do
			Comm = ini.enum_keys(Config, SI)
			Hand = line(Comm, 0)
			for(j = 0; j < Hand; j++)
				Str = line(Comm, j)
				Str = ini.get(Config, SI, j)
				if(Str ++ Slash == Temp) do
					Caption = Caption ++ Delim ++ ini.get(TW, C, SI)
					break
				endif
			endfor
		endif
		if(pproflag(3)) do
			for(j = 1; j < 200; j++)
				Str = "menu" ++ j
				if(ini.check_exists(Config, DM, Str) != 3)
					break
				Str = "cmd" ++ j
				if(ini.check_exists(Config, DM, Str) == 3) do
					Hand = ini.get(Config, DM, Str)
					if(index(Hand, "cd ") == 1) do
						Hand = remove(Hand, 3)
						if(Hand ++ Slash == Temp) do
							Temp = ini.get(TW, C, DM)
							Caption = Caption ++ Delim ++ Temp
						endif
					endif
				endif
			endfor
		endif
		if(pproflag(5)) do
			Comm = ini.enum_keys(Config, LH)
			Hand = line(Comm, 0)
			for(j = 0; j < Hand; j++)
				if(ini.get(Config, LH, j) == Temp) do
					Caption = Caption ++ Delim ++ ini.get(TW, C, LH)
					break
				endif
			endfor
		endif
		if(pproflag(6)) do
			Comm = ini.enum_keys(Config, RH)
			Hand = line(Comm, 0)
			for(j = 0; j < Hand; j++)
				if(ini.get(Config, RH, j) == Temp) do
					Caption = Caption ++ Delim ++ ini.get(TW, C, RH)
					break
				endif
			endfor
		endif
		TT.RunLeft(i)
		win.postmessage(hwnd, 0x400+51, 3009, 0)
		*keys {down 2}{enter}
		wait.for(activewindow("c=TCheckEditBox"))
		Hand = win.getfocus()
		win.settext(Hand, Caption)
		*keys {enter}
	endif
endfor
if(not index(NoMess, "a"))
	messagebox("ok information", "Aliasing complete", "TabTools script")
quit	//'Alias' function
//******************************************************************
Function CloseAllTabs(Panel)
local Cur = ifelse(tc.active(hwnd) == "left", 4001, 4002)
local Focus = 4000 + Panel
win.sendmessage(hwnd, 0x400+51, Focus, 0)
;CloseAllTabs - имя скрипта CloseAllTabs 
runfile.CloseAllTabs
quit						//'CloseAllTabs' function
//******************************************************************
Function CloseDups(Panel)
local i, j, k, Side, Path, Temp, Opp, Comm, Number
local Counter = 0
local Mess
local Cap = "Duplicating tabs in " ++ ifelse(Panel == 2, "left", "right") ++ " panel: "
@Start
flag clear 1
Temp = TT.GetIdIndex("Vertical Separator")
Opp = ifelse(Panel == 1, TT.GetRightCmd(Temp, 1), TT.GetMiddleCmd(Temp, 1))
				
if(Opp == 1) do
	messagebox("ok stop", "There is only one tab", "Bad user command")
	quit all
endif
Number = TT.Length
for(i = 0; i < Number; i++)
	Side = TT.GetMiddleCmd(i)
	if(Panel == Side) do
		Path = TT.GetId(i)
		for(j = 0; j < Number; j++)
			Side = 	TT.GetMiddleCmd(j)
			if(Panel != Side && Side != "") do
				Temp = TT.GetId(j)
				if(Path == Temp) do
					Counter++
					if(Counter != 1)
						Mess = Mess ++ CR ++ CR
					Mess = Mess ++ "Tab #" ++ Counter ++ ":"
					Mess = Mess ++ CR ++ "Path: '" ++ Temp ++ "'"
;TabTools - имя скрипта TabTools (рекурсивный вызов)
					Mess = Mess ++ .TabTools\TabTools@CloseTab(TT.GetMiddleCmd(j), j)
					flag set 1
					break
				endif
			endif
		endfor
		if(pproflag(1))
			break
	endif
endfor
if(pproflag(1))
	jump Start
Cap = Cap ++ Counter
if(index(NoMess, "c"))
	quit
if(Mess) do
	messagebox("ok warning", Mess, Cap)
else
	messagebox("ok information", "No duplicates found", Cap)
endif
quit						//'CloseDups' function
//******************************************************************
Function Highlight(Panel, Action)
;Sub_TMTC - имя скрипта TMTC 
local TMTC = runfile.Subs\Sub_TMTC(hwnd, Panel)
if(not TMTC) do
	messagebox("ok stop", "No tabs to highlight", "TabTools script")
	quit all
endif
local i, List, Label, Side
local Number = TT.Length
local NewLine = esc(?+\r+, ?+\+)
for(i = 0; i < Number; i++)
	if(TT.GetMiddleCmd(i) == Panel) do
		Label = TT.GetLabel(i)
		List = List ++ Label ++ NewLine
	endif
endfor
NewLine = "Pick tab(s) to " ++ ifelse(Action, "highlight", "clear highlighting")
pickstring(List, NewLine, 3)
Side = word(_pickedline_, 0)
for(i = 1; i <= Side; i++)
	Number = word(_pickedline_, i)
	win.sendmessage(TMTC, 4915, Number - 1, Action)
endfor
quit						//'HighLight' function
//******************************************************************
Function MultiFind(Num)
local i, Target, Str, Panel
for(i = 0; i < TT.Length; i++)
	Target = TT.GetId(i)
	Panel = TT.GetMiddleCmd(i)
	if(validpath(Target) && Num == Panel)
		Str = Str ++ Target ++ ";"
endfor
Str = remove(Str, -1)
win.postmessage(hwnd, 0x400+51, 501, 0)
wait.for(activewindow("c=TFindFile"))
Panel = win.handle("c=TFindFile")
Target = childwin.handle(Panel, 22)
win.settext(Target, Str)
quit						//'MultiFind' function
//******************************************************************
Function PathVal(Panel, Ask)
;Sub_TMTC - имя скрипта TMTC
local Number = runfile.Subs\Sub_TMTC(hwnd, Panel)
if(not Number) do
	messagebox("ok stop", "No tabs to check", "TabTools script")
	quit all
endif
Number = TT.Length
local i, j, Side, Path, Beg, Mess, Counter, Section, Status
local Cap = "Invalid tabs in "
local Comm = "/Caption: "
if(Panel == 1) do
	Section = "lefttabs"
	Cap = Cap ++ "left"
else
	Section = "righttabs"
	Cap = Cap ++ "right"
endif
Cap = Cap ++ " panel"
local Active = ini.get(Config, Section, "activetab")
local Temp = (Number - 1)*3
flag clear 2 3
if(ini.check_exists(TW, "ValidPaths", "Archives") == 3 && ini.get(TW, "ValidPaths", "Archives"))
	flag set 2
if(ini.check_exists(TW, "ValidPaths") == 2)
	flag set 3
v = vec.create(Temp)
if(v <= 0) do
	messagebox("ok error", "Vector not created", "VEC plugin error")
	quit
endif
for(i = 0; i < Number; i++)
	flag clear 1
	Side = TT.GetMiddleCmd(i)
	Status = TT.GetIconNumber(i)
	if(Panel == Side) do
		Path = TT.GetId(i)
		if(not validpath(Path)) do
			if(pproflag(3)) do
				Temp = ini.enum_keys(TW, "ValidPaths")
				Side = line(Temp, 0)
				for(j = 1; j <= Side; j++)
					Beg = line(Temp, j)
					if(index(Path, Beg) == 1) do
						flag set 1
						break
					endif
				endfor
			endif
			if(pproflag(2)) do
				Temp = remove(Path, -1)
				if(not file.isfolder(Temp) && length(Temp) > 2)
					flag set 1
			endif
			if(pproflag(1))
				jump NextPath
			Temp = TT.GetHeight(i)
			if(Mess)
				Mess = Mess ++ CR ++ CR
			Mess = Mess ++ "Invalid path is '" ++ Path ++ "'" ++ CR ++ "Tab #" ++ Temp
			if(Active > Temp)
				Active--
			Side = ""
			if(Status == 1 || Status == 4)
				Side = Side ++ "locked "
			if(Status == 2 || Status == 5)
				Side = Side ++ "locked, but directory changes allowed "
			if(Side != "")
				Mess = Mess ++ CR ++ "Status: " ++ Side
		else
@NextPath
			v[Counter*3] = Path
			v[Counter*3 + 1] = TT.GetToolTip(i)
			Side = TT.GetHeight(i)
			if(Side > Active)
				Side--
			Temp = ini.get(Config, Section, Side ++ "_options")
			v[Counter*3 + 2] = Temp
			Counter++
		endif
	endif
endfor
if(not Mess) do
	if(not index(NoMess, "p"))
		messagebox("ok information", "All paths are valid", "TabTools script")
	vec.destroy(v)
	vec.unload
	quit all
endif
if(Ask) do
	Mess = Mess ++ CR ++ CR ++ "Close invalid tabs?"
	if(messagebox("yesno question", Mess, Cap) == 7) do
		vec.destroy(v)
		vec.unload
		quit all
	endif
endif
Cap = "2.tab"
Path = ini.get(Config, "Configuration", "TabDir") ++ Cap
Beg = file.open(Path, "w")
if(Beg <= 0) do
	messagebox("ok error", "File not opened", "FILE plugin error")
	quit
endif
file.writeline(Beg, "[activetabs]")
for(i = 0; i < Counter; i++)
	file.writeline(Beg, i ++ "_path=" ++ v[i*3])
	Temp = v[i*3 + 1]
	if(index(Temp, Comm)) do
		Status = index(Temp, Comm)
		Section = slice(Temp, Status + 10, length(Temp) - 2)
		file.writeline(Beg, i ++ "_caption=" ++ Section)
	endif
	file.writeline(Beg, i ++ "_options=" ++ v[i*3 + 2])
endfor
vec.destroy(v)
vec.unload
file.writeline(Beg, "activetab=" ++ Active)
file.close(Beg)
win.sendmessage(hwnd, 0x400+51, 4000 + Panel, 0)
win.postmessage(hwnd, 0x400+51, 3009, 0)
*keys {slow}{up 4}{enter}
wait.for(1500, activewindow("c=#32770"))
Side = win.handle("c=#32770")
for(not win.childhandlelist(Side, "c=Edit"))
endfor
local List = win.childhandlelist(Side, "c=Edit")
local Edit = word(List, 1)
if(not Edit || word(List, 0) > 1) do
	messagebox("ok error", "No Edit Class Window")
	quit
endif
wait.for(100)
win.settext(Edit, Path)
wait.for(100)
for(childwin.gettext(Edit) != Path)
endfor
*keys ^{enter}
quit						//'PathVal' function
//******************************************************************
Function CloseTab(Number, Item)
flag clear 1
if(not miscplugin.is_int(Item)) do
	flag set 1
	Item = cl.GetLastMenuSel()
endif
local Mess, k
local Temp = TT.GetIconNumber(Item)
local Panel = TT.GetMiddleCmd(Item)
TT.RunLeft(Item)
if(Temp == 1) do
	win.sendmessage(hwnd, 0x400+51, 3010, 0)
	Mess = CR ++ "Status: locked"
elseif(Temp == 2) do
	win.sendmessage(hwnd, 0x400+51, 3012, 0)
	Mess = CR ++ "Status: locked, but directory changes allowed"
endif
win.sendmessage(hwnd, 0x400+51, 3007, 0)
TT.Remove(Item)
local Result = TT.GetIdIndex("Vertical Separator")
local Right = TT.GetRightCmd(Result, 1)
local Left = TT.GetMiddleCmd(Result, 1)
if(Panel == 2) do
	TT.ClearRight(Result)
	Right--
	TT.AddRight(Result, Right)
else
	TT.ClearMiddle(Result)
	Left--
	TT.AddMiddle(Result, Left)
endif
local What = TT.GetLabelIndex("Left Panel Tabs")
if(What) do
	Result = TT.GetLabelIndex("Right Panel Tabs")
	if(Right > Left) do
		if(Panel == 1) do
			TT.Insert(What - 1)
			TT.SetIconVisible(What - 1, 0)
		else
			TT.Remove(What - 2)
		endif
	elseif(Left > Right) do
		if(Panel == 1) do
			TT.Remove(Result - 2)
		else
			TT.Insert(Result - 1)
			TT.SetIconVisible(Result - 1, 0)
		endif
	elseif(Left == Right) do
		if(Panel == 1) do
			TT.Remove(Result - 2)
		else
			TT.Remove(What - 2)
		endif
	endif
endif
for(k = Item; k < TT.Length(); k++)
	What = TT.GetLeftCmd(k, 1)
	Code = select(What, 33, 36)
	if(miscplugin.is_int(Code)) do
		Temp = ifelse(Code < 5300, 1, 2)
		if(Panel == Temp && k >= Number) do
			What = TT.GetHeight(k)
			TT.ClearRight(k)
;TabTools - имя скрипта TabTools (рекурсивный вызов)
			TT.AddRight(k, cb("TabTools/TabTools@CloseTab", What))
			What--
			TT.SetHeight(k, What)
			Code--
			What = "win.sendmessage(hwnd, 0x400+51, " ++ Code ++ ", 0)"
			TT.ClearLeft(k)
			TT.AddLeft(k, What)
		endif
	endif
endfor
if(pproflag(1))
	TT.showmenu()
quit(Mess)
Версия данного скрипта для Total Commander 7.0 и старше.
С тех пор как в шестой версии Total Commander появились вкладки, я понял, что не зря в стародавние времена избрал для управления своими файлами именно Total Commander! До появления вкладок мне приходилось открывать по две-три копии Total Commander и занудно перетаскивать файлы из одной в другую. Вкладки позволили сделать работу не только быстрой и удобной, но и приятной.
Время шло (к хорошему быстро привыкаешь), и я в который раз осознал истину "Нет в мире совершенства". Сколь бы удобным и приятным ни было любое нововведение, мы привыкаем к нему и начинаем ныть: то не так, это не эдак, пятого не хватает, десятого не предусмотрели...
Обычно приходится мириться и ждать, когда же производители додумаются до столь очевидных вещей и снабдят свой продукт столь необходимыми мне свойствами. К счастью, иногда пустого ожидания удается избежать. Речь я веду, разумеется, о "сладкой парочке": Total Commander + PowerPro. Если в первом мне чего-то не хватает, я беру второе и дополняю первое столь нужными мне функциями.
Когда мне приходится одновременно работать над тремя-четырьмя разными проектами, на каждой панели оказывается открытыми по 10-15 вкладок. И тогда удобство постепенно превращается в свою противоположность.
- У меня была открыта директория Plugins, я это точно помню! Вот передо мной четыре вкладки с именем Plugins. Пока я буду наводить крысу на каждую и читать путь, мне проще открыть новую вкладку и тупым путешествием по дереву найти нужную директорию...
- Теперь у меня на обеих панелях восемь вкладок с именем Plugins, из которых уникальны только три, остальные их дублируют. Когда же они перестанут плодиться как кролики?!
- А вот это слово "Temp" - это имя директории или название вкладки, которое я ей присвоил?
- Звездочку я вижу, вкладка заперта. Но если я на ней щелкну крысой, она откроет новую и если да, то где - рядом с этой или в конце?
- Я вставил сидюк, открыл вкладку, чтбы его прочесть. Потом вынул сидюк, но вкладка осталась. Закрыв соседнюю, я тупо жду, пока Total Commander обратится к сидюку, долго будет пытаться его раскрутить, поймет, что раскручивать-то и нечего, захрипит и скажет мне о том, что я и так знаю - что сидюка-то и нетути! Нельзя ли сразу выяснить, какие вкладки содержат несуществующие пути?
Короче, однажды я решил, что хватит ждать выхода очередной версии. Не имеет никакого смысла плакаться на форумах в теме с жалостливым названием "Чего мне не хватает в Total Commander". Если я голоден, я не буду сидеть и ждать, пока меня накормят - так и с голоду можно окочуриться. Я просто пойду и поем.
Результатом этих банальных размышлений стал скрипт, высокопарно названный мною "TabTools", или "Чего мне не хватает в работе со вкладками". Мне, по большому счету, не хватает многого, но прежде всего я снабдил свое детище самыми необходимыми свойствами. Итак, текущая версия скрипта:
Для дальнейших пояснений будет полезно взглянуть на скриншот:
Специально для скрипта создан набор иконок ТТ.icl. Положите его в поддиректорию "TabTools" директории "PowerPro\scripts". Если иконки не видны, попробуйте библиотеку TabTools64.icl (для Windows Se7en 64 бит и, возможно, других 64-битных систем).
Для настройки скрипта используется ini-файл со следующими ключами:
[Configuration]
SmallIcons=0
;(0|1)=(нет|да) иконки всегда имеют размер 16х16
IncludeCommands=1
;(0|1)=(нет|да) включать подменю команд
Labels=2
;(0|1|2) Надписи: 0 - только название, 1 - только путь, 2 - оба
MaxTabs=20
;число вкладок, при превышении которого происходит переключение на мелкий шрифт и иконки 16х16
MaxText=50
;если текст на вкладке длиннее указанного числа символов, от усекается и заменяется многоточием
NoMessage=pca
;не выводить сообщений функций: "p" (PathVal), "c" (CloseDups), "a" (Alias)
;На первых порах рекомендуется сделать значение ключа пустым и добавлять буквы, если
;сообщения покажутся надоедливыми
AnyProps=
;Сюда пользователь может вписать любую строку, по синтаксису подходящую в качестве свойств меню PowerPro.
;За подробностями обращайтесь к руководству по PowerPro.
;Например, строка AnyProps=Backbmp=* установит обои рабочего стола в качестве фона меню
Подменю функций содержит некоторые операции со вкладками, которые мне приходится использовать. Подведя курсор к команде, можно увидеть ее краткое описание. Чуть более подробные пояснения к каждой функции приводятся ниже.
Сам скрипт (TabTools.txt), его иконостас (TT.icl), и файл конфигурации (TabTools.ini) копируются в поддиректорию "TabTools" директории "scripts". Если программа PowerPro установлена в c:\Program Files\PowerPro, то путь этих трех файлов имеет вид c:\Program Files\PowerPro\scripts\TabTools\.
Допустим, мы вставили сидюк и открыли соответствующую вкладку. После извлечения сидюка вкладка остается, хотя указывает на уже несуществующий путь. При переходе к ней она пытается найти сидюк, мотор рычит, вылезают сообщения об ошибке...
Команда "Check Path Validity" находит подобные вкладки и, если для выполнения команды использовалась левая кнопка мыши, запрашивает у пользователя разрешение на закрытие вкладок. Щелкнув по команде правой кнопкой, мы закроем вкладки тихо, без лишних вопросов.
Раздел [ValidPaths] с двумя ключами "оправдывает" системные папки типа Control Panel и подпапки сетевого окружения, а заодно FS-плагины. Вообще говоря, в раздел [ValidPaths] можно добавить любые пути, но смысла в этом я не вижу.
А вот в чем явно есть смысл - задать, что пути внутри архивов должны считаться действительными. Если вы в этом заинтересованы, задайте Archives=1.
В Total Commander v6.50 появилась замечательная команда "Close duplicate tabs", но она относится только к вкладкам на текущей панели. Команда "Close Opposite Dups" позволяет закрыть вкладки на противоположной панели, дублирующие вкладки на текущей.
Скрипт HighlightCurrentTab закрашивает всего одну вкладку (или снимает закраску, но опять же с одной вкладки). Команда "Highlight Tabs" позволяет проделать это с несколькими вкладками одновременно. Левая кнопка мыши вызывает закраску, правая - ее отмену.
Команда "Alias" требует чуть больше пояснений. Выдавать ее следует в случае, когда не только открыто слишком много вкладок, но, кроме того, они имеют одинаковые имена, хотя указывают на разные директории. Речь идет о таких "популярных" именах директорий, как Doc, Help, Plugins, Language, Templates, и подобных. А уж при работе с различными пользовательскими профилями от этих одноименных вкладок просто в глазах рябит.
[Caption]
Alias=1
ParentDir=2
SearchIn=<s>
DirMenu=<d>
LeftHistory=<lh>
RightHistory=<rh>
Delimiter=
[Alias]
c:\user\Batches\=Батнички
d:\Documents and Settings\Administrator\Start Menu\Programs\Startup\=Типа такой длинный запуск
Раздел [Caption] содержит ключи, каждый из которых задает режим переименования. Чтобы выключить режим, задайте ключ равным "" или просто закомментируйте ключ.
Любое значение ключа Alias, отличное от "", включает режим псевдонимов.
Ключ ParentDir задает глубину вложенности директорий, отображаемых в качестве заголовка вкладки. Задавать это значение разумнее всего равным 2 - тогда, помимо имени текущей директории, что принято по умолчанию (поэтому задавать 1 бессмысленно), в название будет включено и имя родительской.
Ключ SearchIn определяет строку на вкладке той директории, которая включена в "историю поиска", то есть в которой недавно проводился поиск. Аналогично, ключ DirMenu относится к тем директориям, которые включены в Directory hotlist.
То же относится к ключам LeftHistory и RightHistory, то они соответствуют директориям, недавно открытым в левой и правой панелях. Чтобы увидеть их, нажмите Alt+Down или кнопочку с треугольником справа от заголовка панели.
Все описанные режимы независимы.
Ключ Delimiter определяет символ(ы), отделяющие одно имя вкладки от другого. Если ключ пуст (как в примере), то разделитель получит значение "запятая+пробел". Кстати, пробел будет добавлен после любого заданного пользователем разделителя.
Наконец, раздел [Alias] может содержать произвольное число ключей типа
директория\=псевдоним
Обратите внимание на "\" в конце ключа.
Вкладка, указывающая на директорию, получит соответствующий псевдоним, разумеется, если включен режим псевдонимов.
Команда закрывает все вкладки, вне зависимости от того, заперты ли они, и если заперты, то как именно.
Открывает окно поиска с полем "Search in", заполненным всеми путями вкладок. Подробности в описании скрипта MultiFind.
 
 | 
На главную | 
 
 | 
Все о Total Commander | 
 
 | 
PowerPro | 
 
 | 
PowerPro & Total Commander |