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

» Far Manager

Автор: Angel_Ka
Дата сообщения: 01.05.2016 20:01
Alexyz21

Цитата:
а разве сейчас на бранч-панели одноимённые не группируются вместе, независимо от папки-родителя?

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


Цитата:
Добавил комменты

Попробовал, но, видимо, не понял сути системы их оформления.
Как, например, добавить комментарий к такому регексу:
Код: /^(?:(\d{5}.*?[\.,;] )|(\d{5}к2)|(\d{5}\D+ГОСТ (?!Р))|(\d{5}\D+ГОСТ Р)|(\d{,4}\D)|(\d{5}\d+))/i{!:$6$5$1$3$2$4}
Автор: Alexyz21
Дата сообщения: 01.05.2016 20:04
F4 (открывается редактор, в нём на 1-й строке регэксп) вставляем в начало -- комментарий, жмём Enter, перенося регэксп на 2-ю строку.
Автор: Angel_Ka
Дата сообщения: 01.05.2016 20:08

Цитата:
Впрочем, возможно, данный Вами ранее совет присмотреться к фильтрам в этом случае может быть как раз кстати.

И всё же нет — очевидно желательна именно сортировка. Из-за незнания имён не понятно что фильтровать.
Автор: Alexyz21
Дата сообщения: 01.05.2016 20:08
Дубликаты можно решить другим макросом - перебирать панель итемы, при совпадении выделять, после отработки ShiftF12 - подняли.

Добавлено:
Правда непонятно что дальше с ними делать, если только смотреть Как только выделение снимаем, они "падают". Но если уверены, что это точно дубликат (можно убедится по размеру, хэш-суммам, либо с помощью Visual Compare), то выделение с 1-го файла из каждой группы можно снять, а дубликаты замочить.
Автор: Angel_Ka
Дата сообщения: 01.05.2016 20:32
Alexyz21

Цитата:
F4 (открывается редактор, в нём на 1-й строке регэксп) вставляем в начало -- комментарий, жмём Enter, перенося регэксп на 2-ю строку.

Понял, убрал вмешивавшийся макрос, и получилось. Между комментарием и регексом вставляются 2 знака — чёрная нота на светлом фоне: "♪" (Alt-13 ) и большой светлый круг на тёмном фоне: "◙" (Alt-10).

Очень удобно! БОЛЬШОЕ СПАСИБО!

Добавлено:
Alexyz21

Цитата:
а дубликаты замочить

А вот этого, пожалуйста, не надо. Пусть будут.

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

Автор: Alexyz21
Дата сообщения: 01.05.2016 20:39
Да, этими символами обозначаются 0D0Ah (\r\n) возврат каретки и перевод строки.

Переименовать можно вставив в начало !!! - тогда они будут наверху при сортировке.
Автор: Angel_Ka
Дата сообщения: 01.05.2016 20:47
Alexyz21
СПАСИБО за подтверждение! Мне было нужно убедиться, что всё правильно.
И ещё раз БЛАГОДАРЮ Вас за прекрасный макрос пользовательской сортировки Panel.CustomSortByName.lua и за помощь в его освоении!


Добавлено:

Цитата:
Переименовать можно вставив в начало !!! - тогда они будут наверху при сортировке.

Проблема в том, что имена их заранее не известны, и сначала их нужно быстро отсортировать не отделяя от остальных, оставляя их в "родных" папках. Затем их нужно уникально маркировать, не сильно, при этом, изменяя их имена. А уж маркированными то они потом уже будут быстро и находиться, и сортироваться, и т.п.

И всё это с учётом того, что очень может быть несколько (а, возможно, и несколько десятков) групп одноимённых файлов в каждом из наборов, и смешивать их нельзя.
Автор: Alexyz21
Дата сообщения: 01.05.2016 21:15
shmuz2
Нужно ли в regex экранировать минусы? Или их экранировка нужна только внутри [] класса? Попробовал вне класса, работает и без бэкслэшей.
Автор: shmuz2
Дата сообщения: 01.05.2016 21:22
Только внутри [] класса. Вне класса - можно, но не обязательно.
Автор: Alexyz21
Дата сообщения: 02.05.2016 03:29
Angel_Ka

Код: Macro {
description="Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
local fn0,fn1 = "",""
for i=1,panel.GetPanelInfo(nil,1).ItemsNumber do
fn0,fn1 = fn1,regex.match(panel.GetPanelItem(nil,1,i).FileName,"[^\\\\]+$")
if fn1==fn0 then panel.SetSelection(nil,1,{i-1,i},true) end
end
msgbox("SDFN","Use ShiftF12 for sort")
end;
}
Автор: Angel_Ka
Дата сообщения: 02.05.2016 06:54
Alexyz21

