Page 2 of 3

_macroinit.lua vs RunAfterFARStart

Posted: Mon 22 Aug, 2016 20:35
by Smitis

Latest post of the previous page:

Просто в настоящий момент наблюдается какая-то бессистемность:
- Запуск ФАРА - это МАКРОСЫ с флагом RunAfterFARStart.
- Перезагрузка макросов - это СКРИПТ _macroinit.lua.
- Выход из ФАРа - это СОБЫТИЕ ExitFAR.
Я понимаю, что так сложилось исторически, но чем плохо, если бы было однообразие?

_macroinit.lua vs RunAfterFARStart

Posted: Mon 22 Aug, 2016 20:58
by Shmuel
Smitis wrote: - Запуск ФАРА - это МАКРОСЫ с флагом RunAfterFARStart.
Запуск Фара:
1. %farprofile%\luafar_init.lua
2. Загрузка Lua-файлов плагина LuaMacro.
3. _macroinit.lua
4. Прочие макрофайлы из Macros\scripts
5. Макросы с флагом RunAfterFARStart
Перезагрузка макросов - событие ExitFAR + пункты 3 и 4 выше.
Выход из Фара - событие ExitFAR.

_macroinit.lua vs RunAfterFARStart

Posted: Mon 22 Aug, 2016 21:19
by John Doe
Shmuel wrote: Не создавайте больше одного макроса с флагом RunAfterFARStart и поместите в него всё, что хотели поместить в этот воображаемый файл.
Но он выполнится после всех скриптов, а не до, как хотелось бы.
Shmuel wrote: %farprofile%\luafar_init.lua
А вот это интереснее

_macroinit.lua vs RunAfterFARStart

Posted: Mon 22 Aug, 2016 21:33
by Shmuel
John Doe wrote: Но он выполнится после всех скриптов, а не до, как хотелось бы.
Для этого есть _macroinit.lua. Что до "ограниченных" функций, то их совсем не обязательно там использовать.

_macroinit.lua vs RunAfterFARStart

Posted: Mon 22 Aug, 2016 21:36
by John Doe
Есть мысль.
_G у нас при перезагрузке не меняется, значит можно установить флаг, и просто часть _macroinit.lua отвести под однократное выполнение.


Можно и отдельный файл оттуда грузить.
P.S.
Или (ещё лучше) реализовать это модулем (невыгружаемым, nounload)

_macroinit.lua vs RunAfterFARStart

Posted: Mon 22 Aug, 2016 21:47
by Shmuel
John Doe wrote: можно установить флаг, и просто часть _macroinit.lua отвести под однократное выполнение.
Я так делаю в плагинах.
В принципе, то, что предложил Smitis, реализуется элементарно, но опять таки, это будет скрипт, а не макрос.
Вообще, у меня впечатление, что мы обсуждаем нечто не особо актуальное. Поэтому на сегодня завязываю.

_macroinit.lua vs RunAfterFARStart

Posted: Tue 23 Aug, 2016 07:41
by gotar
John Doe wrote:Или (ещё лучше) реализовать это модулем (невыгружаемым, nounload)
По моему Вы опять все переусложнили. Для того чтобы узнать сколько раз выполняется скрипт достаточно вначале скрипта написать что-то вроде

Code: Select all

counter=counter or 0
counter++
if counter >1 return
( это псевдокод, за корректность синтаксиса не отвечаю)

_macroinit.lua vs RunAfterFARStart

Posted: Tue 23 Aug, 2016 08:54
by John Doe
gotar wrote: достаточно вначале скрипта написать что-то вроде
Типа того, только counter должен принадлежать _G.
Лучше посмотрите первую часть моего сообщения, а не ту что вы процитировали.

_macroinit.lua vs RunAfterFARStart

Posted: Tue 23 Aug, 2016 10:09
by John Doe
Shmuel wrote: Вообще, у меня впечатление, что мы обсуждаем нечто не особо актуальное.
В общем да, при наличии RunAfterFARStart остальное плюшки.
Shmuel wrote: Я так делаю в плагинах.
Для плагинов есть стандартный механизм (IsLuaStateRecreated). Для макросов тоже желательно что-то подобное.
Разумеется каждый может реализовать это собственными силами, но, учитывая что мы тут скриптами делимся, хотелось бы иметь общепринятый способ (иначе может наплодиться куча конфликтующих глобальных переменных).

