Возможно, есть чисто технические сложности (трудоёмкости), делающие передачу сложных данных (таблиц, строк) неудобной. Поэтому я и сильно ограничил желание: хотя бы только признак, какая панель изменила папку. 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.
Тогда уж как в хелпе:
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.
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 надо:
И для первого события возможность запрета (так уже сделано для какого-то другого, но похожего события)?
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 открывать миллион редакторов или, например, сменить текущую директорию. и ваш обработчик может быть не первым и к тому моменту, как вы получите управление, всё может сильно измениться и данные, на получение которых фару надо тратить ресурсы будут не востребованы. так зачем что-то делать, если результат не будет востребован. мне кажется, гораздо проще разобраться по месту, что вообще происходит.
zg wrote: ↑Thu 23 Feb, 2023 12:43
у меня своё представление, что такое событие по смене директории, у вас — своё. у вас есть возможность аргументированно переубедить меня.
Постараюсь обосновать и пояснить логику. Как представляется (увы, не соответствует уже сделанному):
Вопрос подводит к понятию "объект-панель" со своим хендлером, назначенным при создании; стандартные панели (не плагиновые) создавались бы при старте ФАРа и не уничтожались бы до конца; для них close() означало бы hide().
Переход на другую панель (активация) мог бы вызвать событие OnGetFocus. Но папка-то при этом не меняется.
Перемена панелей местами означало бы изменение проперти Left у обоих объектов. Соответственно, события смены папки не возникало бы (как и сейчас).
И, кстати, если бы был такой объект-панель, то "историю" (ну, хотя бы откуда происходил переход) можно было бы хранть в самом объекте. Это - как хотелось бы. Но, видимо, так сделать уже поздно.
Сейчас хендлер имеется только у плагиновых панелей, и я не уверен, что он уникальный (например, две панели созданы одним плагином). Не проверял, извините. Но для целей использования события OnFoldrChange хотелось бы, чтобы он имитировал описанное в первой части поведение.
Например, при "входе" в папку и при наличии в ней определённого файла со скриптом он выполнялся (причём, по-разному, активна ли панель). Как я уже писал, я делал скрипт (по просьбе товарищей), который настраивал внешний вид панели под папку (это должно бы делаться независимо от активности) и открывал usermenu (а вот это - только для активной панели). Вот и представьте себе, что будет, если МЕНЮ будет выводится на каждый переход по TAB-у…
zg wrote: ↑Thu 23 Feb, 2023 12:43
можно же просто коммит посмотреть, нет её там
Я на сях писал в 992-м году прошлого тысячелетия. И именно на простых сях, без плюсов и решёток. Учить новый язык мне уже довольно сложно. Да ещё там столько макросов!…
Насчёт микро-истории: я предположил, что новая папка сравнивается с предыдущей и при несовпадении генерится событие. Ну, не угадал.
Last edited by buniak_a_h on Thu 23 Feb, 2023 15:26, edited 1 time in total.
Правильно ли я понимаю, что директория «.» совсем не текущая директория с точки зрения обработчика события? Можно ли вызывать far.MacroLoadAll напрямую из обработчика событий или надо использовать что-то наподобие PostMacro или что то еще?
P.S. Просьба не откатывать изменения по результатам дискуссии
Last edited by gotar on Thu 23 Feb, 2023 19:22, edited 1 time in total.
gotar wrote: ↑Thu 23 Feb, 2023 19:17
Правильно ли я понимаю, что директория «.» совсем не текущая директория с точки зрения обработчика события?
если вы про «cd .», то с точки зрения фара — это смена директории (содержимое перечитывается, выделение снимается, курсор перемещается в начало, ctrl-m не работает, что-то ещё). если вы про что-то ещё — выражайтесь яснее, гадать я не люблю.
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. Т.е. понятие текущего каталога в ФАРе какое-то размытое и не всегда определено однозначно (одно то, что результат зависит от набора плагинов (даже если они не используются!), чего стоит!!!)
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) Мичурин
А ещё вполне могут не совпадать far.GetCurrentDirectory и win.GetCurrentDir. Так что всё же я не могу ни объяснить, ни принять это разнообразие.
Понимаете, вот ситуация: в папке APanel.Path есть qqq.exe, и в папке, входящей в %PATH% есть (другая) qqq.exe . Я хочу быть уверенным, что когда я в комстроке набираю qqq.exeEnter, выполнится именно та прога, которую я вижу перед собой. И текущий каталог у неё будет именно тот, что вижу. Вроде как естественное желание.
buniak_a_h wrote: ↑Fri 24 Feb, 2023 06:05
в папке APanel.Path есть qqq.exe, и в папке, входящей в %PATH% есть (другая) qqq.exe . Я хочу быть уверенным, что когда я в комстроке набираю qqq.exe Enter, выполнится именно та прога, которую я вижу перед собой. И текущий каталог у неё будет именно тот, что вижу. Вроде как естественное желание.
Так и будет (почти всегда, т.е. есть нюансы).
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
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.
Мы наверное разговариваем на разных языках, то что у вас 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) Мичурин
zg wrote: ↑Thu 23 Feb, 2023 12:43
я не вижу простого пути сделать вызов плагинов в тот момент, когда фар уже знает, что текущая директория будет меняться,
Жаль... А не подскажите событие панелей которое может привести к смене директории (чтобы избыточность была поменьше)?