Перегрузка/подгрузка скриптов/макросов «на лету»

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

Запуск макроса по событию смены директории

Post by gotar »

zg wrote: Thu 23 Feb, 2023 23:55
gotar wrote: Thu 23 Feb, 2023 19:17 Правильно ли я понимаю, что директория «.» совсем не текущая директория с точки зрения обработчика события?
если вы про «cd .», то с точки зрения фара — это смена директории (содержимое перечитывается, выделение снимается, курсор перемещается в начало, ctrl-m не работает, что-то ещё). если вы про что-то ещё — выражайтесь яснее, гадать я не люблю.
Я все думаю как сделать
gotar wrote: Wed 22 Feb, 2023 18:03 А можно попросить пример макроса, использующего это событие. Например, загрузить макросы из текущей директории.
Я так понимаю, что бы вызвать far.MacroLoadAll(".") для текущей директории мне нужно перед этим вызвать win.SetCurrentDir ( far.GetCurrentDirectory() )? Я не очень понимаю, можно ли напрямую вызывать far.MacroLoadAll из обработчика событий смены директории?
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Запуск макроса по событию смены директории

Post by buniak_a_h »

gotar wrote: Fri 24 Feb, 2023 09:36 Я все думаю как сделать
  1. А что мешает написать

    Code: Select all

    if not APanel.Plugin then far.MacroLoadAll(APanel.Path) end
  2. Вы помните, что far.MacroLoadAll очищает загруженные ранее макросы (кроме клавиатурных)? В т.ч. и макрос (ивент), повешенный на смену папки. Т.е. обратно перезагрузить макросы (стандартные) не получится.
    [/quote]
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Запуск макроса по событию смены директории

Post by Shmuel »

buniak_a_h wrote: Fri 24 Feb, 2023 15:49 Т.е. обратно перезагрузить макросы (стандартные) не получится.
Первый параметр far.MacroLoadAll это перечень путей, разделённых точкой с запятой, можно использовать и переменные окружения.
Поэтому скрипт вполне может загрузить и стандартные, и дополнительные макросы вместе.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Запуск макроса по событию смены директории

Post by buniak_a_h »

Shmuel wrote: Fri 24 Feb, 2023 16:06 Поэтому скрипт вполне может загрузить и стандартные, и дополнительные макросы вместе.
Я понимаю. Но! (а) не в виде APanel.Path (или ".") и (б) при этом сбросятся все внутренние переменные уже выполняющихся скриптов.
Кстати, Shmuel! Просто не хочется экспериментировать, если Вы тут и есть возможность спросить. А макросы загружаются из указанной папки и вложенных?
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Запуск макроса по событию смены директории

Post by Shmuel »

buniak_a_h wrote: Fri 24 Feb, 2023 17:06 макросы загружаются из указанной папки и вложенных?
Да.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Запуск макроса по событию смены директории

Post by gotar »

buniak_a_h wrote: Fri 24 Feb, 2023 15:49 А что мешает написать