Цитата:
description="Select Duplicates FileName in Branch panel";

Абсолютно именно то, что нужно! Сказочно замечательно! БОЛЬШОЕ СПАСИБО!
Автор: Alexyz21
Дата сообщения: 02.05.2016 08:49
Такой вариант шустрее:

Код: Macro {
description="Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
local t0,fn0,fn1 = far.FarClock(),"",""
for i=1,panel.GetPanelInfo(nil,1).ItemsNumber do
fn0,fn1 = fn1,string.match(panel.GetPanelItem(nil,1,i).FileName,"[^\\\\]+$")
if fn1==fn0 then panel.SetSelection(nil,1,{i-1,i},true) end
end
msgbox("SDFN","mcs: "..far.FarClock()-t0.."\n\nUse ShiftF12 for sort")
end;
}
Автор: Angel_Ka
Дата сообщения: 02.05.2016 09:00
Alexyz21
А можно этот макрос преобразовать в функцию для Panel.CustomSortByName.lua?
А то я попробовал прямолинейно так:
Код: local fn0,fn1 = "","" for i=1,panel.GetPanelInfo(nil,1).ItemsNumber do fn0,fn1 = fn1,regex.match(panel.GetPanelItem(nil,1,i).FileName,"[^\\\\]+$") if fn1==fn0 then panel.SetSelection(nil,1,{i-1,i},true) end end
Автор: Alexyz21
Дата сообщения: 02.05.2016 09:30

Цитата:
А можно этот макрос преобразовать в функцию для Panel.CustomSortByName.lua?

Нет. Это отдельный макрос и он к Panel.CustomSortByName.lua не имеет отношения.
Автор: Angel_Ka
Дата сообщения: 02.05.2016 09:35
Alexyz21
Ладно. Приспособлюсь.

Новый вариант макроса в 2,5 раза быстрее прежнего.
Ещё раз БЛАГОДАРЮ Вас за помощь!
Автор: Alexyz21
Дата сообщения: 02.05.2016 10:02

Цитата:
Новый вариант макроса в 2,5 раза быстрее прежнего

а в абсолютных значениях приемлемо? как соотносится с сортировкой?
Автор: Angel_Ka
Дата сообщения: 02.05.2016 10:22
Alexyz21


Цитата:
а в абсолютных значениях приемлемо?

По сравнению с имевшими место вариантами утилит — более чем приемлемо.


Цитата:
как соотносится с сортировкой?

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

ОГРОМНОЕ СПАСИБО за очень полезный макрос выделения дубликатов файлов на бранч-панели Select Duplicates FileName in Branch panel!
Автор: VictorVG4
Дата сообщения: 02.05.2016 11:08
Alexyz21

Приспособил твой сортировщик к делу - Shell_Branch.lua:


Цитата:
-- Макрос модифицирован с использованием скрипта сортировки
-- от Alexyz21 http://forum.ru-board.com/topic.cgi?forum=5&topic=48136&start=1200#19
-- из которого выкинута измерительная часть за ненужностью. Он строит на Временной
-- панели Far дерево каталогов и сортирует похожие по именам файлы вместе. Сработает
-- только если не существует плагин TRUE-Branch - так задумано, вызов AltShiftB.
--
-- v1.1 от Mon May 02 10:56:50 +0300 2016
-- v1.2 - выкинем случайно оставшийся far.FarClock() - Mon May 02 11:21:07 +0300 2016
--
local TBID="148FE5E0-7129-4269-B30F-A1A866DD009A"
Macro {
description="DirTree branch"; flags="EnableOutput";
area="Shell"; key="AltShiftB";
uid="E567C945-6F38-4517-BCD2-DD2C58EC3618";
condition=function() if (Plugin.Exist(TBID)~=1) then return true else return false end end;
action=function()
Keys"AltF7"
if not Area.Dialog then return end
Keys"* Enter"
local lastitem = Dlg.ItemCount
local STOP_BUTTON = Dlg.GetValue(lastitem)
far.Timer(50,function(timer)
if not Area.Dialog then
timer:Close()
elseif Dlg.GetValue(lastitem)~=STOP_BUTTON then
timer:Close()
Dlg.SetFocus(lastitem-1)
far.MacroPost[[Keys ("Enter")]]
end
end)
local fn0,fn1 = "",""
for i=1,panel.GetPanelInfo(nil,1).ItemsNumber do
fn0,fn1 = fn1,string.match(panel.GetPanelItem(nil,1,i).FileName,"[^\\\\]+$")
if fn1==fn0 then panel.SetSelection(nil,1,{i-1,i},true) end
end;
end;
}

