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

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

Автор: shmuz2
Дата сообщения: 19.05.2016 13:32
Alexyz21
Если вы хотите, чтобы я разбирался, то предоставьте минимальный test case, на котором проблема повторяется. Просто так пялить глаза в ваш код не буду.
Ну и заранее могу сказать, что с вероятностью 99 % проблема не в LuaMacro.
Автор: Alexyz21
Дата сообщения: 19.05.2016 13:42
я гонял на этом:

Код: 123    Z:\Temp\1.txt
123    Z:\Temp0\1.txt
230    Z:\Temp9\1.txt
123    Z:\Temp0\QW.txt
230    Z:\Temp9\QW.txt
123    Z:\Temp0\АБ.txt
230    Z:\Temp9\АБ.txt
230    Z:\Temp9\aB.txt
123    Z:\Temp7\1.txt
123    Z:\Temp7\фЫвА.txt
123    Z:\Temp4\1.txt
230    Z:\Temp8\АБ.txt
123    Z:\Temp7\ФЫ.txt
130    Z:\Temp8\Аб.txt
123    Z:\Temp7\ФыВа.txt
230    Z:\Temp4\Ab.txt
1203    Z:\Temp\0.txt
234    Z:\Temp2\1.txt
230    Z:\Temp6\1.txt
123    Z:\Temp8\0.txt
1123    Z:\Temp\0.txt
1123    Z:\Temp1\1.txt
123    Z:\Temp1\0.txt
300    Z:\Temp\0.txt
451    Z:\xxx\xxx.txt
Автор: shmuz2
Дата сообщения: 19.05.2016 14:06
Alexyz21
Со всей очевидностью, вы не понимаете, что такое минимальный test case. Возиться с вашим полным скриптом я не собираюсь.
(К примеру, чтобы минимизировать test case для своего вчерашнего багрепорта на форуме, я затратил более часа времени).

В "огрызок" всматриваться не буду - либо test case есть, либо его нету.
Автор: Alexyz21
Дата сообщения: 19.05.2016 14:38
с memset проехали - мутно с ним разбираться, учитывая как крэши проявляются. А по нижеследующему есть комментарий почему не работает?

Код:
local ffi = require'ffi'
local msvcr120 = ffi.load("msvcr120")
ffi.cdef[[
unsigned long long int wcstoull(const wchar_t*, wchar_t**, int);
]]
local pHTAB = ffi.cast("void*",win.Utf8ToUtf16("\t"))
...
local size = tonumber(msvcr120.wcstoull(name,pHTAB,0))
Автор: shmuz2
Дата сообщения: 19.05.2016 14:48
Воспользуйтесь Dependency Walker, уже говорил вам вчера или позавчера.
На сегодня всё.
Автор: Angel_Ka
Дата сообщения: 19.05.2016 16:24
Alexyz21

Цитата:
0.5

Спасибо! Пробую.

Цитата:
я гонял на этом:

Тогда я тоже попробовал на этом.

Код: [ ] Number of symbols 9999
[x] Ignore case [ ] Ignore Full Duplicates
[?] Sizes of FD: --
[?] Attributes of FD: --
[x] Accuracy (two-pass method)
Автор: Alexyz21
Дата сообщения: 19.05.2016 16:32
Angel_Ka
без комментариев мне это показывать не надо - насмотрелся уже по самое не балуйся.

Добавлено:

Цитата:
Какие ещё тесты теперь нужно сделать?

Никакие - нравится пользуйтесь. Единственно можете написать какое время заняла обработка вашей большой базы и ваше мнение по скорости работы.
Автор: Angel_Ka
Дата сообщения: 19.05.2016 16:36
А какие именно нужны комментарии?
Автор: Alexyz21
Дата сообщения: 19.05.2016 16:39

Цитата:
А какие именно нужны комментарии?

Это сродни - а сколько нужно?

Какие, какие... - вопросы, пожелания, выражение недовольства, гневные отзывы и тп. Или у матросов - нет вопросов?
Автор: Angel_Ka
Дата сообщения: 19.05.2016 16:42

