Ru-Board.club
← Вернуться в раздел «Тестирование»

» Far Manager - скрипты и плагины

Автор: VictorVG4
Дата сообщения: 10.05.2016 19:36
Angel_Ka

Ох, что то мне говорит о старых граблях с недостатком памяти. У меня то же индикатор не дёргался, но размер поддерева около 300 Гб, ну а файлов там не так много - порядка 21 тыс. Обычная файлопомойка на NFS. 16 Гб ОЗУ для работы с ней хватило.
Автор: Angel_Ka
Дата сообщения: 10.05.2016 19:43
VictorVG4
А я то в этом совсем ни бум-бум. Но в развитии плагина я весьма заинтересован, а максимум чем в этой ситуации могу подсобить — информированием автора. Но меня в этом тесте смутила ещё разница между количеством найденных файлов и количеством файлов, оказавшихся в бранче. Перепроверил. Разница повторилась, причём несколько другая по количеству. Сейчас пытаюсь установить какого это рода файлы не попали в бранч.
Автор: shmuz2
Дата сообщения: 10.05.2016 19:59
Angel_Ka
1. Это не показатель процесса, который стоит на нуле. Это - прогресс-бар при поиске текста внутри файла. Если текст не ищется (как в вашем случае), или же файл по размеру меньше нескольких мегабайт, то этот показатель должен быть равен нулю. Но ведь так же было и в предыдущих версиях, не так ли?

2. В описании процесса на базе 714 766 файлов вроде нет отклонений. Или я чего не уловил?

3. В процессе на базе 1.833.335 файлов и раньше ведь памяти не хватало, и падения были. Кстати, я в этом плане ничего не менял. Посмотрите чейнжлог на тему что изменилось.

Добавлено:
Да, насчёт "нехватки файлов" - смотрите кол-во файлов в панели, а не на индикаторе прогресса. В панели должны быть все файлы.
Автор: VictorVG4
Дата сообщения: 10.05.2016 20:23
Angel_Ka

Файл (точнее запись файла) может быть не только не включающим в себя вложенные наборы данных двоичным потоком с набором внешних свойств в т.ч. правами доступа вида r?w?x?d-r?w?x?d-r?w?x?d-, но и записью в одном или нескольких каталогах ссылающейся на лежащий в другом месте набор данных - хардлинком или симлинком, и тогда его попадание в поисковую выборку будет зависеть от фильтра команд dir/ls задаваемого ключами их командной строки. И никто не запрещает переопределить их скриптом или переменной среды которые будут формировать их начальные настройки отличным от дефолтного поведения утилиты способом.

А если мы этого не знаем?
Автор: Angel_Ka
Дата сообщения: 10.05.2016 20:45
shmuz2

Цитата:
Но ведь так же было и в предыдущих версиях, не так ли?

Да, так. Это я значит от своего недопонимания отметил, по инерции — ведь при нативном поиске показывается только счётчик количества искомых файлов. И стоячий прогресс-бар выглядит здесь лишним.

Цитата:
В описании процесса на базе 714 766 файлов вроде нет отклонений.

Смущает минутный интервал, когда счётчик уже застыл, а процессор гудит. А в базе большего размера этот интервал доходит до 8 - 10 минут. На этот период подвисает какая-то неопределённость.

Цитата:
В процессе на базе 1.833.335 файлов [...] я в этом плане ничего не менял.

Ну я просто чуток надеялся всё таки — а вдруг. Со своей стороны я хотел отметить, что недостаток памяти плагин ощущает не на стадии поиска, а на стадии формирования временной панели. Может быть здесь он как раз слишком торопится и поэтому требует больше ресурсов?

Цитата:
В панели должны быть все файлы.

Пытаюсь понять сейчас в чём тут может быть дело. Но эта тестовая сборка искусственная, она создана на базе случайного набора портабельных программ. Собрана она для того, чтобы можно было безболезненно публиковать имена файлов, чуть чего. И в ней могут оказаться файлы с экстравагантными именами.

Добавлено:
И вот, в подтверждение вышеизложенного, привожу имена нескольких файлов, которые физически содержатся в сборке, а в сформированном плагином бранче их нет:

Код: F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_c905be8887838ff2\msvcm80.dll
F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_c905be8887838ff2\msvcp80.dll
F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_c905be8887838ff2\msvcr80.dll
F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\Manifests\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_c905be8887838ff2.Manifest
F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\Manifests\amd64_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_49e66f4952a1b53b.Manifest
F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\Manifests\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_10b2f55f9bffb8f8.Manifest
F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\Manifests\x86_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_9193a620671dde41.Manifest
F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_10b2f55f9bffb8f8\msvcm80.dll
F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_10b2f55f9bffb8f8\msvcp80.dll
F:\P\pACR\pAcronisDiskDirector11\Acronis Disk Director 11 Advanced\%SystemRoot%\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_10b2f55f9bffb8f8\msvcr80.dll
Автор: VictorVG4
Дата сообщения: 10.05.2016 21:00
Angel_Ka

Файлов с именами вида x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_10b2f55f9bffb8f8 это специальные файлы с реальным местонахождением/загрузкой которых сама ось разбирается. Если посмотреть логи того же Dependency Walker там такие записи частенько мелькают:



