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*); 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 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._stricmp(fn1,fn0)==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; } |