Цитата:
Это сродни - а сколько нужно?

Простите, но у меня сегодня после работы голова чугунная и я намёка не понял. Поэтому пока покажу то, что сам вижу, в т.ч. посмотрю на относительно большой базе.
Автор: Alexyz21
Дата сообщения: 19.05.2016 16:44
только не простыни без комментов - глаза у меня не казённые.
Автор: Angel_Ka
Дата сообщения: 19.05.2016 16:47
0.5, 76-файловый микротест:

Код: [x] Number of symbols 9999
[x] Ignore case [ ] Ignore Full Duplicates
[ ] Sizes of FD: <>
[?] Attributes of FD: --
[x] Accuracy (two-pass method)
Автор: Alexyz21
Дата сообщения: 19.05.2016 16:52
Angel_Ka
Лично мне тесты не нужны - я написанными скриптами не пользуюсь, если у вас есть какие-то вопросы, непонятки по результатам и тп., то показывайте, спрашивайте. Только ещё раз повторю - не надо вывешивать простыни, у мнея от них в глазах рябит и головная боль начинает стучаться.
Автор: Angel_Ka
Дата сообщения: 19.05.2016 17:22
Alexyz21

Цитата:
если у вас есть какие-то вопросы, непонятки по результатам и тп., то показывайте, спрашивайте

Хорошо. Тогда мне сейчас нужно время чтобы освоиться с макросом, понять что я наблюдаю при конкретной комбинации опций, осознать какие из наборов опций в каком случае более подходят для применения, и попробовать усвоить это в целом.

Беглые пробы на всё б0льших и б0льших по размеру базах, а я добрался пока ещё только до 100 тысячной по количеству базе, показывают, что макрос работает очень быстро. Наверное теперь попробую его сразу на 800-тысячной.
Автор: Alexyz21
Дата сообщения: 19.05.2016 17:36
Angel_Ka
несколько изменена логика интерфейса, сделана (имхо) более интуитивно понятной. Панельный макрос на текущую логику переведу позже.

Для быстрого формирования бранч-списка нужен макрос-компаньон, тоже на API и FFI. Но пока нет времени им заняться.
Автор: Angel_Ka
Дата сообщения: 19.05.2016 17:58
Alexyz21

Цитата:
несколько изменена логика интерфейса, сделана (имхо) более интуитивно понятной. Панельный макрос на текущую логику переведу позже.

Для быстрого формирования бранч-списка нужен макрос-компаньон, тоже на API и FFI. Но пока нет времени им заняться.

БОЛЬШОЕ СПАСИБО за такую оптимистичную информацию!

Добавлено:
Бранч-список базы на 66 тыс. файлов макрос обрабатывает за полсекунды. По-моему это говорит о его большом потенциале.

Добавлено:
Бранч-список базы на 800 тысяч 116 файлов макрос обработал за 16 секунд.

Добавлено:
Бранч-список базы на 1 млн 800 тыс файлов макрос обработал за 43 секунды. Т.е. скорость работы макроса очень высокая! И это ведь при том, что он ещё создаёт объёмный отчётный бранч-список.

ОЧЕНЬ БЛАГОДАРЕН Вам за очередной прекрасный макрос! Свои соображения-хотелки постараюсь сформулировать за день-другой. Сейчас они пока ещё только смутно вырисовываются в моём сознании.
Автор: Angel_Ka
Дата сообщения: 19.05.2016 21:00
shmuz2

Хочу ещё раз поблагодарить Вас за необыкновенно полезный макрос scite_like!

Подготовка бранч-списков больших баз для обработки макросом Filter Duplicates FileName in Editor от Alexyz21 была бы невозможна без scite_like. Выделяю вертикальный блок шириной в 1 символ в самом начале двух верхних строк файла, потом нажимаю CtrlAltPgDn и через некоторое время получаю возможность вставить в начало всех строк нужные цифры и одну табуляцию, т.е. делаю необходимую подготовку. Сделать же её в 800 тысячах, а тем более в 1 миллионе 800 тысячах строк по одной строке было бы немыслимо.


