_macroinit.lua vs RunAfterFARStart

Здесь обсуждается всё, что касается макросов.
gotar
Posts: 293
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

_macroinit.lua vs RunAfterFARStart

Post by gotar » Mon 22 Aug, 2016 12:20

Во многих примерах, публикуемых на этом форуме я часто вижу, что вместо того чтобы вызвать какую нибудь функцию из Lua файла, который находится в каталоге scripts, оформляется специальный макрос с флажком RunAfterFARStart. Зачем? В чем преимущество вызова функции из макроса? Пример: viewtopic.php?p=119955#p119955, в EnablePrivileges.lua вместо вызова EnablePrivileges{"SeBackupPrivilege","SeRestorePrivilege"} делается специальный макрос в котором ничего кроме вызова этой функции.

Shmuel
Posts: 5158
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 144 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Mon 22 Aug, 2016 12:36

_macroinit.lua исполняется при каждой загрузке и перезагрузке макросов.
Макросы с флагом RunAfterFARStart исполняются только при старте Far.
(Скрипт, на который вы ссылаетесь, я не смотрел, может быть автор разъяснит).

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

_macroinit.lua vs RunAfterFARStart

Post by gotar » Mon 22 Aug, 2016 12:50

Вот Ваш пример viewtopic.php?p=121795#p121795. Вызов функции win.SetEnv при lm:load может чему-то помешать?

Shmuel
Posts: 5158
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 144 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Mon 22 Aug, 2016 13:03

gotar wrote: Вызов функции win.SetEnv при lm:load может чему-то помешать?
Этот вызов, допустим, ничему бы не помешал, но зачем делать лишние телодвижения, если достаточно установить переменную окружения один раз при старте Far.

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

_macroinit.lua vs RunAfterFARStart

Post by gotar » Mon 22 Aug, 2016 13:32

Вызов функции написать проще, чем макрос. Я сейчас посмотрел несколько Ваших примеров и негде не увидел вызов функции вне макроса. Всегда для вызова функции вне макроса Вы оформляете макрос с RunAfterFARStart. Почему?

Shmuel
Posts: 5158
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 144 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Mon 22 Aug, 2016 13:36

gotar wrote: Всегда для вызова функции вне макроса Вы оформляете макрос с RunAfterFARStart. Почему?
Ну вроде я всё уже объяснил выше, не буду повторяться.
Никто не запрещает вызывать любые функции из любого места - вы не обязаны делать как кто-то другой.

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

_macroinit.lua vs RunAfterFARStart

Post by John Doe » Mon 22 Aug, 2016 14:41

Shmuel wrote:Макросы с флагом RunAfterFARStart исполняются только при старте Far.
(Скрипт, на который вы ссылаетесь, я не смотрел, может быть автор разъяснит).
Данный макрос действительно достаточно выполнить однократно.
С другой стороны, накладные расходы тут не велики, и без RunAfterFARStart можно обойтись.

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

Ещё одна потенциально возможная причина использования макроса вместо простого вызова - это необходимость преодоления
Ограничений в использовании некоторых функций (см. мануал)

Shmuel
Posts: 5158
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 144 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Mon 22 Aug, 2016 14:54

Сейчас проверил: несмотря на публикацию в форуме макросов с флагом RunAfterFARStart, на моей системе ни одного такого нет. Как видно пока не понадобилось. (А _macroinit.lua у меня пустой).

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

_macroinit.lua vs RunAfterFARStart

Post by John Doe » Mon 22 Aug, 2016 14:58

Shmuel wrote: _macroinit.lua исполняется при каждой загрузке и перезагрузке макросов.
Отмечу, что любой файл в scripts исполняется при каждой перезагрузке. Особенность _macroinit.lua лишь в том, что он исполняется до всех остальных.

Изначальный вопрос, в заголовке темы, некорректен, не надо противопоставлять разнородные вещи.
Т.е. альтернатива на самом деле состоит в том, оборачивать ли какой-то код макросом, или выполнять прямо в теле скрипта (который может быть любым lua-файлом, а не только _macroinit.lua)

P.S.
Ответ разумеется адресован не автору макросистемы фара, а gotar, и другим неопытным пользователям

Shmuel
Posts: 5158
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 144 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Mon 22 Aug, 2016 15:11

John Doe wrote: Ответ разумеется адресован не автору макросистемы фара
Следует уточнить, что автором макросистемы Far я не являюсь, я только прикручивал к ней Lua. :)

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

_macroinit.lua vs RunAfterFARStart

Post by Smitis » Mon 22 Aug, 2016 15:47

Кстати, логично было бы сделать что-то типа _runafterfarstart.lua подобно _macroinit.lua (а RunAfterFARStart объявить пережитком прошлого :) )
Разум когда-нибудь победит.

User avatar
HaRT
Moderator
Posts: 8048
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

_macroinit.lua vs RunAfterFARStart

Post by HaRT » Mon 22 Aug, 2016 16:04

Smitis wrote: что-то типа _runafterfarstart.lua
В Винде такие вещи традиционно называются RunOnce.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

_macroinit.lua vs RunAfterFARStart

Post by zg » Mon 22 Aug, 2016 16:40

Smitis wrote:_runafterfarstart.lua
гибкость уменьшается, не?

2useven10
Posts: 2983
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

_macroinit.lua vs RunAfterFARStart

Post by 2useven10 » Mon 22 Aug, 2016 18:10

zg wrote: гибкость уменьшается, не?
Возможно, зато получается один файл с гарантированной последовательностью исполнения кода.
В случае с несколькими макросами для RunAfretFARStart порядок их исполнения
не гарантирован, или как минимум, не очевиден.

Shmuel
Posts: 5158
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 144 times

_macroinit.lua vs RunAfterFARStart

Post by Shmuel » Mon 22 Aug, 2016 19:36

2useven10 wrote: зато получается один файл с гарантированной последовательностью исполнения кода.
Не создавайте больше одного макроса с флагом RunAfterFARStart и поместите в него всё, что хотели поместить в этот воображаемый файл.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

_macroinit.lua vs RunAfterFARStart

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

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

Post Reply

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