Цитата: Совпавшие снова сравнить уже по полной длине. И те, которые и по частичной и по полной длине совпали исключить.
Нет смысла сравнивать полностью, если они исключаются, ведь они уже находятся во множестве частично совпавших, которые вы также предлагаете исключать :)
С выделением по совпадению N первых символов: [more]
Код: local F = far.Flags
local ffi = require'ffi'
local C = ffi.C
local BS = string.byte("\\")
ffi.cdef[[
int strcmp(const char*, const char*);
int _stricmp(const char*, const char*);
int _strnicmp(const char*, const char*, size_t);
char* strrchr(const char*, int);
size_t strlen(const char*);
int memcmp(const void*, const void*, size_t);
]]
local function StartAndLen(name)
local ptr = C.strrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.strlen(name))
return name,len
end
Macro {
description="* Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
local sz=far.InputBox(nil,"Select duplicates","Compare first symbols: ",nil,"999",4,nil,F.FIB_NONE)
if sz then
sz = tonumber(sz)
local pBL=ffi.cast("BOOL*",1)
local pc=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).PanelControl
local pin=panel.GetPanelInfo(nil,1)
if bit.band(pin.Flags,F.PFLAGS_SELECTEDFIRST)>0 then Keys("ShiftF12") end
pc(PANEL_ACTIVE,"FCTL_SETNUMERICSORT",0,nil)
pc(PANEL_ACTIVE,"FCTL_SETCASESENSITIVESORT",0,nil)
if pin.SortMode~=F.SM_NAME then panel.SetSortMode(nil,1,F.SM_NAME) end
local sid,sel,j,fn0,fn1,st0,ln0,st1,ln1,t0 = 0,{},0,"","",0,0,0,0,far.FarClock()
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,nil)
for i=1,pin.ItemsNumber do
fn0=fn1
st1,ln1=StartAndLen(panel.GetPanelItem(nil,1,i).FileName)
fn1=ffi.string(st1,ln1)
if C._strnicmp(fn1,fn0,sz)==0 then
if i>j then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL)
table.insert(sel,{fn0,1})
sid=1
end
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL)
j,sid=i+1,sid+1
sel[#sel][2]=sid
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,nil)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,nil)
table.sort(sel,function(a,b) return a[2]>b[2] end)
local s=""
for i=1,#sel do s=s..sel[i][2].."\t"..sel[i][1].."\n" end
fwrite(s,"Z:\\Temp\\Report.txt")
Keys("ShiftF12")
msgbox("SDFN","mcs: "..far.FarClock()-t0.."\n\nUse ShiftF12 for sort")
end
end;
}