Автор: shmuz2
Дата сообщения: 19.05.2016 21:06
Angel_Ka
Можно другим способом: F7 или плагином LF Search:
Искать: ^
Заменить на: 1234\t
Автор: Angel_Ka
Дата сообщения: 19.05.2016 21:28
shmuz2

Цитата:
Можно другим способом

Чёт я сегодня с устатку сильно туплю и совсем забыл про плагин. А ведь плагином действительно существенно быстрее. На 1,8 миллиона сток полная подготовка всего за несколько секунд. Против 10 минут выделения столбца командой CtrlAltPgDn! Большое человеческое спасибо Вам за подсказку!

А вот нативной заменой почему-то не получилось. Несмотря на выставленную опцию [x] Регулярные выражения в начало строк вставляется текст "1234\t".
Автор: shmuz2
Дата сообщения: 19.05.2016 21:39
Angel_Ka
Да, нативная замена так не работает, забыл об этом. С нативной (и с LF Search тоже) можно ввести таб при помощи CtrlQ Tab.
Автор: Angel_Ka
Дата сообщения: 19.05.2016 21:48
shmuz2

Цитата:
С нативной (и с LF Search тоже) можно ввести таб при помощи CtrlQ Tab.

И ещё раз БОЛЬШОЕ СПАСИБО Вам за подсказку! Да, так нативная замена работает. Но она во много раз медленнее плагиновой. Тем не менее полезно знать про альтернативную возможность на всякий случай.
Автор: shmuz2
Дата сообщения: 19.05.2016 22:15
Angel_Ka
Но и в исходном варианте у вас неоптимально. Оптимально так:
1. Скопировать 1234+Tab в буфер обмена.
2. CtrlU CtrlHome CtrlAltEnd CtrlV
Автор: Angel_Ka
Дата сообщения: 20.05.2016 05:14
shmuz2

Цитата:
1. Скопировать 1234+Tab в буфер обмена.
2. CtrlU CtrlHome CtrlAltEnd CtrlV

И ещё раз БЛАГОДАРЮ Вас за очередную отличную подсказку!
Это практически удобный макрос, про пункт 1 которого, я сам как-то совсем не додумывался.

А тот Вариант, который я применял ранее, мне полезен был визуализацией — поэтапно наблюдать ход процесса. И стоит, наверное, отметить, что как применявшаяся мною в нём команда CtrlAltPgDn, так и команда CtrlAltEnd в любезно подсказанной Вами оптимальной последовательности хоткеев-шорткатов, в бранч-списке на 1,8 с гачком файлов исполняются более 10 минут. Может быть их тоже, если это конечно возможно, стоило бы как-то оптимизировать? LF Search то ведь добивается же практически того же результата за считанные секунды.
Автор: shmuz2
Дата сообщения: 20.05.2016 08:31
Angel_Ka

Цитата:
как применявшаяся мною в нём команда CtrlAltPgDn, так и команда CtrlAltEnd [...], в бранч-списке на 1,8 с гачком файлов исполняются более 10 минут

Решил проверить.
1. Создал файл, состоящий из 67 копий чейнжлога Far.
2. Открыл этот файл в редакторе. В файле 1817309 строк, то-есть примерно как у вас.
3. Измерил время исполнения CtrlAltEnd - получил 5.4 секунды.
Так что мне непонятно, откуда у вас более 10 минут.

Добавлено:
Разобрался, почему у вас медленно - это, похоже, следствие изменений в билде 4673 (я-то сижу на 4637). Поместил багрепорт на форуме.
Автор: Alexyz21
Дата сообщения: 20.05.2016 12:14
Стоя в панели на файле разве не быстрее? - Единственно надо быть внимательным и не забыть правильно установить область замены на выбранный файл.

В связи с тормозами при массовых заменах в редакторе, проявившимися после снятия zg блокировок, откатился на 4671 ещё пару дней назад.

