Ru-Board.club
← Вернуться в раздел «Программы»

» Far Manager

Автор: Alexyz21
Дата сообщения: 04.05.2016 09:08

Цитата:

Код: Установить выделение в панели.
Param1 порядковый номер элемента на панели (подмножество PanelInfo::ItemsNumber).
Param2 указывает на переменную типа BOOL (TRUE - выделить элемент, FALSE - снять выделение).
Нужно вызвать FCTL_REDRAWPANEL для показа изменений.

Пример:

// начинаем операцию по выделению файлов
Info.PanelControl(PANEL_ACTIVE,FCTL_BEGINSELECTION,0,NULL);

// выделяем
for(int i=0; i < PInfo.ItemsNumber; i++)
{
Info.PanelControl(PANEL_ACTIVE,FCTL_SETSELECTION,i,(void*)TRUE);
}
// завершаем операцию и перерисовываем панель
Info.Control(PANEL_ACTIVE,FCTL_ENDSELECTION,0,NULL);
Info.Control(PANEL_ACTIVE,FCTL_REDRAWPANEL,0,NULL);

Автор: shmuz2
Дата сообщения: 04.05.2016 10:14

Цитата:
Зачем нужны FCTL_BEGINSELECTION и FCTL_ENDSELECTION, если мы конкретно указываем выделяемую позицию с помощью FCTL_SETSELECTION? Из LUA нормально выделяет и без посылки обрамления в begin/end.

Они нужны, чтобы не перерисовывать панель при выделении каждого элемента. LuaFAR это тоже делает "за кадром", поэтому передавать элементы в panel.SetSelection() лучше сразу всем массивом, а не по одному.
Автор: Alexyz21
Дата сообщения: 04.05.2016 10:47

Код: string.gsub(panel.GetPanelItem(nil,1,i).FileName,"^.+\\","")
Автор: VictorVG4
Дата сообщения: 04.05.2016 11:54
2Wave

Отключите кэширование и запоминание каталогов. У себя специально так настроил и по этой причине за годы ни одного падения не имел.

Добавлено:
Для справки:

1) 03.05.2016 вышли OpenSSL v1.0.1t (срок поддержки заканчивается 31.012.2016)/1.0.2h (рекомендуется, позднее ветку 1.0.2 заменит разрабатываемая ветка 1.1.0);

2) может пригодится - список корневых SSL сертификатов на сегодня с датами действия - certdata.txt . У меня в b4661 так же используются новые сертификаты.

P.S.

в x64 уже, х86 собираю, в течении получаса сервера обновятся.
Автор: Angel_Ka
Дата сообщения: 04.05.2016 19:45
Alexyz21

Цитата:
Финальная

Большое спасибо за совершенствование макроса, помечающего группы одноимённых файлов на бранч-панели, — Select Duplicates FileName in Branch panel! Вот краткие сведения по времени работы его четвёртой и пятой версий (mcs):

На 80 тыс. файлов:
Код: 4 — 559356 564688 569195
5 — 535188 530366 543044
Автор: Alexyz21
Дата сообщения: 04.05.2016 20:04
Angel_Ka
6-я [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*);
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
if pin.SortMode~=F.SM_NAME then panel.SetSortMode(nil,1,F.SM_NAME) end
local j,fn0,fn1,st0,ln0,st1,ln1,t0 = 0,"","",0,0,0,0,far.FarClock()
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,nil)
for i=1,pin.ItemsNumber do
st0,ln0 = st1,ln1
st1,ln1=StartAndLen(panel.GetPanelItem(nil,1,i).FileName)
if ln1==ln0 and C.memcmp(st1,st0,ln1)==0 then
if i>j then pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL) end
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL)
j=i+1
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,nil)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,nil)
Keys("ShiftF12")
msgbox("SDFN","mcs: "..far.FarClock()-t0.."\n\nUse ShiftF12 for sort")
end;
}
Автор: shmuz2
Дата сообщения: 04.05.2016 20:33
Alexyz21

Цитата:
дальнейшее ускорение только за счёт перевода на API panel.GetPanelItem(nil,1,i).FileName, но с этим не ко мне.

Angel_Ka

Цитата:
На днях мы уже обращались к уважаемому shmuz2, и он отвечал, что в данный период у него большая рабочая нагрузка.

