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

» Far Manager

Автор: VictorVG2
Дата сообщения: 06.03.2016 10:49
Angel_Ka

Можно, а то, что так зовётся обычно называют "подпрограммой", и это технически правильный приём. Никакого криминала за ним нет.
Автор: Angel_Ka
Дата сообщения: 06.03.2016 11:25
VictorVG2

Цитата:
это технически правильный приём

Спасибо за позитивную характеристику! Скомпоную весь набор и положу под "коврик". Мало ли кому то ещё понадобится.
Автор: Alexyz21
Дата сообщения: 06.03.2016 11:26
shmuz

Цитата:
Ваща беседа напомнила мне вопрос о выключателе. Почему он называется выключатель, ведь сначала надо включить?

Так это ж "русские" - у них всё через... тернии к звёздам с 17-го года. У англичан - switch (переключатель).
Автор: VictorVG2
Дата сообщения: 06.03.2016 11:30
Alexyz21

Не волнуйся, у янки оно самое много глубже. Глянь чип Alcor Mico Corp. AU6370. Создавали его как раз янки в Кремниевой долине и глянь ногу 54 чипа. Пример как не надо делать.
Автор: Alexyz21
Дата сообщения: 06.03.2016 13:15
VictorVG2
Предлагаете посмотреть на чипы российского производства? - Так на них лучше вообще не смотреть - каменный век, плюс высокий процент отбраковки и такая ситуация во всех отраслях. Раздуваемое самомнение приведёт в конце концов лишь к краху иллюзий, как это уже было 30 лет назад. Гордость за отчизну определяется в первую очередь гордостью за достижения, ибо по ним оценивается величие цевилизации.
Автор: Angel_Ka
Дата сообщения: 06.03.2016 13:19
Alexyz21

Цитата:
с 17-го года

А вот это вряд ли. В словаре Даля, составленном за полвека до года двух революций, есть слово Выключатель, но нет слова Включатель. В технической литературе понятие "трехполюсный выключатель" встречается с конца 19 века. У Фёдора Сологуба в написанном им в 1910 году рассказе "Путь в Дамаск" есть такой абзац: "Откинул тяжелые складки. Повернул выключатель, — и вдруг неярким светом электрической лампочки в потолке озарился тесный альков, — серый мрамор умывальника с медными, красивыми кранами, и громоздкая, нагло громадная кровать.".
Автор: VictorVG2
Дата сообщения: 06.03.2016 13:27
Alexyz21

Отечественные чипы увы, далеко не такое барахло как кому-то хочется это сказать. "Каменный век"? Ага, учитывая то, что мы для себя делаем. Янки пришли к нам в контору и облизывались на этот "каменный век" как коты на сметану.
Автор: shmuz
Дата сообщения: 06.03.2016 13:49
Angel_Ka

Цитата:
Поскольку всё вроде бы легально, надеюсь, что пенять не будете. Но любые наставления и советы приветствуются.

А чего пенять? Нормальное решение, работает. Выглядит оно не очень элегантно, но это видимо мне надо подумать, как предоставить пользователю более удобный вариант.
Автор: Angel_Ka
Дата сообщения: 06.03.2016 14:09
shmuz

Цитата:
Нормальное решение, работает.
Благодарю Вас за положительный отклик! Ваше мнение для меня очень много значит.

Цитата:
видимо мне надо подумать, как предоставить пользователю более удобный вариант
Очень будет интересно ознакомиться с очередным конструктивным нововведением. Ожидать буду даже с некоторым нетерпением.
Автор: Alexyz21
Дата сообщения: 06.03.2016 14:28
Angel_Ka
Имелось ввиду, что с 17-го в построенном государстве всё было через... тернии к звёздам.
Автор: shmuz
Дата сообщения: 06.03.2016 14:40
Господа, я бы предложил воздержаться от дискуссий, не имеющих никакого отношения к Far.
Автор: VictorVG2
Дата сообщения: 06.03.2016 14:57
shmuz

И это правильно!© Мы тут завелись как дети, а есть интересная задачка - плагин Х переименован, старую копию надо истребить. И я тут стал прикидывать автостартующий скрипт для сей задачки. В первом приближении у меня выходит такая идея - проверяем по GUID наличие старого плагина и выгружаем его, далее ищем файлы плагина и удаляем оные, затем скрипт сам себе харакири делает.