1.0 [more]
Код: -- 1.0
local F = far.Flags
local ffi = require'ffi'
local C = ffi.C
local NULL = ffi.cast("void*",0)
local pHTAB = ffi.cast("void*",win.Utf8ToUtf16("\t"))
local PANEL_ACTIVE = ffi.cast("HANDLE",-1)
local pBL0,pBL1 = ffi.cast("BOOL*",0),ffi.cast("BOOL*",1)
local FSF = ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).FSF
--local msvcr120 = ffi.load("msvcr120")

local PanelMode,Desc1,Indi1 = 999,"Select duplicates","!?"
local guid = "FE9B8874-9651-434C-8182-72329F2371A5"
local uGuid = win.Uuid(guid)
local ZERO,HTAB,BS = ffi.cast("unsigned int",0),ffi.cast("unsigned int",9),string.byte("\\")
local ts = {nil,true,9999,true,false,2,2,true,false}
local freport = win.GetEnv("Temp").."\\Report.txt"
local Flags = C.SORT_STRINGSORT
local TAB=win.Utf8ToUtf16("\t")
local tts,FullPathEF,FileSizeEF,FileAttrEF = {}

ffi.cdef[[
void free (void*);
unsigned long int wcstoul(const wchar_t*, wchar_t**, int);
unsigned long long int wcstoull(const wchar_t*, wchar_t**, int);
wchar_t* wmemset(wchar_t*, wchar_t, size_t);
void* memset(void*, int, size_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);
]]

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 size = tonumber(C.wcstoul(name,pHTAB,0))
local ptr,size,attr
if FileAttrEF then
attr = tonumber(FSF.atoi(name))
ptr = C.wcschr(name,HTAB)
name = ptr==nil and name or ptr+1
end
if FileSizeEF then
size = tonumber(FSF.atoi64(name))
ptr = C.wcschr(name,HTAB)
name = ptr==nil and name or ptr+1
end
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,size,attr
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len,size,attr
else
return name,len,name,len,size,attr
end
end

local compare = function(p1,p2)
local st1,ln1 = GetStartAndLenW(p1[4])
local st2,ln2 = GetStartAndLenW(p2[4])
--local res = ts[4] and C._wcsicmp(st1,st2) or C.wcscmp(st1,st2)
local res = -2 + C.CompareStringW(C.LOCALE_USER_DEFAULT,Flags,st1,ln1,st2,ln2)
if res==0 and ts[6]~=2 then res=p1[6]-p2[6] end
if res==0 and ts[7]~=2 then res=p1[7]-p2[7] end
return res>0
end