Господа, здесь форум, который читает много людей, в том числе и таких, которые способны решить эти задачи. Неправильно думать, что кроме меня здесь некому помочь. Если не помогают, значит... судьба такая. Но прежде всего желательно пытаться помочь самим себе.
Автор: Alexyz21
Дата сообщения: 04.05.2016 21:03
Оказывается дело в судьбе... а я то думал, что как всегда и везде, дело в людях. И то правда, нашли где помощь искать - на форуме! - Наивные (Шмуел это не в ваш огород, это в поля тех бойцов невидимого фронта, которых днём с огнём...)
Автор: shmuz2
Дата сообщения: 04.05.2016 21:24
Насчёт судьбы это я для краткости. А на самом деле, если человек сразу знает решение, то обычно помогает. А если видит, что ему самому придётся час повозиться, чтобы помочь, да и проблема для него не слишком интересна - таких помогальщиков действительно днём с огнём не найдёшь - и это вполне логично.
Автор: Angel_Ka
Дата сообщения: 04.05.2016 21:42
shmuz2
Извините, если я Вас чем то нечаянно задел, но я вовсе не помышлял ёрничать. Тем более в Вашу сторону. У меня у самого сегодня был длинный суматошный день. И я вполне признаю, что многим людям доводится очень плотно работать. И если у Вас нет времени, на то, что Вы не считаете первоочередным, то так тому и быть. Или, в стиле того как Вы выражаетесь, — значит не судьба. Принято. Со всем к Вам искренним и глубоким уважением!


Цитата:
Но прежде всего желательно пытаться помочь самим себе.

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


Добавлено:
Alexyz21

Цитата:
6-я

Очень рад! Постараюсь сегодня же обследовать. С огромной благодарностью!
Автор: shmuz2
Дата сообщения: 04.05.2016 22:05
Angel_Ka

Цитата:
Извините, если я Вас чем то нечаянно задел

Не, ни в коем случае, никто меня не задел. Вам не за что извиняться.
Автор: Angel_Ka
Дата сообщения: 04.05.2016 22:17
Alexyz21

На 711 тыс. файлов (другая база, не та, что прежде):

Код: 5 — 3671266 3738052 3707222

6 — 3513467 3544157 3511459
Автор: VictorVG4
Дата сообщения: 04.05.2016 22:50
shmuz2

Провёл тест создание каталога с именем заданным переменной среды :

F7 -> %USERNAME% -> Enter

до b4434 включительно тест выполнялся корректно, начиная b4435 уже воспроизводится ошибка. Так что момент её появления SVN r13449.
Автор: Alexyz21
Дата сообщения: 04.05.2016 22:57
Angel_Ka

Цитата:
На 711 тыс. файлов (другая база, не та, что прежде)

Это не эта:

Цитата:
Вышеупомянутую базу из 711 624 файлов вместо часа обрабатывает за 10 секунд — вот три пробы: mcs: 9926678 mcs: 9999617 mcs: 9923393.
?
тогда ещё в 2.8 раза быстрее.
Больше вариаций не будет, была, правда, ещё одна, но по внутреннему тестированию её производительность была между 5-ой и 6-ой, поэтому 6-я окончательная. Кстати, надо посмотреть как она под х64 себя чувствует - memcmp() меня смущает.
Автор: Angel_Ka
Дата сообщения: 04.05.2016 23:57
Alexyz21

Цитата:
Это не эта ...?

Не совсем эта, более новая, но очень близкая по содержанию. А по примерно такому же количеству файлов, степени их вложенности и большому числу дублей (около 5% от общей численности), вполне можно считать за ту. Так что Ваш вывод о том, что "ещё в 2.8 раза быстрее", скорее всего верный.


Цитата:
надо посмотреть как она под х64 себя чувствует

Так я же только под x64 и замерял. Каждый раз последняя ночная сборка. На Win10entRu x64. У меня специально и на одном из домашних компов та же система, что на рабочих.
Автор: VictorVG4
Дата сообщения: 05.05.2016 02:21
b4662 SVN r14130

При создании каталога с именем заданным через переменные среды они раскрываются правильно. Уже глянул.
Автор: Alexyz21
Дата сообщения: 05.05.2016 08:14
FAR3.0.4662
Заголовок в редакторе после отработки батча RESearch по прежнему не восстанавливается. - Не видно, что батч отработал, когда (у меня всегда так) на время его работы переключаешься в другое приложение и работаешь в нём.
Автор: Alexyz21
Дата сообщения: 05.05.2016 10:36
В меню плагина SortStr поломались переходы по полям с помощью TAB - произошло ли это в результате недавних ломок/починок FAR или это проблемы самого плагина мне неизвестно.

