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

Здесь обсуждается всё, что касается макросов.
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 »

Latest post of the previous page:

Возможно, есть чисто технические сложности (трудоёмкости), делающие передачу сложных данных (таблиц, строк) неудобной. Поэтому я и сильно ограничил желание: хотя бы только признак, какая панель изменила папку. 1 - активная; 2 - пассивная; 1+2=3 - обе. И проверять можно битовой маской, и передавать просто.
Я к тому, что "история" (откуда пришли) нужна крайне редко. А вот куда пришли - естественное желание. Подстроиться под новый директорий, например. Я несколько таких скриптов разным людям писал (папка с медиафайлами - кастомные столбцы и сортировка, например; автоматически показывать UserMenu, если в новой папке есть файл usermenu.ini и эта папка открывается на активной панели)
Last edited by buniak_a_h on Thu 23 Feb, 2023 02:49, edited 1 time in total.
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

buniak_a_h wrote: Thu 23 Feb, 2023 02:47 какая панель изменила папку. 1 - активная; 2 - пассивная; 1+2=3 - обе
Тогда уж как в хелпе:
Whatpanel: 1=active panel; 0=passive panel; 2=both;

И событий всё-таки 2 надо:
SE_FOLDERCHANGE - папка будет изменена;
SE_FOLDERCHANGED - папка уже изменена.
Тогда бы мой макрос Shell_RememberSelected.lua стал бы лучше.
Last edited by SUSim on Thu 23 Feb, 2023 10:22, edited 2 times in total.
SimSU ··· ·· -- ··· ··-
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 »

SUSim wrote: Thu 23 Feb, 2023 10:21 Тогда уж как в хелпе:
Whatpanel: 1=active panel; 0=passive panel; 2=both;
Я исходил из удобства битового анализа. 0-й бит - пассивная; 1-й - активная (или наоборот - пофиг; сейчас там и так ужас ужасный: в panel одно правило, а в Panel - всё наоборот). В хелпе, увы, нет варианта «обе».
Впрочем, это - дело вкуса. Просто надо, пока experimental, принять правильные решения.
SUSim wrote: Thu 23 Feb, 2023 10:21 И событий всё-таки 2 надо:
И для первого события возможность запрета (так уже сделано для какого-то другого, но похожего события)?
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

buniak_a_h wrote: Thu 23 Feb, 2023 02:03 По Tab событие генерится (хотя с чего бы?)
По Swap panels (CtrlU) не генерится (Вроде как тоже самое).
у меня своё представление, что такое событие по смене директории, у вас — своё. у вас есть возможность аргументированно переубедить меня.
buniak_a_h wrote: Thu 23 Feb, 2023 02:41это инфа есть в той процедуре, что генерит событие.
можно же просто коммит посмотреть, нет её там. и это не очень важно, ниже объяснение.
buniak_a_h wrote: Thu 23 Feb, 2023 02:47Я к тому, что "история" (откуда пришли) нужна крайне редко. А вот куда пришли - естественное желание.
обращаю внимание на этот момент.
SUSim wrote: Thu 23 Feb, 2023 10:21И событий всё-таки 2 надо:
SE_FOLDERCHANGE - папка будет изменена;
SE_FOLDERCHANGED - папка уже изменена.
фар так устроен, что в любой момент его работы нельзя дёргать api. так сложилось исторически. я не вижу простого пути сделать вызов плагинов в тот момент, когда фар уже знает, что текущая директория будет меняться, как и в тот момент, когда она только что изменилась. возможно я ошибаюсь — исходники открыты, попробовать никто не мешает. сейчас событие приходит после того как фар сменил директорию и находится в «хорошем» состоянии, когда можно с помощью api открывать миллион редакторов или, например, сменить текущую директорию. и ваш обработчик может быть не первым и к тому моменту, как вы получите управление, всё может сильно измениться и данные, на получение которых фару надо тратить ресурсы будут не востребованы. так зачем что-то делать, если результат не будет востребован. мне кажется, гораздо проще разобраться по месту, что вообще происходит.
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 »

zg wrote: Thu 23 Feb, 2023 12:43 у меня своё представление, что такое событие по смене директории, у вас — своё. у вас есть возможность аргументированно переубедить меня.
Постараюсь обосновать и пояснить логику.
Как представляется (увы, не соответствует уже сделанному):
Вопрос подводит к понятию "объект-панель" со своим хендлером, назначенным при создании; стандартные панели (не плагиновые) создавались бы при старте ФАРа и не уничтожались бы до конца; для них close() означало бы hide().
Переход на другую панель (активация) мог бы вызвать событие OnGetFocus. Но папка-то при этом не меняется.
Перемена панелей местами означало бы изменение проперти Left у обоих объектов. Соответственно, события смены папки не возникало бы (как и сейчас).
И, кстати, если бы был такой объект-панель, то "историю" (ну, хотя бы откуда происходил переход) можно было бы хранть в самом объекте.
Это - как хотелось бы. Но, видимо, так сделать уже поздно.
Сейчас хендлер имеется только у плагиновых панелей, и я не уверен, что он уникальный (например, две панели созданы одним плагином). Не проверял, извините. Но для целей использования события OnFoldrChange хотелось бы, чтобы он имитировал описанное в первой части поведение.
Например, при "входе" в папку и при наличии в ней определённого файла со скриптом он выполнялся (причём, по-разному, активна ли панель). Как я уже писал, я делал скрипт (по просьбе товарищей), который настраивал внешний вид панели под папку (это должно бы делаться независимо от активности) и открывал usermenu (а вот это - только для активной панели). Вот и представьте себе, что будет, если МЕНЮ будет выводится на каждый переход по TAB-у…
Last edited by buniak_a_h on Thu 23 Feb, 2023 15:26, 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 »