и пользовательская оболочка ОС не должна стартовать, а ядро должно выводить с кучу ругани на отсутствующие зависимости, но, война войной, а главное маневры почему-то усё работает и не ругается...
Автор: Angel_Ka
Дата сообщения: 10.05.2016 21:05
VictorVG4
Ой-е-ёй-е-ёй! У меня для такого обилия новой для меня информации памяти не хватит точно!
Автор: VictorVG4
Дата сообщения: 10.05.2016 21:09
Angel_Ka

А чего тут запоминать? Утилиты типа Dependency Walker нужны именно тогда, когда кто-то ругается на отсутствующий модуль или функцию API, а коли этого события нет, то о самом факте их наличия в системе часто забываешь покуда не припрёт.
Автор: shmuz2
Дата сообщения: 10.05.2016 21:18
Angel_Ka
Сейчас постараюсь вчитаться в ваше последнее (для меня) сообщение, но хочу уже сказать следующее:
Если ставите новую версию, надо читать чейнжлог.
В версии 3.26.0 есть только 2 изменения по сравнению с предыдущей, причём точечные.
Одно из них касается индикатора прогресса, который никак не влияет ни на что, кроме индикации.
Другое касается сохранения панели в файл, о чём вы не пишете.
Следовательно, все проблемы, о которых вы пишете, были и в предыдущих версиях, но почему-то вы о них раньше не говорили.
Автор: Angel_Ka
Дата сообщения: 10.05.2016 21:32
shmuz2

Цитата:
все проблемы, о которых вы пишете, были и в предыдущих версиях

Вполне может быть и так. Но раньше они были незаметны для меня, не привлекали моё внимание. Поскольку я применял этот плагин на базах существенно меньшего размера, работал он очень быстро. И мне было безразлично застыл прогресс-бар или нет, и интервал перехода между поиском файлов и передачей их на панель был незаметен. Сейчас я это отчётливо увидел и сообщил Вам об этом. И простите меня, пожалуйста, если это для Вас пустая информация.

Цитата:
Другое касается сохранения панели в файл, о чём вы не пишете.

Опробование плагина на сборках больших объёмов заняло много времени. Мне сложно расставлять приоритеты и я пока ещё не добрался до функции сохранения панели в файл. Сейчас же опробую её.
Автор: shmuz2
Дата сообщения: 10.05.2016 21:57
Angel_Ka
1. Пока не вижу информации, по которой мог бы воспроизвести у себя проблемы. Тем не менее, репорты приветствуются, и если проблема будет идентифицирована, она будет постепенно решаться.
2. Сейчас сделаю новый релиз, в котором индикатор в конце поиска будет отображать полное количество найденных файлов. А то вижу, что так, как сейчас, это вводит пользователя в заблуждение.
Автор: Angel_Ka
Дата сообщения: 10.05.2016 22:08

Цитата:
Panels (search results panel): save list files in (UTF-8 + BOM) format.

Да, это так, вот копия установок из свежесозданного файла-списка:

Код: Кодовая страница: 65001 UTF-8
[x] Добавить сигнатуру (BOM)
Автор: shmuz2
Дата сообщения: 10.05.2016 22:26

Цитата:
В тот период времени, когда плагин ищет файлы, операцию ещё можно прервать, а когда обновляется панель — уже нельзя.

Не уверен, что это возможно сделать в плагине, поскольку в это время работает Фар, а не плагин. В ближайшее время точно не буду этим заниматься, может как нибудь когда нибудь...
Автор: Angel_Ka
Дата сообщения: 10.05.2016 22:36

Цитата:
в это время работает Фар

Да, посмотрел прерывается ли обновление нативной временной панели, производимое после нативного поиска файлов. Увы, нет, не прерывается. Но тогда при необходимости прерывания создания бранча большой базы придётся рушить Фар. Как то это совсем не гуд.

Добавлено:

Цитата:
Сейчас сделаю новый релиз

Удачи Вам в его создании! С большим интересом его посмотрю. И, возможно, что-то ещё выявится из того, что раньше не замечалось.

А вот посмотреть я его смогу теперь только завтра после смены.
Автор: Angel_Ka
Дата сообщения: 11.05.2016 05:31
Чуток времени нашлось перед сменой, бегло посмотрел 3.26.1.

Код: Search from panels: the progress dialog incorrectly displayed number of files at the end of search.
Автор: shmuz2
Дата сообщения: 11.05.2016 07:33
Angel_Ka
Замечания дельные, учту.
"/" в данном диалоге разделяет количество файлов, которые попадут в панель от общего количества найденных файлов. Эти величины могут сильно различаться, если производится поиск текста внутри файлов. В вашем случае, когда ищутся только сами файлы, данные величины одинаковы.
Автор: Alexyz21
Дата сообщения: 11.05.2016 13:50
12.7 [more]
Код: local F = far.Flags
local ffi = require'ffi'
local C = ffi.C
local shlwapi=ffi.load("shlwapi")

local PanelMode,Desc1,Indi1 = 999,"Select duplicates","!?"
local guid = "FE9B8874-9651-434C-8182-72329F2371A5"
local uGuid = win.Uuid(guid)
local BS,ts = string.byte("\\"),{nil,true,9999,true,true,false}
local freport = win.GetEnv("Temp").."\\Report.txt"