local Items = {
--[[01]] {F.DI_DOUBLEBOX, 3,1, 65,9, 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, 38,3, 62,3, 0, 0,0, 0, "Ignore Full &Duplicates"},
--[[06]] {F.DI_CHECKBOX, 5,4, 21,4, 0, 0,0, F.DIF_3STATE, "&Sizes of FD:"},
--[[07]] {F.DI_CHECKBOX, 5,5, 26,5, 0, 0,0, F.DIF_3STATE, "&Attributes of FD:"},
--[[08]] {F.DI_CHECKBOX, 5,6, 35,6, 0, 0,0, 0, "Accuracy (&two-pass method)"},
--[[09]] {F.DI_CHECKBOX, 5,8, 15,8, 0, 0,0, 0, "Re&port"},
--[[10]] {F.DI_TEXT, -1,7, 0,0, 0, 0,0, F.DIF_SEPARATOR,""},
--[[11]] {F.DI_BUTTON, 0,8, 0,0, 0, 0,0, F.DIF_DEFAULTBUTTON+F.DIF_CENTERGROUP,"&Ok"},
--[[12]] {F.DI_BUTTON, 0,8, 0,0, 0, 0,0, F.DIF_CENTERGROUP,"Ca&ncel"}
}

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]==0 and F.BSTATE_UNCHECKED or tts[6]==1 and F.BSTATE_CHECKED or tts[6]==2 and F.BSTATE_3STATE)
hDlg:send(F.DM_SETTEXT,6,"&Sizes of FD: "..(tts[6]==0 and "<>" or tts[6]==1 and "==" or "--"))
hDlg:send(F.DM_ENABLE,6,FileSizeEF and 1 or 0)
hDlg:send(F.DM_SETCHECK,7,tts[7]==0 and F.BSTATE_UNCHECKED or tts[7]==1 and F.BSTATE_CHECKED or tts[7]==2 and F.BSTATE_3STATE)
hDlg:send(F.DM_SETTEXT,7,"&Attributes of FD: "..(tts[7]==0 and "<>" or tts[7]==1 and "==" or "--"))
hDlg:send(F.DM_ENABLE,7,FileAttrEF and 1 or 0)
hDlg:send(F.DM_SETCHECK,8,tts[8] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_ENABLE,8,FileSizeEF and 1 or 0)
hDlg:send(F.DM_SETCHECK,9,tts[9] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
elseif Msg==F.DN_BTNCLICK and (Param1==2 or Param1==4 or Param1==5 or Param1==8 or Param1==9) then
tts[Param1] = Param2~=0
elseif Msg==F.DN_BTNCLICK and (Param1==6 or Param1==7) then
tts[Param1] = Param2
hDlg:send(F.DM_SETTEXT,Param1,(Param1==6 and "&Sizes of FD: " or "&Attributes of FD: ")..(Param2==0 and "<>" or Param2==1 and "==" or "--"))
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="@ Filter Duplicates FileName in Editor"; name="SDFN"; area="Editor";
action=function()
local line=editor.GetStringW(-1,1,0).StringText
if line then
FileSizeEF,FileAttrEF,FullPathEF = regex.matchW(line,[[^(\d+\t)?(\d+\t)?([^\t]+)$]])
ts[6],ts[7] = FileSizeEF and ts[6] or 2,FileAttrEF and ts[7] or 2
end
if far.Dialog(uGuid,-1,-1,69,11,nil,Items,nil,DlgProc)==#Items-1 then
local t0 = far.FarClock()
for i=2,#Items-3 do ts[i]=tts[i] end
Flags = ts[4] and bit.bor(Flags,C.NORM_IGNORECASE) or bit.band(Flags,bit.bnot(C.NORM_IGNORECASE))
local tsel = {}
local ec=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).EditorControl
local ei=ffi.new("struct EditorInfo")
ei.StructSize=ffi.sizeof(ei)
if ec(-1,"ECTL_GETINFO",0,ei) then
local LastLine=tonumber(ei.TotalLines)-1
local egs=ffi.new("struct EditorGetString")
egs.StructSize=ffi.sizeof(egs)
local function PGPL(i)
egs.StringNumber=i
if ec(-1,"ECTL_GETSTRING",0,egs) then
local st1,ln1,st3,ln3,sz1,fa1=StartAndLenW(egs.StringText)
table.insert(tsel,{false,st1,ln1,st3,ln3,sz1,fa1,i+1,egs.StringText})
end
end
for i=0,LastLine do PGPL(i) end
table.sort(tsel,compare)
for i=2,LastLine+1 do
--if ts[4] and (ts[2] and C._wcsnicmp(tsel[i][2],tsel[i-1][2],ts[3])==0 or C._wcsicmp(tsel[i][2],tsel[i-1][2])==0) then Proc(i,C._wcsicmp(tsel[i][4],tsel[i-1][4])==0 and not (ts[6]==0 and tsel[i][6]==tsel[i-1][6] or ts[6]==1 and tsel[i][6]~=tsel[i-1][6] or ts[6]==2 and false))
--elseif not ts[4] and (ts[2] and C.wcsncmp(tsel[i][2],tsel[i-1][2],ts[3])==0 or C.wcscmp(tsel[i][2],tsel[i-1][2])==0) then Proc(i,C.wcscmp(tsel[i][4],tsel[i-1][4])==0 and not (ts[6]==0 and tsel[i][6]==tsel[i-1][6] or ts[6]==1 and tsel[i][6]~=tsel[i-1][6] or ts[6]==2 and false))
--end
if C.CompareStringW(C.LOCALE_USER_DEFAULT,Flags,tsel[i-1][2],tsel[i-1][3],tsel[i][2],tsel[i][3])==2 then
local x = C.CompareStringW(C.LOCALE_USER_DEFAULT,Flags,tsel[i-1][4],tsel[i-1][5],tsel[i][4],tsel[i][5])==2
local y = (ts[6]==0 and tsel[i-1][6]~=tsel[i][6] or ts[6]==1 and tsel[i-1][6]==tsel[i][6] or ts[6]==2)
and (ts[7]==0 and tsel[i-1][7]~=tsel[i][7] or ts[7]==1 and tsel[i-1][7]==tsel[i][7] or ts[7]==2)
if not ts[5] and (not ts[2] and x and y or ts[2] and y)
or ts[5] and (ts[6]==0 and tsel[i-1][6]==tsel[i][6] or ts[6]==1 and tsel[i-1][6]~=tsel[i][6])
and (ts[7]==0 and tsel[i-1][7]==tsel[i][7] or ts[7]==1 and tsel[i-1][7]~=tsel[i][7])
then
tsel[i-1][1]=true
tsel[i][1]=true
end
end
end
-- -ts[5] and ts[6]==0
-- +ts[5] and ts[6]==1
-- +not ts[5] and ts[6]==0
-- -not ts[5] and ts[6]==1
if ts[8] then
for i=2,LastLine+1 do
if (((ts[5] and ts[6]==1 or not ts[5] and ts[6]==0) and tsel[i-1][6]==tsel[i][6])
or ((ts[5] and ts[7]==1 or not ts[5] and ts[7]==0) and tsel[i-1][7]==tsel[i][7]))
and C.CompareStringW(C.LOCALE_USER_DEFAULT,Flags,tsel[i-1][4],tsel[i-1][5],tsel[i][4],tsel[i][5])==2
then
tsel[i-1][1]=false
tsel[i][1]=false
end
end
end
end
--Keys("ShiftF12")
if ts[9] then
local h = io.open(freport,"wb")
io.close(h)
local count=0
for i=1,#tsel do if tsel[i][1] then count=count+1 end end
h = io.open(freport,"ab")
local s = "Items: "..count.."/"..#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])..
"\nSizes of FD: "..(ts[6]==0 and "<>" or ts[6]==1 and "==" or "--")..
"\nAttributes of FD: "..(ts[7]==0 and "<>" or ts[7]==1 and "==" or "--")..
"\nAccuracy (two-pass method): "..tostring(ts[8])..
"\n"..string.rep("-",30).."\n"
h:write(s)
for i=#tsel,1,-1 do if tsel[i][1] then h:write(tsel[i][8].."\t"..win.Utf16ToUtf8(ffi.string(tsel[i][9],tonumber(C.wcslen(tsel[i][9]))*2)).."\n") end table.remove(tsel) end
io.close(h)
far.Message("mcs: "..far.FarClock()-t0,"SDFN")
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("-- ignore, == equal, <> is not equal","Help: Sizes of FD")
elseif Dlg.CurPos==7 then far.Message("-- ignore, == equal, <> is not equal","Help: Attributes of FD")
elseif Dlg.CurPos==8 then far.Message("Two-pass method for\n<> (is not equal) options only","Help: Accuracy")
elseif Dlg.CurPos==9 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
Дата сообщения: 20.05.2016 16:43
shmuz2