Правильно ли я понимаю, что директория «.» совсем не текущая директория с точки зрения обработчика события? Можно ли вызывать far.MacroLoadAll напрямую из обработчика событий или надо использовать что-то наподобие PostMacro или что то еще?

P.S. Просьба не откатывать изменения по результатам дискуссии
Last edited by gotar on Thu 23 Feb, 2023 19:22, 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 »

gotar wrote: Thu 23 Feb, 2023 19:17 Правильно ли я понимаю, что директория «.» совсем не текущая директория с точки зрения обработчика события?
если вы про «cd .», то с точки зрения фара — это смена директории (содержимое перечитывается, выделение снимается, курсор перемещается в начало, ctrl-m не работает, что-то ещё). если вы про что-то ещё — выражайтесь яснее, гадать я не люблю.
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, с текущей директорией у фара совсем беда. Вот, например, кусок переписки в другой теме:
buniak_a_h wrote: Wed 25 May, 2022 04:28
… Ну, попробую порыть, кто у меня на рабочем ФАРе делает, чтобы win.GetCurrentDir() всегда был равен APanel.Path0. Хотя это логично и удобно.
2useven10 wrote: Wed 25 May, 2022 05:25
…Например, старые (far1) плагины.

Если они есть, фар синхронизирует текущий каталог с активной панелью.
Т.е. теущий каталог - это не обязательно APanel.Path. Т.е. понятие текущего каталога в ФАРе какое-то размытое и не всегда определено однозначно (одно то, что результат зависит от набора плагинов (даже если они не используются!), чего стоит!!!)
Yegor
Posts: 1328
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

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

Post by Yegor »

buniak_a_h wrote: Fri 24 Feb, 2023 03:51 Т.е. понятие текущего каталога в ФАРе какое-то размытое
14 лет как:
drkns 2009-09-27 01:05:56+02:00 - build 1145
...

Свершилось то, о чём так долго говорили большевики - far не использует SetCurrentDirectory при навигации по папкам.
Как следствие, бонусы:
- хождение по папкам глубже MAX_PATH;
- вход в папки, оканчивающиеся точками, пробелами, и прочими ужасами;
- папка, открытая на панели, не блокируется от удаления извне;
- и прочее.
Соответственно, могут проявиться и баги. Соблюдаем осторожность.

Для оемных плагинов текущий каталог всё же выставляется перед вызовом их экспортируемых функций.
Ибо совместимость.

Для уникодных плагинов ничего не выставляется.
Посему некоторые нерадивые плагины могут разнообразно глючить.
Ещё не поздно исправиться и начать использовать FCTL_GETCURRENTDIRECTORY.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
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 »

А ещё вполне могут не совпадать far.GetCurrentDirectory и win.GetCurrentDir. Так что всё же я не могу ни объяснить, ни принять это разнообразие.
Понимаете, вот ситуация: в папке APanel.Path есть qqq.exe, и в папке, входящей в %PATH% есть (другая) qqq.exe . Я хочу быть уверенным, что когда я в комстроке набираю qqq.exe Enter, выполнится именно та прога, которую я вижу перед собой. И текущий каталог у неё будет именно тот, что вижу. Вроде как естественное желание.
Yegor
Posts: 1328
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

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

Post by Yegor »

buniak_a_h wrote: Fri 24 Feb, 2023 06:05 в папке APanel.Path есть qqq.exe, и в папке, входящей в %PATH% есть (другая) qqq.exe . Я хочу быть уверенным, что когда я в комстроке набираю qqq.exe Enter, выполнится именно та прога, которую я вижу перед собой. И текущий каталог у неё будет именно тот, что вижу. Вроде как естественное желание.
Так и будет (почти всегда, т.е. есть нюансы).
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
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 »

Yegor wrote: Fri 24 Feb, 2023 06:36 Так и будет (почти всегда, т.е. есть нюансы).
Ну, я же не просто от скуки начал проверять far.GetCurrentDirectory и win.GetCurrentDir! Видимо, как раз на нюансы и напоролся… Подробностей уже не помню.
Last edited by buniak_a_h on Fri 24 Feb, 2023 06:59, edited 1 time 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 »

Например, ведите в комстроке
lua:=win.SetCurrentDir('..'),far.GetCurrentDirectory(),win.GetCurrentDir()
и получите два разных имени CurDir-а
Yegor
Posts: 1328
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

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

Post by Yegor »

Мы наверное разговариваем на разных языках, то что у вас far.GetCurrentDirectory() <> win.GetCurrentDir() - это не нюанc, а все работает согласно документации, начиная с билда 1145 (смотрите двумя постами выше, я привел changelog).

EDIT:
Если вы запускаете qqq.exe из командной строки, то вызовется именно та, которую вы видите на активной панеле и текущая директория для qqq.exe будет взята из активной панели. А нюанс заключается в том что, если ваша текущая директория например заканчивается на точку "C:\Test.\", то будет вызван qqq.exe из %PATH%. Не умеет cmd запускать из таких папок.
Last edited by Yegor on Fri 24 Feb, 2023 07:59, edited 1 time in total.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

zg wrote: Thu 23 Feb, 2023 12:43 я не вижу простого пути сделать вызов плагинов в тот момент, когда фар уже знает, что текущая директория будет меняться,
Жаль... А не подскажите событие панелей которое может привести к смене директории (чтобы избыточность была поменьше)?
SimSU ··· ·· -- ··· ··-
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

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

Post by gotar »

Вы уверены что обсуждаемое событие связано с изменением именно APanel.Path? А не с far.GetCurrentDirectory()?
Last edited by gotar on Sat 25 Feb, 2023 19:47, edited 1 time in total.
Post Reply

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