ffi.cdef[[
int StrCmpW(const wchar_t*, const wchar_t*);
int StrCmpIW(const wchar_t*, const wchar_t*);
int wcscmp(const wchar_t*, const wchar_t*);
int _wcsicmp(const wchar_t*, const wchar_t*);
int wcsncmp(const wchar_t*, const wchar_t*, size_t);
int _wcsnicmp(const wchar_t*, const wchar_t*, size_t);
int strcmp(const char*, const char*);
int _stricmp(const char*, const char*);
int _strnicmp(const char*, const char*, size_t);
int strncmp(const char*, const char*, size_t);
char* strrchr(const char*, int);
size_t strlen(const char*);
int memcmp(const void*, const void*, size_t);
wchar_t* wmemcpy(wchar_t*, const wchar_t*, size_t);
]]

local function ToWChar(str)
str=win.Utf8ToUtf16(str)
local res=ffi.new("wchar_t[?]",#str/2+1)
ffi.copy(res,str)
return res
end

local function GetStartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
local res=ffi.new("wchar_t[?]",len+1)
ffi.copy(res,name+len+ts[3],-ts[3]*2)
ffi.copy(res-ts[3],name,(len+ts[3])*2)
return res,len
else
return name,len
end
end

local function StartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Compare = function(p1,p2,opt)
local st1,ln1 = GetStartAndLenW(p1.FileName)
local st2,ln2 = GetStartAndLenW(p2.FileName)
return ts[4] and C._wcsicmp(st1,st2) or C.wcscmp(st1,st2)
end

local function StartAndLen(name)
local ptr = C.strrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.strlen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Items = {
--[[01]] {F.DI_DOUBLEBOX, 3,1, 65,6, 0, 0,0, 0, "Select duplicates of FileName. Help: F1"},
--[[02]] {F.DI_CHECKBOX, 5,2, 26,2, 0, 0,0, 0, "Num&ber of symbols"},
--[[03]] {F.DI_EDIT, 27,2, 32,2, 0, 0,0, 0, ""},
--[[04]] {F.DI_CHECKBOX, 5,3, 20,3, 0, 0,0, 0, "Ignore &case"},
--[[05]] {F.DI_CHECKBOX, 37,3, 56,3, 0, 0,0, 0, "Ignore &full duplicates"},
--[[06]] {F.DI_CHECKBOX, 5,5, 15,5, 0, 0,0, 0, "Re&port"},
--[[07]] {F.DI_TEXT, -1,4, 0,0, 0, 0,0, F.DIF_SEPARATOR,""},
--[[08]] {F.DI_BUTTON, 0,5, 0,0, 0, 0,0, F.DIF_DEFAULTBUTTON+F.DIF_CENTERGROUP,"&Ok"},
--[[09]] {F.DI_BUTTON, 0,5, 0,0, 0, 0,0, F.DIF_CENTERGROUP,"Ca&ncel"}
}

local tts={}

local function DlgProc(hDlg,Msg,Param1,Param2)
if Msg==F.DN_INITDIALOG then
for i=2,#Items-3 do tts[i]=ts[i] end
hDlg:send(F.DM_SETTEXT,3,tts[3])
hDlg:send(F.DM_SETCHECK,2,tts[2] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,4,tts[4] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,5,tts[5] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,6,tts[6] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
elseif Msg==F.DN_BTNCLICK and (Param1==2 or Param1>=4 and Param1<=6) then
tts[Param1] = Param2~=0
elseif Msg==F.DN_EDITCHANGE and Param1==3 then -- Number symbols
tts[3] = tonumber(hDlg:send(F.DM_GETTEXT,3)) or tts[3]
else
return
end
return true
end

Macro {
description="! Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
if far.Dialog(uGuid,-1,-1,69,8,nil,Items,nil,DlgProc)==#Items-1 then
local t0=far.FarClock()
for i=2,#Items-3 do ts[i]=tts[i] end
local pBL0,pBL1 = ffi.cast("BOOL*",0),ffi.cast("BOOL*",1)
local pc=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).PanelControl
--local PInfo=panel.GetPanelInfo(nil,1)
local PInfo=ffi.new("struct PanelInfo")
PInfo.StructSize=ffi.sizeof(PInfo)
if pc(PANEL_ACTIVE,"FCTL_GETPANELINFO",0,PInfo)==1 then
if PInfo.ItemsNumber>1 then
if bit.band(tonumber(PInfo.Flags),F.PFLAGS_SELECTEDFIRST)>0 then Keys("ShiftF12") end
pc(PANEL_ACTIVE,"FCTL_SETNUMERICSORT",0,nil)
pc(PANEL_ACTIVE,"FCTL_SETCASESENSITIVESORT",ts[4] and 0 or 1,nil)
--pc(PANEL_ACTIVE,"FCTL_SETSORTORDER",0,nil)
Panel.LoadCustomSortMode(PanelMode,{Description=Desc1;Indicator=Indi1;Compare=Compare;DirectoriesFirst=1;SelectedFirst=0;RevertSorting=0;SortGroups=0;InvertByDefault=0;NumericSort=0;CaseSensitiveSort=ts[4] and 0 or 1})
Panel.SetCustomSortMode(PanelMode,0)
local full,tsel,fn0,fn1,fn2,fn3,st0,ln0,st1,ln1,st2,ln2,st3,ln3 = false,{},"","","","",0,0,0,0,0,0,0,0
local function Comp(stA,lnA,stB,lnB)
return ts[4] and C._wcsicmp(stA,stB) or C.wcscmp(stA,stB)
end
local function Proc(i,x)
if ts[5] and x then
if full then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL0)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
full=true
end
else
if #tsel==0 or Comp(tsel[#tsel][2],tsel[#tsel][3],st1,ln1)~=0 then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL1)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
table.insert(tsel,{2,st1,ln1,win.Utf16ToUtf8(ffi.string(st1,ln1*2))})
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
tsel[#tsel][1]=tsel[#tsel][1]+1
end
full=false
end
end
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,nil)
st1,ln1,st3,ln3=StartAndLenW(ToWChar(panel.GetPanelItem(nil,1,1).FileName))
for i=2,PInfo.ItemsNumber do
st0,ln0,st2,ln2 = st1,ln1,st3,ln3
st1,ln1,st3,ln3=StartAndLenW(ToWChar(panel.GetPanelItem(nil,1,i).FileName))
if ts[4] and (ts[2] and C._wcsnicmp(st1,st0,ts[3])==0 or C._wcsicmp(st1,st0)==0) then Proc(i,C._wcsicmp(st3,st2)==0)
elseif not ts[4] and (ts[2] and C.wcsncmp(st1,st0,ts[3])==0 or C.wcscmp(st1,st0)==0) then Proc(i,C.wcscmp(st3,st2)==0)
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,nil)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,nil)
--Keys("ShiftF12")
if ts[6] then
table.sort(tsel,function(a,b) return a[1]<b[1] end)
local h = io.open(freport,"wb")
io.close(h)
h = io.open(freport,"ab")
h:write("Items: "..#tsel.."\nExecution time: "..(far.FarClock()-t0).." mcs\nNumber of symbols: "..(ts[2] and ts[3] or "all").."\nIgnore case: "..tostring(ts[4]).."\nIgnore full duplicates: "..tostring(ts[5]).."\n\n")
for i=#tsel,1,-1 do h:write(tsel[i][1].."\t"..tsel[i][4].."\n") table.remove(tsel) end
io.close(h)
far.Message("mcs: "..far.FarClock()-t0,"SDFN")
end
end
end
end
end;
}