функция очистки временной панели не вставлена специально чтобы человек успел разобраться с "уловом", в принципе добавить её не сложно, но надо ли? Вроде нажать * F7 на временной панели не сложно.

P.S.

far.FarClock() убран - случайно остался
Автор: Alexyz21
Дата сообщения: 02.05.2016 11:08
Судя по всему его можно ускорить раза в 2, используя ffi и FAR API, но в этих структурах чёрт ногу сломит.

Добавлено:

Цитата:
local fn0,fn1 = far.FarClock(),""

local fn0,fn1 = "",""
Автор: VictorVG4
Дата сообщения: 02.05.2016 11:15
Alexyz21

Факт, ускорить можно, но FFI в какой-то степени зависит от системного API, а что редмондские студиозусы там завтра выкинут и сам рогатый не скажет. Сегодняшняя реализация скрипта по крайней мере предсказуема и не зависит от реализации сторонних по отношению к Far функций, а это может оказаться критичным.
Автор: Alexyz21
Дата сообщения: 02.05.2016 11:20
VictorVG4

Цитата:
Приспособил твой сортировщик

Он не сортировщик - он выделяльщик
Автор: VictorVG4
Дата сообщения: 02.05.2016 11:28
Alexyz21

За подсказки спасибо! far.FarClock() случайно оставил , поправил. Ну а сортировщик - выделяльщик ты прав, но в данном случае он выполняет простую задачу - упрощает поиск элементов с похожими именами, а дальше пусть человек принимает решение.
Автор: Alexyz21
Дата сообщения: 02.05.2016 11:33

Цитата:
и сортирует похожие по именам файлы вместе

Не-а. Он выделяет идентичные имена файлов, что возможно только на Branch панели и которая к тому же должна быть отсортирована по имени ДО применения макроса.
Автор: VictorVG4
Дата сообщения: 02.05.2016 12:00
Alexyz21

Видел, просто скрипт Shell_Branch.lua у меня лежал в запасе и использовался раз в год по обещанию для тестов, а тут знакомые попросили включить, вот заодно и чуть его проапдейтил - condition() в первоначальном варианте не было и твой фрагмент им до кучи - пусть в командировке развлекаются.
Автор: Alexyz21
Дата сообщения: 02.05.2016 13:01
А то, что он работать не будет, и даже если бы смог, то совершенно не так, как заявлено в описании - это не смущает? Или в этом и есть весь смысл "развлечения"?
Автор: VictorVG4
Дата сообщения: 02.05.2016 13:23
Alexyz21

Это им на закуску - пусть возятся. На деле нужен только блок строящий дерево на временной панели и кондитион, а остальное из рабочего скрипта убрано. Правда есть идея, но покуда нет времени её реализовать. М.б. позднее если потребуется?

Добавлено:
Посмотрел на b4656 M#3227 - у меня работает, ошибка воспроизводилась на b4655, на b4656 ушла.
Автор: Angel_Ka
Дата сообщения: 02.05.2016 13:55
Alexyz21

Цитата:
а в абсолютных значениях приемлемо? как соотносится с сортировкой?

Сделал 3 теста на подручном материале.

В микротесте на 3 МБ 325 файлов выделяльщик работал быстрее сортировщика в 30 раз.

В тесте на 1,5 ГБ 18 тыс. файлов выделяльщик работал быстрее сортировщика в 9 раз.

В тесте на 212 ГБ 715 тыс. файлов выделяльщик работал медленнее сортировщика в 11 раз.

В последнем тесте, который ближе всего к "полевым" условиям, SDFN обрабатывал данную панель более 4 000 000 000 mcs, т.е. дольше часа. В моём случае это всё равно весьма приемлемо. Но, всё же, по возможности, неплохо было бы и ускориться.
Автор: Alexyz21
Дата сообщения: 02.05.2016 14:09
Angel_Ka
С ускорением сможет помочь только Shmuel, я пробовал сделать на FAR API с FFI, но не смог.
Автор: Angel_Ka
Дата сообщения: 02.05.2016 14:28
Alexyz21
Это не к спеху. Даже и без дополнительного ускорения для меня Ваш макрос SDFN очень полезен и удобен. Ёщё раз низкий поклон Вам от меня за него!

shmuz2
Цитата:
С ускорением сможет помочь только Shmuel

А что Вы на это скажете, уважаемый shmuz2?
Автор: shmuz2
Дата сообщения: 02.05.2016 15:52
Angel_Ka
Загрузка на работе сейчас велика. Может быть приготовлю какой-то отдельный небольшой пример использования regex-ов посредством FFI, но на что-то большее времени однозначно нет.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

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


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