И глобальная переменная (навроде _first_load или runonce_done) мне видится более гибким решением, чем какой-то один выделенный файл _runonce.lua.

_macroinit.lua vs RunAfterFARStart

Posted: Tue 23 Aug, 2016 12:42
by Shmuel
John Doe wrote:
Shmuel wrote: Я так делаю в плагинах.
Для плагинов есть стандартный механизм (IsLuaStateRecreated). Для макросов тоже желательно что-то подобное.
RecreateLuaState - это драконовский механизм, практически равноценный полной перезагрузке плагина. В моём сообщении имелся в виду другой механизм - far.ReloadDefaultScript, который более удобен для отладки LuaFAR-плагинов. И вот в нём необходимо различать, первый ли это запуск или повторный.
John Doe wrote:Разумеется каждый может реализовать это собственными силами, но, учитывая что мы тут скриптами делимся, хотелось бы иметь общепринятый способ
Над этим можно подумать.

_macroinit.lua vs RunAfterFARStart

Posted: Tue 23 Aug, 2016 14:05
by gotar
Shmuel wrote:Над этим можно подумать.
А есть ли стандартный способ узнать far вызван как редактор, shell или просмоторщик?

_macroinit.lua vs RunAfterFARStart

Posted: Tue 23 Aug, 2016 14:45
by Shmuel
gotar wrote: А есть ли стандартный способ узнать far вызван как редактор, shell или просмоторщик?
Насчёт стандартного мне неизвестно (может кто подскажет). LuaMacro внутри знает, благодаря специальному запросу Фара по своему выделенному интерфейсу (кстати, легко можно сделать функцию или свойство, доступное из макросов/плагинов - не знаю, надо ли).

А "нестандартно" узнать легко при помощи последовательности вызовов: panel.GetPanelInfo, editor.GetInfo, viewer.GetInfo.

_macroinit.lua vs RunAfterFARStart

Posted: Tue 23 Aug, 2016 15:24
by John Doe
Shmuel wrote: В моём сообщении имелся в виду другой механизм - far.ReloadDefaultScript, который более удобен для отладки LuaFAR-плагинов. И вот в нём необходимо различать, первый ли это запуск или повторный.

Code: Select all

When the starting script is run it receives one boolean argument:

true – on its first run and after Lua state was recreated 
false – on subsequent runs caused by setting far.ReloadDefaultScript = true. 
Да, в скрипты тоже можно было бы передавать, вторым аргументом.

P.S.
http://bugs.farmanager.com/view.php?id=3286

_macroinit.lua vs RunAfterFARStart

Posted: Tue 23 Aug, 2016 15:24
by John Doe
Shmuel wrote: Насчёт стандартного мне неизвестно (может кто подскажет)
http://api.farmanager.com/ru/service_fu ... ANELSEXIST
или
http://api.farmanager.com/ru/macro/macr ... iewer.html
http://api.farmanager.com/ru/macro/macr ... ditor.html

Но тут это офтопик

_macroinit.lua vs RunAfterFARStart

Posted: Tue 23 Aug, 2016 16:32
by gotar
По теме, вызов функции через макрос имеет большой недостаток: не дает сборщику мусора утилизировать upvalus функции, т.к ссылка на функцию вряд ли удаляется из таблицы макросов после ее вызова.

_macroinit.lua vs RunAfterFARStart

Posted: Thu 25 Aug, 2016 11:10
by SUSim
ИМХО RunAfterFARStart надо оставить!

вы свалились в чисто программисткую логику!
для слегка продвинутого пользователя понятно RunAfterFARStart , и для распространения макросов - требовать от пользователя править какие-то файлы не хорошо (и так тяжело для некоторых найти папку и скопировать туда файл).

я до сих пор пользуюсь временными - быстро записываемые макросами с выставлением флага Автостарт.