_macroinit.lua vs RunAfterFARStart

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

_macroinit.lua vs RunAfterFARStart

Post by Smitis » Mon 22 Aug, 2016 20:35

Latest post of the previous page:

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

Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Mon 22 Aug, 2016 20:58

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: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

_macroinit.lua vs RunAfterFARStart

Post by John Doe » Mon 22 Aug, 2016 21:19

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

Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Mon 22 Aug, 2016 21:33

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

User avatar
John Doe
Бюрократ
Posts: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

_macroinit.lua vs RunAfterFARStart

Post by John Doe » Mon 22 Aug, 2016 21:36

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


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

Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Mon 22 Aug, 2016 21:47

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

gotar
Posts: 296
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

_macroinit.lua vs RunAfterFARStart

Post by gotar » Tue 23 Aug, 2016 07:41

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

Code: Select all

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

User avatar
John Doe
Бюрократ
Posts: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

_macroinit.lua vs RunAfterFARStart

Post by John Doe » Tue 23 Aug, 2016 08:54

gotar wrote: достаточно вначале скрипта написать что-то вроде
Типа того, только counter должен принадлежать _G.
Лучше посмотрите первую часть моего сообщения, а не ту что вы процитировали.

User avatar
John Doe
Бюрократ
Posts: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

_macroinit.lua vs RunAfterFARStart

Post by John Doe » Tue 23 Aug, 2016 10:09

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

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

Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Tue 23 Aug, 2016 12:42

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

gotar
Posts: 296
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

_macroinit.lua vs RunAfterFARStart

Post by gotar » Tue 23 Aug, 2016 14:05

Shmuel wrote:Над этим можно подумать.
А есть ли стандартный способ узнать far вызван как редактор, shell или просмоторщик?

Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Tue 23 Aug, 2016 14:45

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

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

User avatar
John Doe
Бюрократ
Posts: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

_macroinit.lua vs RunAfterFARStart

Post by John Doe » Tue 23 Aug, 2016 15:24

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: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

_macroinit.lua vs RunAfterFARStart

Post by John Doe » Tue 23 Aug, 2016 15:24

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: 296
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

_macroinit.lua vs RunAfterFARStart

Post by gotar » Tue 23 Aug, 2016 16:32

По теме, вызов функции через макрос имеет большой недостаток: не дает сборщику мусора утилизировать upvalus функции, т.к ссылка на функцию вряд ли удаляется из таблицы макросов после ее вызова.

User avatar
SUSim
Posts: 1479
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 4 times
Been thanked: 4 times

_macroinit.lua vs RunAfterFARStart

Post by SUSim » Thu 25 Aug, 2016 11:10

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

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

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

gotar
Posts: 296
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

_macroinit.lua vs RunAfterFARStart

Post by gotar » Thu 25 Aug, 2016 14:11

SUSim wrote:требовать от пользователя править какие-то файлы не хорошо.
. Скопировать файл с макросом и скопировать файл в котором стоит вызов функции - одинаковая трудоемкость. Из предыдущего обсуждения у меня сложилось впечатление, что автостартующий макрос - это такой вычурный способ вызов функции из файла в каталоге macros/scripts. Единственное преимущество автостартующего скрипта перед вызовом функции - это возможность не вызывать функцию, если фар вызван как редактор текстов. И то если информацию о режиме работы фара вытащат в LuaFar API, это преимущество пропадет. RunAfterFARStart надо оставить только из соображений совместимости. Реальной пользы от него я так и не увидел.

Post Reply

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