Добавлено:
Shmuel
LuaMacro: cannot resolve symbol 'stricmp': Не найдена указанная процедура.
Функция stricmp() не поддерживается? - Можно добавить?
задекларировал:
ffi.cdef[[int stricmp(const char*, const char*);]]
вызвал C.stricmp, получил сообщение выше.


Добавлено:
Angel_Ka
С сохранением списка дубликатов, отсортированном по убыванию. [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*);
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",1,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 fn1==fn0 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;
}
Автор: shmuz2
Дата сообщения: 05.05.2016 11:45

Цитата:
Функция stricmp() не поддерживается? - Можно добавить?

Добавлять по одной функции не буду, тем более неюникодные. Задекларируйте _stricmp.
Автор: Angel_Ka
Дата сообщения: 05.05.2016 12:01
Alexyz21
Большое спасибо! Но, увы, седьмая пока не взлетает:

Код: LuaMacro

...‚ьОдноименныеВбранче(Alexyz21)she.lua:55: attempt to call global 'fwrite' (a nil value)
Stack Traceback
Автор: Alexyz21
Дата сообщения: 05.05.2016 12:02
shmuz2
Спасибо, работает.

Angel_Ka
С игнорированием регистра символов в именах [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*);
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;
}
Автор: Angel_Ka
Дата сообщения: 05.05.2016 12:30
Alexyz21

Цитата:
Выше же код функции привёл - они у меня глобальные, прописаны в скрипте _My.lua и загружаются вместе с FAR, соответственно.

Создал _My.lua с вышеуказанными функциями, положил в папку с плагином luamacro и в C:\Far\Profile\Macros\modules\ тоже. Макрос обновил на последний вариант. Перезагрузил Фар. Ошибка выскакивает та же. Дайте, пожалуйста, более подробные инструкции.
Автор: Alexyz21
Дата сообщения: 05.05.2016 12:39

Цитата:
положил в папку с плагином luamacro и в C:\Far\Profile\Macros\modules\ тоже.

Зачем? - В папку скриптов к остальным, как обычно.
Автор: Angel_Ka
Дата сообщения: 05.05.2016 12:46

Цитата:
В папку скриптов к остальным, как обычно.

Большое спасибо! Седьмая работает!

Добавлено:
В списке дубликатов нумерацию строк не нужно. — я не понял, что означает нумерация слева?
А вот пути оставить желательно бы.
Автор: shmuz2
Дата сообщения: 05.05.2016 12:52

Цитата:
они у меня глобальные, прописаны в скрипте _My.lua и загружаются вместе с FAR

Не рекомендуемая практика. Но уж если пользуетесь, то правильнее поместить в _macroinit.lua.
Автор: Angel_Ka
Дата сообщения: 05.05.2016 13:01
Alexyz21

С давних пор использую такой, некогда найденный на форуме Фара, макрос:

Код: Macro {
area="Shell"; key="CtrlAlt, CtrlAlt. CtrlAlt/"; flags="NoPluginPanels";
description=".Find selected file in passive panel";
action = function()
f=Panel.Item(0,0,0);
if Panel.FExist(1,f) then
Keys("Tab Alt;") print(f) Keys("Esc")
end
end;
}
Автор: Alexyz21
Дата сообщения: 05.05.2016 13:08
Angel_Ka

Цитата:
я не понял, что означает нумерация слева?

Количество дубликатов, наверное

shmuz2
Поместил. Как я понимаю, загрузка скриптов идёт по алфавиту, поэтому _my.lua отрабатывает сразу за _macroinit.lua, у меня нет привычки именовать скрипты с подчёркивания.
Автор: Angel_Ka
Дата сообщения: 05.05.2016 13:14
shmuz2

Цитата:
поместить в _macroinit.lua

Большое спасибо за подсказку! Даже с точки систематизации макросов это очень полезно знать.
Автор: shmuz2
Дата сообщения: 05.05.2016 13:15
Alexyz21
_macroinit.lua гарантированно вызывается первым, это документированная фича.
Что же касается вызова по алфавиту, то это не документировано, и не обязательно будет работать одинаково на разных системах.
Автор: Alexyz21
Дата сообщения: 05.05.2016 13:20
Angel_Ka
Дело вкуса, но
Цитата:
flags="NoPluginPanels"
я бы убрал - в архивах, и на том же бранче удобно находить.

Цитата:
помечал бы на бранч-панели файлы с частично не совпадающими именами

Если напишите функцию, возвращающую нормированный результат [0..1] совпадения двух строк, то можно и подумать

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: оффтоп


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