if not APanel.Plugin then far.MacroLoadAll(APanel.Path) end
У меня были мысли писать также far.MacroLoadAll("../Macros)
buniak_a_h wrote: Fri 24 Feb, 2023 15:49 Вы помните, что far.MacroLoadAll очищает загруженные ранее макросы (кроме клавиатурных)? В т.ч. и макрос (ивент), повешенный на смену папки. Т.е. обратно перезагрузить макросы (стандартные) не получится.
Проверте, мне кажется что far.MacroLoadAll всегда грузит стандартные макросы. И можно в параметре указать несколько путей через точку с запятой.

Можно ли безопасно напрямую вызывать far.MacroLoadAll из обработчика события смены каталога?
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Запуск макроса по событию смены директории

Post by buniak_a_h »

gotar wrote: Sat 25 Feb, 2023 15:29 У меня были мысли писать также far.MacroLoadAll("../Macros)
  1. Наверно, корректнее было бы написать far.MacroLoadAll([[%FARPROFILE%\Macros]]) (если имеете ввиду стандартные).
  2. Тут ещё проблема (о которой я писал): нужно ли загружать макросы, если сменилась папка пассивной панели? А если просто произошёл переход на другую панель?
gotar wrote: Sat 25 Feb, 2023 15:29 Проверте, мне кажется что far.MacroLoadAll всегда грузит стандартные макросы.
Проверялось неоднократно. Не грузит. Грузит клавиатурные макросы из %FARPROFILE%\Macros\internal, а из %FARPROFILE%\Macros\scripts не грузит. Надо его вставлять перед тем, откуда Вы хотите дозагрузить макросы через ;.
gotar wrote: Sat 25 Feb, 2023 15:29 Можно ли безопасно напрямую вызывать far.MacroLoadAll из обработчика события смены каталога?
В этой теме опубликованы два скрипта, вешающие обработчик на событие. Замените в action (в одном случае это - строка с win.OutputDebugString?, в другом - строка с far.Message) на нужную Вам загрузку и попробуйте. Из моего опыта: судя по тому, что far.Message работает, будет работать и far.MacroLoadAll. Просто у меня есть чей-то макрос, перезагружающий макросы; так вот в нём после far.MacroLoadAll сделана задержка (win.Sleep(200)). Без этого не работает!
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Запуск макроса по событию смены директории

Post by Shmuel »

buniak_a_h wrote: Sat 25 Feb, 2023 16:03 у меня есть чей-то макрос, перезагружающий макросы; так вот в нём после far.MacroLoadAll сделана задержка (win.Sleep(200)). Без этого не работает!
Речь, видимо, о моём макросе.
win.Sleep вставлен исключительно с целью подержать подольше сообщение о перезагрузке на экране, а на саму перезагрузку никак не влияет.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Запуск макроса по событию смены директории

Post by buniak_a_h »

Shmuel wrote: Sat 25 Feb, 2023 16:21 на саму перезагрузку никак не влияет
Ну вот влияет, если сразу пытаться что-то делать со скриптами. Поведение такое, как будто загрузка идёт в другой ветке, а эта получает управление сразу после начала загрузки. Короче, мне эта задержка (как и вообще визуализация) была не нужна, я убрал - и всё сломалось
Last edited by buniak_a_h on Sat 25 Feb, 2023 16:45, edited 1 time in total.
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Запуск макроса по событию смены директории

Post by Shmuel »

buniak_a_h wrote: Sat 25 Feb, 2023 16:45 Ну вот влияет, если сразу пытаться что-то делать со скриптами.
Подтвердите воспроизводимым примером, иначе не убедительно.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Запуск макроса по событию смены директории

Post by buniak_a_h »

Shmuel wrote: Sat 25 Feb, 2023 16:53 Подтвердите воспроизводимым примером, иначе не убедительно.
  1. Примера уже нету
  2. Даже когда был - проявлялся неустойчиво. Так всегда бывает, если результат зависит от временных задержек
Так что убеждать не буду. Считайте, что я просто верю.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Запуск макроса по событию смены директории

Post by gotar »

buniak_a_h wrote: Sat 25 Feb, 2023 16:03 far.MacroLoadAll([[%FARPROFILE%\Macros]])
на такое текущий каталог не влияет. хотелось бы иметь возможность задавать пути относительно текущего каталога, например ../Macros. Иначе нет смысла реагировать на смену текущего каталога. Достаточно ли для этого вызвать win.SetCurrentDir ( far.GetCurrentDirectory() )? Или обязательно писать far.MacroLoadAll("APanel.Path\\..\\Macros"), У меня тут вдруг возникло сомнение. Когда вызывается обработчик события: когда меняется текущий каталог, как его понимает операционная система или когда меняется каталог на активной панели или, может быть, что-то третье?
Last edited by gotar on Sat 25 Feb, 2023 19:40, edited 3 times in total.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Запуск макроса по событию смены директории

Post by buniak_a_h »

gotar wrote: Sat 25 Feb, 2023 19:20 на такое текущий каталог не влияет.
Естественно. Это был пример.
Полный текст:
far.MacroLoadAll([[%FARPROFILE%\Macros\scripts;]]..APanel.Path)
При этом макросы, загруженные при предыдущих сменах папок, будут выгружены. Если нужно иметь все, надо запоминать всю историю "хождения по мукампапкам" (в массиве в _G или в файле!!! Т.к. переменная будет сброшена), добавляя только уникальные, и загружать из table.concat(«Имя_массива», ';'). Пример такого можете найти в теме Загрузка макросов из отмеченных папок
Last edited by buniak_a_h on Sat 25 Feb, 2023 19:38, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Запуск макроса по событию смены директории

Post by zg »

SUSim wrote: Sat 25 Feb, 2023 10:05А не подскажите событие панелей которое может привести к смене директории (чтобы избыточность была поменьше)?
какие события имеются ввиду?
gotar wrote: Sat 25 Feb, 2023 15:29Можно ли безопасно напрямую вызывать far.MacroLoadAll из обработчика события смены каталога?
чем вызван этот вопрос?
buniak_a_h wrote: Sat 25 Feb, 2023 17:36Считайте, что я просто верю.
с верой — церковь. здесь такого не надо.
Last edited by zg on Sat 25 Feb, 2023 20:28, edited 1 time in total.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Запуск макроса по событию смены директории

Post by gotar »

zg wrote: Sat 25 Feb, 2023 20:25 чем вызван этот вопрос?
во время выполнения макроса я макросы перегружаю. никаких неожиданных последствий это не вызовет?
Post Reply

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