Macro {
description = "SDFN - Help"; area = "Dialog"; key = "F1";
condition=function() return Area.Dialog and Dlg.Id==guid end;
action=function()
if Dlg.CurPos<=3 then far.Message("The number of first or last symbols to compare","Help: Number of symbols")
elseif Dlg.CurPos==4 then far.Message("Case of letters in FileName will be ignored","Help: Ignore case")
elseif Dlg.CurPos==5 then far.Message("Full duplicates of FileName will be ignored","Help: Ignore full duplicates")
elseif Dlg.CurPos==6 then far.Message("mcs - total time of execution in mcs\nReport will be saved to:\n"..freport,"Help: Report",nil,"l")
end
end;
}
Автор: Angel_Ka
Дата сообщения: 11.05.2016 16:00
Alexyz21

Цитата:
12.7

Цитата:
LuaMacro

...\Profile\Macros\scripts\she_lua\12.7.0_(Alexyz21)she.lua:163: 'for' limit must be a number
Stack Traceback

Win10entRu x64 на двух разнокалиберных машинах (а других осей под рукой сейчас нет).
Автор: Alexyz21
Дата сообщения: 11.05.2016 16:34
Мне номера строк ни о чём не говорят - у меня скрипты совсем в другом виде, с кучей экспериментального кода и номера строк не совпадают. Хотите результат - строку кода в студию.
Автор: shmuz2
Дата сообщения: 11.05.2016 16:44

Цитата:
Мне номера строк ни о чём не говорят - у меня скрипты совсем в другом виде, с кучей экспериментального кода и номера строк не совпадают. Хотите результат - строку кода в студию.

А взять опубликованный вами же скрипт (2 сообщения выше) религия не позволяет?
Автор: Alexyz21
Дата сообщения: 11.05.2016 16:46
12.8 [more]
Код: local F = far.Flags
local ffi = require'ffi'
local C = ffi.C

local PanelMode,Desc1,Indi1 = 999,"Select duplicates","!?"
local guid = "FE9B8874-9651-434C-8182-72329F2371A5"
local uGuid = win.Uuid(guid)
local BS,ts = string.byte("\\"),{nil,true,9999,true,true,false}
local freport = win.GetEnv("Temp").."\\Report.txt"

ffi.cdef[[
int StrCmpW(const wchar_t*, const wchar_t*);
int StrCmpIW(const wchar_t*, const wchar_t*);
int wcscmp(const wchar_t*, const wchar_t*);
int _wcsicmp(const wchar_t*, const wchar_t*);
int wcsncmp(const wchar_t*, const wchar_t*, size_t);
int _wcsnicmp(const wchar_t*, const wchar_t*, size_t);
int strcmp(const char*, const char*);
int _stricmp(const char*, const char*);
int _strnicmp(const char*, const char*, size_t);
int strncmp(const char*, const char*, size_t);
char* strrchr(const char*, int);
size_t strlen(const char*);
int memcmp(const void*, const void*, size_t);
wchar_t* wmemcpy(wchar_t*, const wchar_t*, size_t);
]]