Цитата:
Разобрался, почему у вас медленно – это, похоже, следствие изменений в билде 4673

Большое спасибо, что разобрались! Мне бы было не понять, баг это или так и было.

А я после Вашего вопроса ещё перед сменой успел попробовал запустить Far без плагинов. И в Win10entRu x64 Far 3.0 build 4682 x64 на двух по-разному сконфигурированных машинах получил следующее. По CtrlEnd и CtrlHome курсор перескакивает практически мгновенно. А вот по CtrlAlt[PgDn,PgUp,End,Home] примерно на 10 минут Far как бы зависает, и только по прошествии данного времени курсор оказывается в заданной позиции. А в промежуток времени между подачей команды и её завершением Far ни на какие действия пользователя не реагирует, и выйти из него можно только убиением процесса. По показателям System Explorer ЦП на время "зависания" загружено на 25% (в обычном состоянии — 1-4%), а вот память как будто бы без изменений.

Alexyz21

Цитата:
1.0

БОЛЬШОЕ СПАСИБО! Увидел и скопировал. Но посмотрю не раньше чем поздно вечером, скорее всего — к ночи.

Предварительный вопрос: каким должен быть формат строки исходного бранч-файла?, типа таким: "32\t1200\tC:\проба2\probe.txt"? Вчитался в Ваше сообщение и разобрался. БОЛЬШОЕ СПАСИБО!