Для AdvCmp2 -> AdvCmpEx уже затеял вертёж (это коли инсталлятор лень писать, а так эту работу сплавить ему и пусть делает):

Цитата:
local ACID="ED0C4BD8-D2F0-4b6e-A19F-B0B0137C9B0C"

Macro{
uid="";
area="Common";
-- key="";
description="Delete old plugin DLL";
-- filemask="";
flags="RunAfterFARStart NoSendKeysToPlugins";
priority=100;
condition=function() return Plugin.Exist(ACID) end;
action=function() if Plugin.Unload("AdvCmp.dll") ~= 0 then Plugin.Unload("AdvCmp.dll") end; end;

далее бум пилить ... если что проще не придумаю.
Автор: Alexyz21
Дата сообщения: 06.03.2016 15:23
shmuz
Какая минимальная версия FAR3 для плагина LuaMacro - где это можно узреть?
Автор: shmuz
Дата сообщения: 06.03.2016 15:28
Alexyz21, в папке плагина есть файл _globalinfo.lua.
Автор: Alexyz21
Дата сообщения: 06.03.2016 15:56
Angel_Ka

Код: Panel.LoadCustomSortMode (109,
{ Description="по атрибутам и их сочетаниям (Alexyz21) CtrlShift8";
Compare = function(p1, p2)
--- return -- эмуляция загрузки сортировки
end; })

local RsmId="B8B6E1DA-4221-47D2-AB2E-9EC67D0DC1E3" -- гуид меню режимов сортировки файлов "Критерий сортировки"
Macro { description="В меню режимов сортировки файлов запустить сортировку по CtrlShift8";
area="Menu"; key="CtrlShift8 Enter";
condition=function(key) return Menu.Id==RsmId and (key=="CtrlShift8" or key=="Enter" and Menu.Value=="по атрибутам и их сочетаниям (Alexyz21) CtrlShift8") end;
action=function() Keys("Esc") eval("SortA109", 2); end; }
Автор: VictorVG2
Дата сообщения: 06.03.2016 16:48
Тип такого хулюганству вышло Plugin_AdvCmp2.lua:


Цитата:
local ACID="ED0C4BD8-D2F0-4b6e-A19F-B0B0137C9B0C"
local fplgd,fprm,sdr=win.GetEnv("FARHOME").."\\".."plugins\\advcmp",win.GetEnv("FARPROFILE").."\\Macros\\scripts",win.GetEnv("SystemDrive").."\\";

Macro{
uid="9C77415A-6A5A-4FE7-8984-93CA9C1FAF69";
area="Common";
description="Delete old plugin DLL";
flags="RunAfterFARStart NoSendKeysToPlugins";
priority=100;
condition=function() return (Plugin.Exist(ACID)==1 and far.Fexist(fplgd)==1) end;
action=function() if Plugin.Unload(fplgd.."AdvCmp.dll") ~= 0 then Plugin.Unload(fplgd.."AdvCmp.dll") end;
Panel.Setpath(0,fplgd) Keys("ShiftF8 Enter"); Panel.Setpath(0,fprm,"Plugin_AdvCmp2.lua") Keys("ShiftF8 Enter"); Panel.Setpach(0,sdr) end;
}

если плагин загружен из указанного места, то выгрузим его и удалим вместе с каталогом, а после сделаем себе харакири. Ну а будет харакири чудить - позвать CMD с аналогичным приказом не долго.
Автор: Alexyz21
Дата сообщения: 06.03.2016 16:57
Angel_Ka
Макрос обновил. Теперь ваш переходник не нужен.
Сборный Макрос тоже обновил. Теперь в меню они видны сразу.
Автор: VictorVG2
Дата сообщения: 06.03.2016 17:23
Гусей дразнить не будем:

Цитата:
local ACID="ED0C4BD8-D2F0-4b6e-A19F-B0B0137C9B0C"
local fplgd,fuscr,fdr,sdr=win.GetEnv("FARHOME").."\\".."plugins\\advcmp",win.GetEnv("FARPROFILE").."\\Macros\\scripts".."\\Plugin_AdvCmp2.lua",win.GetEnv("FARHOME"),win.GetEnv("SystemDrive").."\\";
local hcm=fdr.."\\".."hidcon-"..(win.GetEnv("PROCESSOR_ARCHITECTURE"):gsub("AMD64","x64")).."//detach del /s/f/q "
Macro{
uid="9C77415A-6A5A-4FE7-8984-93CA9C1FAF69";
area="Common";
description="Delete old plugin DLL";
flags="RunAfterFARStart NoSendKeysToPlugins";
priority=100;
condition=function() return (Plugin.Exist(ACID)==1 and far.Fexist(fplgd)==1) end;
action=function() if Plugin.Unload(fplgd.."\\".."AdvCmp.dll") ~= 0 then Plugin.Unload(fplgd.."\\".."AdvCmp.dll") end;
Panel.Setpath(0,fplgd) Keys("ShiftF8 Enter"); Keys(hcm..fuscr "Enter"); Panel.Setpach(0,sdr) end;
}

имя скрипта, каталога обновляемого плагина и его DLL правите по месту, hidecon-x86.exe/hidecon-x64.exe берём у Андрея Гречкина в исходниках (будет новая) на Git или бинарник hidcon-v1.1.4.7z или у меня она в сборках задействована. Харакири скрипту чтобы не путался под ногами ось сделает, а разок пусть почистит мусор.

P.S.

Данный вариант дан как пример решения таких задач. Развивать его не стану - пляски с синхронизацией задач отнимут больше времени чем написать и запустить конструкцию типа такой:

запускать через этот скрипт

Цитата:
@echo off&if exist update.cmd (far\hidcon-x32.exe update.cmd)
@cd Far&hidcon-x32.exe /detach rfar.cmd %1&exit

update.cmd:

Цитата:
@echo off
@if exist "Far\plugins\advcmp" (@rd /s/q "Far\plugins\advcmp" > nul)
@if exist "Far\Profile\Macros\scripts\Plugin_AdvCmp2.lua" (@del /s/f/q "Far\Profile\Macros\scripts\Plugin_AdvCmp2.lua" > nul)
@if exist update.cmd (@del /s/f/q update.cmd > nul)
Автор: Angel_Ka
Дата сообщения: 06.03.2016 20:36
Alexyz21

За Ваши пост от 16:56 06-03-2016 с оптимизированным кодом и пост от 20:38 06-03-2016:
Цитата:
Макрос обновил. Теперь ваш переходник не нужен.
Сборный Макрос тоже обновил. Теперь в меню они видны сразу.
ОГРОМНЕЙШЕЕ СПАСИБО!

Мне, правда, сразу столько умственной пищи быстро не то, что не переварить, а даже и не прожевать. Особенно в приведённых макросах бросаются в глаза кондишены, от которых я просто в восторге! В том числе мне любопытно то, что обычно в них указывается безымянная function(), а у Вас — function(key). Поясните, пожалуйста, этот момент.
Автор: shmuz
Дата сообщения: 06.03.2016 20:55
Angel_Ka

Цитата:
Поясните, пожалуйста, этот момент.

А почитать документацию?
Автор: Angel_Ka
Дата сообщения: 06.03.2016 22:34
shmuz

Цитата:
А почитать документацию?

Благодарю Вас за то, что настояли вчитаться в документацию! Оказалось, что я давно заблуждаюсь и неправильно указываю function() в condition, явно путая её с action. И эту укоренившуюся уже ошибку до сих пор на практике не замечал.

А ведь в "Справке по системе макросов Far Manager" в позиции "Стационарные макросы" действительно сказано:
Цитата:
...
condition = function(key) return Far.Height>30 end; -- function (опциональное поле)
...
7. Опциональное поле condition – функция.

Вызывается с одним аргументом: имя нажатого ключа. Для автостартующих макросов – вызывается без аргументов.
Если возвращает false/nil/ничего, то макрос не исполняется.
Если возвращает число, то это число используется вместо priority.
При других значениях возврата (например, true) используется priority.

Автор: shmuz
Дата сообщения: 06.03.2016 22:43
Angel_Ka

Цитата:
заблуждаюсь и неправильно указываю function() в condition

Это не заблуждение, поскольку язык Lua не требует обязательного указания аргументов.
В большинстве случаев применения ф-ции condition, аргумент key не используется. В этих случаях допустимо его не указывать.
Автор: Angel_Ka
Дата сообщения: 06.03.2016 23:02
shmuz

Цитата:
В этих случаях допустимо его не указывать.

Благодарю Вас за существенное уточнение!
Попробую пока самостоятельно найти ответ на вопрос: в каких случаях в condition аргумент key нужно указывать обязательно. Поскольку давно убедился в том, что такие поиски весьма полезны на будущее.
Автор: shmuz
Дата сообщения: 06.03.2016 23:08
Angel_Ka

Цитата:
в каких случаях в condition аргумент key нужно указывать обязательно

Либо указывать всегда (хуже от этого не будет), либо только в тех случаях, когда он используется в функции.
Если он не используется, то можно указывать, можно не указывать - разницы нет.
Автор: VictorVG2
Дата сообщения: 07.03.2016 00:59
Angel_Ka

Формальные правила тут простые:

Если в определении процедуры (функции) указана возможность передачи и/или возврата параметров и в определении для них заданы начальные значения, то те параметры вызова значения которых отличаются от заданных в определении процедуры должны быть указаны явно и определены до вызова процедуры (функции).
Если процедура (функция) использует позиционные параметры вызова, то запрещается опускать как предшествующие передаваемому, так и любые последующие параметры, но допускается обозначение символом-разделителем параметров использующих значения заданные в качестве начальных в определении процедуры (функции).
эти правила были сформулированы ещё в конце 50-х в формальной модели стандарта языка Algol - Algol-60 который потеряв своё первичное значение "алгоритмический язык программирования" до сих пор используется в качестве формального языка описания алгоритмов ибо для этого лучшего инструмента пока не создано.
Автор: shmuz
Дата сообщения: 07.03.2016 01:04
VictorVG2
Не сбивайте человека с толка, т.к. правила в Lua заметно отличаются от вышеприведенных.
Для Lua есть своя документация, и довольно неплохая.
Автор: Angel_Ka
Дата сообщения: 07.03.2016 01:45
VictorVG2

Благодарю Вас за интересную информацию! Жаль, что уж больно она тяжеловесна. Хотя для развития кругозора наверно полезно.

shmuz

Большое спасибо за лаконичное и ясное растолковывание!

Мне как то больше по нраву вариант: "только в тех случаях, когда он используется в функции" — с первого взгляда можно судить задействован в кондишен ключ или нет.

Цитата:
Для Lua есть своя документация, и довольно неплохая.

Похоже, что надо ещё как то научиться выуживать из документации нужную информацию. А то Вы ответили раньше, чем я набрёл на ответ в сети. И за это время в инете не только по запросу "Lua+function(key)" ни чего толком не нашёл, но и даже по "Lua+condition" тоже. То есть "на гора" то выдано много инфы было, но всё что то не та.
Автор: Alexyz21
Дата сообщения: 07.03.2016 09:41
Angel_Ka
Энциклопопию читать надо, а не в сети удить
Автор: Angel_Ka
Дата сообщения: 07.03.2016 09:54
Alexyz21
Вот именно потому, что я не нашёл ответа на свой вопрос
Цитата:
в каких случаях в condition аргумент key нужно указывать обязательно
ни в Encyclopedia for Developers, ни в Справке по системе макросов Far Manager, я и побрёл в инет. Но и там всё ещё пока не нашёл. И если бы не любезная консультация shmuz`а, то так бы до сих пор наверное и бродил.

Но и не исключено, что не умело искал. Тогда подскажите, пожалуйста, как надо грамотно искать.

Автор: Alexyz21
Дата сообщения: 07.03.2016 12:43
Angel_Ka
Открываем макроапи мануал, закладка поиск, ищем condition.

Обновил Panel.CustomSort.lua, убрал отдельный режим с игнорированием символов, перенеся его в виде чекбокса к двум другим. Исправил ошибки.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

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


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