local function ToWChar(str)
str=win.Utf8ToUtf16(str)
local res=ffi.new("wchar_t[?]",#str/2+1)
ffi.copy(res,str)
return res
end

local function GetStartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
local res=ffi.new("wchar_t[?]",len+1)
ffi.copy(res,name+len+ts[3],-ts[3]*2)
ffi.copy(res-ts[3],name,(len+ts[3])*2)
return res,len
else
return name,len
end
end

local function StartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Compare = function(p1,p2,opt)
local st1,ln1 = GetStartAndLenW(p1.FileName)
local st2,ln2 = GetStartAndLenW(p2.FileName)
return ts[4] and C._wcsicmp(st1,st2) or C.wcscmp(st1,st2)
end

local function StartAndLen(name)
local ptr = C.strrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.strlen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Items = {
--[[01]] {F.DI_DOUBLEBOX, 3,1, 65,6, 0, 0,0, 0, "Select duplicates of FileName. Help: F1"},
--[[02]] {F.DI_CHECKBOX, 5,2, 26,2, 0, 0,0, 0, "Num&ber of symbols"},
--[[03]] {F.DI_EDIT, 27,2, 32,2, 0, 0,0, 0, ""},
--[[04]] {F.DI_CHECKBOX, 5,3, 20,3, 0, 0,0, 0, "Ignore &case"},
--[[05]] {F.DI_CHECKBOX, 37,3, 56,3, 0, 0,0, 0, "Ignore &full duplicates"},
--[[06]] {F.DI_CHECKBOX, 5,5, 15,5, 0, 0,0, 0, "Re&port"},
--[[07]] {F.DI_TEXT, -1,4, 0,0, 0, 0,0, F.DIF_SEPARATOR,""},
--[[08]] {F.DI_BUTTON, 0,5, 0,0, 0, 0,0, F.DIF_DEFAULTBUTTON+F.DIF_CENTERGROUP,"&Ok"},
--[[09]] {F.DI_BUTTON, 0,5, 0,0, 0, 0,0, F.DIF_CENTERGROUP,"Ca&ncel"}
}

local tts={}

local function DlgProc(hDlg,Msg,Param1,Param2)
if Msg==F.DN_INITDIALOG then
for i=2,#Items-3 do tts[i]=ts[i] end
hDlg:send(F.DM_SETTEXT,3,tts[3])
hDlg:send(F.DM_SETCHECK,2,tts[2] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,4,tts[4] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,5,tts[5] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,6,tts[6] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
elseif Msg==F.DN_BTNCLICK and (Param1==2 or Param1>=4 and Param1<=6) then
tts[Param1] = Param2~=0
elseif Msg==F.DN_EDITCHANGE and Param1==3 then -- Number symbols
tts[3] = tonumber(hDlg:send(F.DM_GETTEXT,3)) or tts[3]
else
return
end
return true
end

Macro {
description="! Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
if far.Dialog(uGuid,-1,-1,69,8,nil,Items,nil,DlgProc)==#Items-1 then
local t0=far.FarClock()
for i=2,#Items-3 do ts[i]=tts[i] end
local pBL0,pBL1 = ffi.cast("BOOL*",0),ffi.cast("BOOL*",1)
local pc=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).PanelControl
--local PInfo=panel.GetPanelInfo(nil,1)
local PInfo=ffi.new("struct PanelInfo")
PInfo.StructSize=ffi.sizeof(PInfo)
if pc(PANEL_ACTIVE,"FCTL_GETPANELINFO",0,PInfo)==1 then
local pin,pif = tonumber(PInfo.ItemsNumber),tonumber(PInfo.Flags)
if pin>1 then
if bit.band(pif,F.PFLAGS_SELECTEDFIRST)>0 then Keys("ShiftF12") end
if bit.band(pif,F.PFLAGS_NUMERICSORT)>0 then pc(PANEL_ACTIVE,"FCTL_SETNUMERICSORT",0,nil) end
if bit.band(pif,F.PFLAGS_CASESENSITIVESORT)>0 then pc(PANEL_ACTIVE,"FCTL_SETCASESENSITIVESORT",ts[4] and 0 or 1,nil) end
--pc(PANEL_ACTIVE,"FCTL_SETSORTORDER",0,nil)
Panel.LoadCustomSortMode(PanelMode,{Description=Desc1;Indicator=Indi1;Compare=Compare;DirectoriesFirst=1;SelectedFirst=0;RevertSorting=0;SortGroups=0;InvertByDefault=0;NumericSort=0;CaseSensitiveSort=ts[4] and 0 or 1})
Panel.SetCustomSortMode(PanelMode,0)
local full,tsel,fn0,fn1,fn2,fn3,st0,ln0,st1,ln1,st2,ln2,st3,ln3 = false,{},"","","","",0,0,0,0,0,0,0,0
local function Comp(stA,lnA,stB,lnB)
return ts[4] and C._wcsicmp(stA,stB) or C.wcscmp(stA,stB)
end
local function Proc(i,x)
if ts[5] and x then
if full then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL0)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
full=true
end
else
if #tsel==0 or Comp(tsel[#tsel][2],tsel[#tsel][3],st1,ln1)~=0 then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL1)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
table.insert(tsel,{2,st1,ln1,win.Utf16ToUtf8(ffi.string(st1,ln1*2))})
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
tsel[#tsel][1]=tsel[#tsel][1]+1
end
full=false
end
end
st1,ln1,st3,ln3=StartAndLenW(ToWChar(panel.GetPanelItem(nil,1,1).FileName))
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,nil)
for i=2,pin do
st0,ln0,st2,ln2 = st1,ln1,st3,ln3
st1,ln1,st3,ln3=StartAndLenW(ToWChar(panel.GetPanelItem(nil,1,i).FileName))
if ts[4] and (ts[2] and C._wcsnicmp(st1,st0,ts[3])==0 or C._wcsicmp(st1,st0)==0) then Proc(i,C._wcsicmp(st3,st2)==0)
elseif not ts[4] and (ts[2] and C.wcsncmp(st1,st0,ts[3])==0 or C.wcscmp(st1,st0)==0) then Proc(i,C.wcscmp(st3,st2)==0)
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,nil)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,nil)
--Keys("ShiftF12")
if ts[6] then
table.sort(tsel,function(a,b) return a[1]<b[1] end)
local h = io.open(freport,"wb")
io.close(h)
h = io.open(freport,"ab")
h:write("Items: "..#tsel.."\nExecution time: "..(far.FarClock()-t0).." mcs\nNumber of symbols: "..(ts[2] and ts[3] or "all").."\nIgnore case: "..tostring(ts[4]).."\nIgnore full duplicates: "..tostring(ts[5]).."\n\n")
for i=#tsel,1,-1 do h:write(tsel[i][1].."\t"..tsel[i][4].."\n") table.remove(tsel) end
io.close(h)
far.Message("mcs: "..far.FarClock()-t0,"SDFN")
end
end
end
end
end;
}