На мой взгляд, сделать возможной детекцию любого из трёх форматов это очень мудрое решение! Во всяком случае для пользователя необыкновенно удобное. Ещё раз БЛАГОДАРЮ Вас за очередной прекрасный макрос!
Автор: Angel_Ka
Дата сообщения: 20.05.2016 20:55
Alexyz21

Опробовал 1.0 на микротесте. В форматах FullPath, FileSize\tFullPath и FileAttributes\tFileSize\tFullPath. Результаты превосходные!

Тест обработки бранч-списка на базе из 2.901.187 файлов:

Код: 1) FullPath 233 сек

[x] Number of symbols -7
[ ] Ignore case [ ] Ignore Full Duplicates


2) FileSize-tFullPath 229 сек

[x] Number of symbols -7
[ ] Ignore case [ ] Ignore Full Duplicates
[x] Sizes of FD: ==
[?] Attributes of FD: --
[ ] Accuracy (two-pass method)


3) FileAttributes-tFileSize-tFullPath 235 сек

[x] Number of symbols -7
[ ] Ignore case [ ] Ignore Full Duplicates
[x] Sizes of FD: ==
[x] Attributes of FD: ==
[ ] Accuracy (two-pass method)
Автор: Angel_Ka
Дата сообщения: 21.05.2016 00:22
Alexyz21

Ваш очередной макрос в очередной раз превзошёл мои первоначальные ожидания! Filter Duplicates FileName in Editor делает свою работу очень быстро и по её результатам создаёт отчётный бранч-список, содержащий кроме полных имён файлов также и дополнительную очень полезную для его последующего анализа информацию. Это очень удобно, и я очень благодарен Вам за это!

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

Поэтому, по возможности, прошу Вас сделать так, чтобы по результатам работы макроса создавались 3 файла. Первый, Report.txt, — с отчётом о применённых настройках, т.е. с тем, что сейчас в его шапке. Второй, желательно бы с именем типа BranchExt.tmps, — с основным результатом работы макроса по разработанному Вами формату. И третий, просто Branch.tmps, — с результатами работы макроса в сокращённом традиционном стиле.

Файл-список Branch.tmps с его традиционным форматом мне бы нужен для оперативных экспериментов с бранчами хоть сейчас. А вот касательно расширенного формата списка BranchExt.tmps, с сегодняшней версии дополненного колонкой атрибутов файлов, такой вопрос: как Вы полагаете, его форма уже в окончательном виде или ещё последуют трансформации?
Автор: VictorVG4
Дата сообщения: 21.05.2016 00:35
Angel_Ka

Макрос енто не плохо, но пока не рекомендую использовать команды ОС обрабатываемые Far с модификатором типа start /i <filename> - в b4679 это поломано. В тему зарепортил , ждём ремонту...
Автор: Angel_Ka
Дата сообщения: 21.05.2016 00:49
VictorVG4
Большое спасибо за предупреждение! Лучше перебдеть, чем недобдеть.

Страницы: 123456789101112

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


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