_macroinit.lua vs RunAfterFARStart

Здесь обсуждается всё, что касается макросов.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

_macroinit.lua vs RunAfterFARStart

Post by Smitis »

Latest post of the previous page:

Просто в настоящий момент наблюдается какая-то бессистемность:
- Запуск ФАРА - это МАКРОСЫ с флагом RunAfterFARStart.
- Перезагрузка макросов - это СКРИПТ _macroinit.lua.
- Выход из ФАРа - это СОБЫТИЕ ExitFAR.
Я понимаю, что так сложилось исторически, но чем плохо, если бы было однообразие?
Разум когда-нибудь победит.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

_macroinit.lua vs RunAfterFARStart

Post 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.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

_macroinit.lua vs RunAfterFARStart

Post by John Doe »

Shmuel wrote: Не создавайте больше одного макроса с флагом RunAfterFARStart и поместите в него всё, что хотели поместить в этот воображаемый файл.
Но он выполнится после всех скриптов, а не до, как хотелось бы.
Shmuel wrote: %farprofile%\luafar_init.lua
А вот это интереснее
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel »

John Doe wrote: Но он выполнится после всех скриптов, а не до, как хотелось бы.
Для этого есть _macroinit.lua. Что до "ограниченных" функций, то их совсем не обязательно там использовать.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

_macroinit.lua vs RunAfterFARStart

Post by John Doe »

Есть мысль.
_G у нас при перезагрузке не меняется, значит можно установить флаг, и просто часть _macroinit.lua отвести под однократное выполнение.


Можно и отдельный файл оттуда грузить.
P.S.
Или (ещё лучше) реализовать это модулем (невыгружаемым, nounload)
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel »

John Doe wrote: можно установить флаг, и просто часть _macroinit.lua отвести под однократное выполнение.
Я так делаю в плагинах.
В принципе, то, что предложил Smitis, реализуется элементарно, но опять таки, это будет скрипт, а не макрос.
Вообще, у меня впечатление, что мы обсуждаем нечто не особо актуальное. Поэтому на сегодня завязываю.
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

_macroinit.lua vs RunAfterFARStart

Post by gotar »

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

Code: Select all

counter=counter or 0
counter++
if counter >1 return
( это псевдокод, за корректность синтаксиса не отвечаю)
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

_macroinit.lua vs RunAfterFARStart

Post by John Doe »

gotar wrote: достаточно вначале скрипта написать что-то вроде
Типа того, только counter должен принадлежать _G.
Лучше посмотрите первую часть моего сообщения, а не ту что вы процитировали.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

_macroinit.lua vs RunAfterFARStart

Post by John Doe »

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

И глобальная переменная (навроде _first_load или runonce_done) мне видится более гибким решением, чем какой-то один выделенный файл _runonce.lua.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel »

John Doe wrote:
Shmuel wrote: Я так делаю в плагинах.
Для плагинов есть стандартный механизм (IsLuaStateRecreated). Для макросов тоже желательно что-то подобное.
RecreateLuaState - это драконовский механизм, практически равноценный полной перезагрузке плагина. В моём сообщении имелся в виду другой механизм - far.ReloadDefaultScript, который более удобен для отладки LuaFAR-плагинов. И вот в нём необходимо различать, первый ли это запуск или повторный.
John Doe wrote:Разумеется каждый может реализовать это собственными силами, но, учитывая что мы тут скриптами делимся, хотелось бы иметь общепринятый способ
Над этим можно подумать.
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

_macroinit.lua vs RunAfterFARStart

Post by gotar »

Shmuel wrote:Над этим можно подумать.
А есть ли стандартный способ узнать far вызван как редактор, shell или просмоторщик?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel »

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

А "нестандартно" узнать легко при помощи последовательности вызовов: panel.GetPanelInfo, editor.GetInfo, viewer.GetInfo.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

_macroinit.lua vs RunAfterFARStart

Post 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
Last edited by John Doe on Tue 30 Aug, 2016 10:41, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

_macroinit.lua vs RunAfterFARStart

Post 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

Но тут это офтопик
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

_macroinit.lua vs RunAfterFARStart

Post by gotar »

По теме, вызов функции через макрос имеет большой недостаток: не дает сборщику мусора утилизировать upvalus функции, т.к ссылка на функцию вряд ли удаляется из таблицы макросов после ее вызова.
User avatar
SUSim
Posts: 1633
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 25 times

_macroinit.lua vs RunAfterFARStart

Post by SUSim »

ИМХО RunAfterFARStart надо оставить!

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

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

Return to “Обсуждение макросов”