Macro {
description = "SDFN - Help"; area = "Dialog"; key = "F1";
condition=function() return Area.Dialog and Dlg.Id==guid end;
action=function()
if Dlg.CurPos<=3 then far.Message("The number of first or last symbols to compare","Help: Number of symbols")
elseif Dlg.CurPos==4 then far.Message("Case of letters in FileName will be ignored","Help: Ignore case")
elseif Dlg.CurPos==5 then far.Message("Full duplicates of FileName will be ignored","Help: Ignore full duplicates")
elseif Dlg.CurPos==6 then far.Message("mcs - total time of execution in mcs\nReport will be saved to:\n"..freport,"Help: Report",nil,"l")
end
end;
}
Автор: shmuz2
Дата сообщения: 11.05.2016 16:54

Цитата:
мне религия позволяет писать более дюжины строк и не вешать на них пароль

Когда я писал тот скрипт, ни о каком пароле и не помышлял.
Когда собрался его выложить, тут вы и подоспели со своим нытьём, что вам в форуме не помогают.
Ну вот меня злость и взяла, после множества раз, что я вам помогал, оказыввается это всё не считается.
Ещё раз вякнете (уж извините за грубость), моя вам помощь будет прекращена раз и навсегда.
Автор: Alexyz21
Дата сообщения: 11.05.2016 17:00

Цитата:
Когда собрался его выложить, тут вы и подоспели со своим нытьём, что вам в форуме не помогают.

Я уже говворил об этом - сказано было в общем, почему же на вас шапка загорелась - мне не ведомо.
Цитата:
Ещё раз вякнете (уж извините за грубость), моя вам помощь будет прекращена раз и навсегда.

Это как вам будет угодно, я не привык, когда со мной разговаривают в таком тоне.
Автор: VictorVG4
Дата сообщения: 11.05.2016 17:30
Alexyz21

Цитата:
Мне номера строк ни о чём не говорят - у меня скрипты совсем в другом виде, с кучей экспериментального кода и номера строк не совпадают. Хотите результат - строку кода в студию.

Ориентируйся по тому варианту что опубликовал. Уверен что у Angel_Ka не стоит StackTracePlus.lua - иначе он смог бы получить более полный стек ошибки.

Angel_Ka

Чтобы не искать рабочий вариант модуля возьмите его у меня из Far30-x64-test.7z - там он есть и там же есть _macroinit.lua где уже подключён этот модуль. Пригодится в качестве рабочего примера.
Автор: Angel_Ka
Дата сообщения: 11.05.2016 17:56
for i=2,PInfo.ItemsNumber do

Добавлено:
Alexyz21

Цитата:
12.8

Микротест макрос прошёл отлично по всем основным опциям.

Перехожу к опробованию на тесте в 546 804 файла, на котором тестировал 12.0-версию. Это чтобы и побыстрее было, и чтобы сравнить можно было бы.

Насчёт номера строки — честное слово отправлял. Сгинула таки отправка. Как уже не раз было. И я не в оправдание это, а чтобы учитывали, что сайт таки периодически сбоит.

Добавлено:
Сравнение результатов версии 12.0 и версии 12.8 на тестовом бранче 546 804 файла.

Код: [x] Number of symbols 9999
[x] Ignore case [ ] Ignore full duplicates

mcs: 20 447 585 mcs: 20 622 035 mcs: 20 587 732
mcs: 11 250 740 mcs: 11 350 752 mcs: 11 403 847

[x] Number of symbols 9999
[ ] Ignore case [ ] Ignore full duplicates

mcs: 12 554 891 mcs: 12 575 750 mcs: 12 529 502
mcs: 14 107 642 mcs: 14 164 242 mcs: 14 276 857

[x] Number of symbols 37
[x] Ignore case [ ] Ignore full duplicates

mcs: 20 601 037 mcs: 20 610 607 mcs: 20 603 966
mcs: 11 259 455 mcs: 11 237 961 mcs: 11 287 037

[x] Number of symbols 37
[ ] Ignore case [ ] Ignore full duplicates

mcs: 15 068 851 mcs: 12 562 418 mcs: 12 589 486
mcs: 14 080 277 mcs: 14 121 628 mcs: 14 142 173

[x] Number of symbols -7
[x] Ignore case [ ] Ignore full duplicates

mcs: 290 079 734 mcs: 290 899 935 mcs: 293 017 921
mcs: 125 837 816 mcs: 156 253 192 mcs: 155 341 448
Автор: Angel_Ka
Дата сообщения: 11.05.2016 20:29
Alexyz21
И на 12.8 проявляется вот ещё какая странная штука:

По результатам работы макроса опция "Помеченные файлы вперёд" применена, а файлы отсортированы с разрывами.
Автор: VictorVG4
Дата сообщения: 11.05.2016 20:37
shmuz2
Alexyz21

Кстати, друзья, а коллега дело говорит - на хостинге неучи опять принялись стойки "изучать" и не только наш форум гючил - приятель сейчас звонил... если его речи повторить - святые разбегутся. А у них там конторский сайт - их главный босс в тех краях обитает и хочет чтобы всё на его глазах было. Вот пусть он и разберётся с сими гавриками от имени и по поручению заместо Немезиды. А нам всем от этого польза будет.
Автор: Alexyz21
Дата сообщения: 11.05.2016 20:40
12.8.2 [more]
Код: local F = far.Flags
local ffi = require'ffi'
local C = ffi.C

local PanelMode,Desc1,Indi1 = 999,"Select duplicates","!?"
local guid = "FE9B8874-9651-434C-8182-72329F2371A5"
local uGuid = win.Uuid(guid)
local BS,ts = string.byte("\\"),{nil,true,9999,true,true,false}
local freport = win.GetEnv("Temp").."\\Report.txt"

ffi.cdef[[
int StrCmpW(const wchar_t*, const wchar_t*);
int StrCmpIW(const wchar_t*, const wchar_t*);
int wcscmp(const wchar_t*, const wchar_t*);
int _wcsicmp(const wchar_t*, const wchar_t*);
int wcsncmp(const wchar_t*, const wchar_t*, size_t);
int _wcsnicmp(const wchar_t*, const wchar_t*, size_t);
int strcmp(const char*, const char*);
int _stricmp(const char*, const char*);
int _strnicmp(const char*, const char*, size_t);
int strncmp(const char*, const char*, size_t);
char* strrchr(const char*, int);
size_t strlen(const char*);
int memcmp(const void*, const void*, size_t);
wchar_t* wmemcpy(wchar_t*, const wchar_t*, size_t);
]]

local function ToWChar(str)
str=win.Utf8ToUtf16(str)
local res=ffi.new("wchar_t[?]",#str/2+1)
ffi.copy(res,str)
return res
end

local function GetStartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
local res=ffi.new("wchar_t[?]",len+1)
ffi.copy(res,name+len+ts[3],-ts[3]*2)
ffi.copy(res-ts[3],name,(len+ts[3])*2)
return res,len
else
return name,len
end
end

local function StartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Compare = function(p1,p2,opt)
local st1,ln1 = GetStartAndLenW(p1.FileName)
local st2,ln2 = GetStartAndLenW(p2.FileName)
return ts[4] and C._wcsicmp(st1,st2) or C.wcscmp(st1,st2)
end

local function StartAndLen(name)
local ptr = C.strrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.strlen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Items = {
--[[01]] {F.DI_DOUBLEBOX, 3,1, 65,6, 0, 0,0, 0, "Select duplicates of FileName. Help: F1"},
--[[02]] {F.DI_CHECKBOX, 5,2, 26,2, 0, 0,0, 0, "Num&ber of symbols"},
--[[03]] {F.DI_EDIT, 27,2, 32,2, 0, 0,0, 0, ""},
--[[04]] {F.DI_CHECKBOX, 5,3, 20,3, 0, 0,0, 0, "Ignore &case"},
--[[05]] {F.DI_CHECKBOX, 37,3, 56,3, 0, 0,0, 0, "Ignore &full duplicates"},
--[[06]] {F.DI_CHECKBOX, 5,5, 15,5, 0, 0,0, 0, "Re&port"},
--[[07]] {F.DI_TEXT, -1,4, 0,0, 0, 0,0, F.DIF_SEPARATOR,""},
--[[08]] {F.DI_BUTTON, 0,5, 0,0, 0, 0,0, F.DIF_DEFAULTBUTTON+F.DIF_CENTERGROUP,"&Ok"},
--[[09]] {F.DI_BUTTON, 0,5, 0,0, 0, 0,0, F.DIF_CENTERGROUP,"Ca&ncel"}
}

local tts={}

local function DlgProc(hDlg,Msg,Param1,Param2)
if Msg==F.DN_INITDIALOG then
for i=2,#Items-3 do tts[i]=ts[i] end
hDlg:send(F.DM_SETTEXT,3,tts[3])
hDlg:send(F.DM_SETCHECK,2,tts[2] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,4,tts[4] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,5,tts[5] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,6,tts[6] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
elseif Msg==F.DN_BTNCLICK and (Param1==2 or Param1>=4 and Param1<=6) then
tts[Param1] = Param2~=0
elseif Msg==F.DN_EDITCHANGE and Param1==3 then -- Number symbols
tts[3] = tonumber(hDlg:send(F.DM_GETTEXT,3)) or tts[3]
else
return
end
return true
end

Macro {
description="! Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
if far.Dialog(uGuid,-1,-1,69,8,nil,Items,nil,DlgProc)==#Items-1 then
local t0=far.FarClock()
for i=2,#Items-3 do ts[i]=tts[i] end
local pBL0,pBL1 = ffi.cast("BOOL*",0),ffi.cast("BOOL*",1)
local pc=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).PanelControl
--local PInfo=panel.GetPanelInfo(nil,1)
local PInfo=ffi.new("struct PanelInfo")
PInfo.StructSize=ffi.sizeof(PInfo)
if pc(PANEL_ACTIVE,"FCTL_GETPANELINFO",0,PInfo)==1 then
local pin,pif = tonumber(PInfo.ItemsNumber),tonumber(PInfo.Flags)
if pin>1 then
if bit.band(pif,F.PFLAGS_SELECTEDFIRST)>0 then Keys("ShiftF12") end
if bit.band(pif,F.PFLAGS_NUMERICSORT)>0 then pc(PANEL_ACTIVE,"FCTL_SETNUMERICSORT",0,nil) end
local pfcss=bit.band(pif,F.PFLAGS_CASESENSITIVESORT)==0
if ts[4] and not pfcss or not ts[4] and pfcss then pc(PANEL_ACTIVE,"FCTL_SETCASESENSITIVESORT",ts[4] and 0 or 1,nil) end
Panel.LoadCustomSortMode(PanelMode,{Description=Desc1;Indicator=Indi1;Compare=Compare})
Panel.SetCustomSortMode(PanelMode,0)
local full,tsel,fn0,fn1,fn2,fn3,st0,ln0,st1,ln1,st2,ln2,st3,ln3 = false,{},"","","","",0,0,0,0,0,0,0,0
local function Comp(stA,lnA,stB,lnB)
return ts[4] and C._wcsicmp(stA,stB) or C.wcscmp(stA,stB)
end
local function Proc(i,x)
if ts[5] and x then
if full then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL0)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
full=true
end
else
if #tsel==0 or Comp(tsel[#tsel][2],tsel[#tsel][3],st1,ln1)~=0 then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL1)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
table.insert(tsel,{2,st1,ln1,win.Utf16ToUtf8(ffi.string(st1,ln1*2))})
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
tsel[#tsel][1]=tsel[#tsel][1]+1
end
full=false
end
end
st1,ln1,st3,ln3=StartAndLenW(ToWChar(panel.GetPanelItem(nil,1,1).FileName))
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,nil)
for i=2,pin do
st0,ln0,st2,ln2 = st1,ln1,st3,ln3
st1,ln1,st3,ln3=StartAndLenW(ToWChar(panel.GetPanelItem(nil,1,i).FileName))
if ts[4] and (ts[2] and C._wcsnicmp(st1,st0,ts[3])==0 or C._wcsicmp(st1,st0)==0) then Proc(i,C._wcsicmp(st3,st2)==0)
elseif not ts[4] and (ts[2] and C.wcsncmp(st1,st0,ts[3])==0 or C.wcscmp(st1,st0)==0) then Proc(i,C.wcscmp(st3,st2)==0)
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,nil)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,nil)
--Keys("ShiftF12")
if ts[6] then
table.sort(tsel,function(a,b) return a[1]<b[1] end)
local h = io.open(freport,"wb")
io.close(h)
h = io.open(freport,"ab")
h:write("Items: "..#tsel.."\nExecution time: "..(far.FarClock()-t0).." mcs\nNumber of symbols: "..(ts[2] and ts[3] or "all").."\nIgnore case: "..tostring(ts[4]).."\nIgnore full duplicates: "..tostring(ts[5]).."\n\n")
for i=#tsel,1,-1 do h:write(tsel[i][1].."\t"..tsel[i][4].."\n") table.remove(tsel) end
io.close(h)
far.Message("mcs: "..far.FarClock()-t0,"SDFN")
end
end
end
end
end;
}

Macro {
description = "SDFN - Help"; area = "Dialog"; key = "F1";
condition=function() return Area.Dialog and Dlg.Id==guid end;
action=function()
if Dlg.CurPos<=3 then far.Message("The number of first or last symbols to compare","Help: Number of symbols")
elseif Dlg.CurPos==4 then far.Message("Case of letters in FileName will be ignored","Help: Ignore case")
elseif Dlg.CurPos==5 then far.Message("Full duplicates of FileName will be ignored","Help: Ignore full duplicates")
elseif Dlg.CurPos==6 then far.Message("mcs - total time of execution in mcs\nReport will be saved to:\n"..freport,"Help: Report",nil,"l")
end
end;
}
Автор: Angel_Ka
Дата сообщения: 11.05.2016 20:44
Alexyz21

Цитата:
12.8.1

Увидел, сейчас посмотрю.
Автор: Alexyz21
Дата сообщения: 11.05.2016 20:51
Там уже 12.8.2

Страницы: 123456789101112

Предыдущая тема: кл


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.