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

Здесь обсуждается всё, что касается макросов.
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

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

Post by citRiks »

Latest post of the previous page:

Исправлено поведение на плохих directory junctions, зависало насмерть.
Для немедленности "евента" (триггера) надо добавить хоть какие-то content/status columns.
В этом примере используется полезный односимвольный content column,
(изза этого и было зависание, когда он пытался прочитать никуда не ведущий junction)
но можно любой другой, можно фэйковый пустой.

ВЛОЖЕНИЕ УДАЛЕНО, ПОТОМУ ЧТО ПРЕДОСТАВЛЕНА АКТУАЛьНАЯ ВЕРСИЯ ДАЛЕЕ
Last edited by citRiks on Wed 12 Aug, 2020 23:26, edited 2 times in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
gotar
Posts: 327
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times
Been thanked: 1 time

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

Post by gotar »

В каком месте надо поменять этот скрипт, чтобы при смене каталога он загружал lua скрипты из этого каталога?
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

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

Post by citRiks »

gotar,
там есть такая пустая функция:

Code: Select all

local function fnc_evt_dir_chg(evt_data)

end
В нее можно написать ваш код загрузки ваших скриптов, или все что угодно.

BTW
У меня тоже есть код (загрузки скриптов) для этого
(если память не изменяет как раз на основе вашего кода, но я там чего-то еще наулучшал),
но этот код не здесь конечно
Last edited by citRiks on Thu 25 Jun, 2020 12:32, edited 2 times in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
gotar
Posts: 327
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times
Been thanked: 1 time

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

Post by gotar »

Я то думал вызвать far.MacroLoadAll, но хотел бы посмотреть и Ваш код
buniak_a_h
Posts: 2318
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 248 times
Contact:

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

Post by buniak_a_h »

gotar, всё верно, far.MacroLoadAll. Только надо учитывать, что ранее загруженные макросы выгрузятся. Т.е. если Вы хотите, чтоб остались стандартно загруженные, то надо писать нечто тиипа
far.MacroLoadAll(CurrDir .. ';' .. win.GetEnv('FARPROFILE') .. [[\Macros\scripts]])
Впрочем, надо ещё проверить, обрабатываются вложенные папки. У меня был такой скрипт, увы - пропал.
Last edited by buniak_a_h on Thu 25 Jun, 2020 18:49, edited 1 time in total.
buniak_a_h
Posts: 2318
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 248 times
Contact:

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

Post by buniak_a_h »

gotar wrote: Thu 25 Jun, 2020 11:37 В каком месте надо поменять этот скрипт, чтобы при смене каталога он загружал lua скрипты из этого каталога?
Что-то я затупил…
1. А Вы уверены, что Вам надо именно загружать макросы, а не выполнить некий скрипт, описанный в файле в новой папке?
2. Если Вам надо повесить некий скрипт, зависящий от папки, на одну и ту же клавишу, то это делается проще: пишете один макрос, в condition указываете наличие файла (напр., FolderScript.lua), а в execute - выполнение скрипта, указанного в файле (например, через LoadFile('FolderScript.lua')([параметры])).
gotar
Posts: 327
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times
Been thanked: 1 time

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

Post by gotar »

Кто нибудь может подтвердить , что far.MacroLoadAll можно безопасно вызывать из обработчика событий редактора?
Last edited by gotar on Sun 12 Jul, 2020 07:33, edited 1 time in total.
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

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

Post by citRiks »

gotar wrote: Sun 12 Jul, 2020 07:26 Кто нибудь может подтвердить , что far.MacroLoadAll можно безопасно вызывать из обработчика событий редактора?
Думаю что можно, я вроде постоянно так делал, макросом из редактора,
а обрaботчик событий вроде ничем особенным не отличается от обычного макроса.
gotar wrote: Thu 25 Jun, 2020 18:12 Я то думал вызвать far.MacroLoadAll, но хотел бы посмотреть и Ваш код
Ответил в более подходящей теме и к тому вашей собственной :)
viewtopic.php?f=15&p=105066#p105066
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
gotar
Posts: 327
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times
Been thanked: 1 time

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

Post by gotar »

Вот что у меня получилось:
  1. local F=far.Flags
  2.  
  3. _G.LoadMacrosFromWorkDir=_G.LoadMacrosFromWorkDir or {}
  4. L=_G.LoadMacrosFromWorkDir
  5. OldDir=L.OldDir or ""
  6. OldEditorId=L.OldEditorId or -1
  7. local dir=
  8.  
  9.  
  10. Event {
  11.   description="Load macros from current work dirrectory";
  12.   group       = "EditorEvent";
  13.   id="fc741241-b11c-489b-948d-3eecd0c469bf";
  14.  
  15.   condition=function(id,event,param)
  16.      if id==OldEditorId then return false ; end;
  17.      if event==F.EE_CLOSE then OldEditorId=-1; return false; end;
  18.      if event ~= F.EE_READ and event ~= F.EE_GOTFOCUS  then return false; end;
  19.      dir=mf.fsplit(Editor.FileName,3)
  20.  
  21.      if dir==OldDir then return false; end;
  22.      return true;
  23.   end;
  24.   action=function(id,event,param)
  25.       L.OldDir=dir
  26.       L.OldEditorId=id
  27.       far.MacroLoadAll(dir .. '/Macros;' .. win.GetEnv('FARPROFILE') .. [[\Macros\scripts]])
  28.   end
  29. }
Пока макросы загружаются только для редактора. Когда вернут события смены каталогов, можно будет сделать для остальных областей.
Last edited by gotar on Mon 10 Aug, 2020 23:26, edited 4 times in total.
buniak_a_h
Posts: 2318
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 248 times
Contact:

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

Post by buniak_a_h »

gotar, как всё сложно …
Где-то на просторах форума был маленький скрипт Reload macros.lua:

Code: Select all

Macro {
  description=Far.GetConfig('Language.Help')=="Russian" and "Перезагрузка макросов" or "Reload macros";
  area="Common"; key="CtrlShiftR";
  action=function()
    local msg = Far.GetConfig('Language.Help')=="Russian" and "Перезагрузка макросов" or "Reload macros"
    far.Message(msg,"","")
    far.MacroLoadAll()
    win.Sleep(200)
    far.AdvControl("ACTL_REDRAWALL")
  end;
}
Обратите внимание на строку win.Sleep(200): без неё результат неустойчивый (!)
Добавить параметр пути поиска макросов - дело, по-моему, минут на 3-4 …
gotar
Posts: 327
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times
Been thanked: 1 time

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

Post by gotar »

Как известно, самая точная документация к программе - это ее исходные тексты.
У меня в каталоге %FARPROFILE%\Macros\scripts несколько экранов файлов. Для большинства из этих файлов я не помню наизусть ни какие макросы в них описываются, ни какие горячие клавиши они используют. Однако, если внимательно посмотреть на такой файл, то можно увидеть что макросы в нем полезны, просто используются не слишком часто, в каких то специфических случаях. мое предположение состоит в том, что макросы которые будут использоваться, зависят от каталога в котором находятся редактируемые файлы. В одном каталоге я программирую - нужны одни макросы, в другом анализирую логи - нужны другие макросы, в третьем пишу пишу письма - и нужен новый вариант макросов. Для того чтобы воспользоваться обработчиком событий из моего предыдущего сообщения нужно переместить файлы из каталога %FARPROFILE%\Macros\scripts в другой каталог, оставив в этом каталоге только наиболее используемые файлы, которыми Вы пользуйтесь каждый день и о предназначении которых Вы всегда помните. У меня таких файлов оказалось 14 штук. Когда Вы используйте каталог для определенной работы Вы создаете в нем подкатолог Macros и переписываете в него дополнительные макросы, нужные для работы в этом каталоге. Теперь, когда Вы будете редактировать файлы макросы каталога редактируемого файла будут автоматически подгружаться, при редактировании файла из другого каталога эти макросы забудутся и загружатся макросы нового каталога.
Last edited by gotar on Tue 11 Aug, 2020 07:23, edited 1 time in total.
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

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

Post by citRiks »

gotar,
И эта задача "контекстных" макросов решена вами полностью на данный момент?
Я решал похожую задачу и решил несколькими разными способами.
Например, еще один вариант помимо перезагрузки макросов, это не перезагружать макросы,
а делать контекстные действия через dofile() который будет браться в зависимости от контекста.

И еще.
Это навеяло мне про могучий-навороченный в прошлом но забытый сейчас комплекс из LuaFar_Context + RH + FL +++...
Там довольно интересная реализация, и сложная для не-авторов, видимо потому и оказалось заброшкой.
Но в результате там есть действтельно воможность именно контекстных действий, в зависимости от типа файла, места где.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

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

Post by citRiks »

В этой версии вылечены пара детских болезней, предыдущая удаляется
если у кого-то что не так, непонятно, не работает - сообщайте
<удалено, актуальную версию смотреть в конце темы>
Last edited by citRiks on Mon 05 Oct, 2020 19:19, edited 1 time in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

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

Post by citRiks »

Починено куча багов, плюс ввиду некоторых произошедших изменений на уровне ФАРа, следующая версия, старая удляется
Искаропки просто сохраняет текущие расположения директорий и курсор в панелях, чтобы при перезапуске ФАРа это восстановилось.
Для "Не-искаропки" пишем в эту функцию что-нибудь полезное-нужное:

Code: Select all

local function fnc_evt_dir_chg(evt_data)
--	LE(evt_data)
--	far.Message("Something changed")
end
где evt_data имеет такой самообьясняющий формат:

Code: Select all

chg_item_L                    │boolean  │false
chg_item_R                    │boolean  │true
chg_actv_P                    │boolean  │false
chg_path_L                    │boolean  │false
chg_path_R                    │boolean  │false
Curr_ActvLeft                 │boolean  │false
Prev_ActvLeft                 │boolean  │false
Curr_LeftItem                 │string   │tmp5C42.tmp
Curr_LeftPath                 │string   │F:\sys_tmp\temp
Curr_RghtItem                 │string   │check_env_20200826.txt
Curr_RghtPath                 │string   │F:\sys_tmp\temp\FAR_TMP
Prev_LeftItem                 │string   │tmp5C42.tmp
Prev_LeftPath                 │string   │F:\sys_tmp\temp
Prev_RghtItem                 │string   │FAR9DA4.tmp.Lua
Prev_RghtPath                 │string   │F:\sys_tmp\temp\FAR_TMP
Логическия значения chg_* означают что изменилось, т.е. послужило триггером евента.
Евент со всеми chg_* = false и не придет, т.к. это было бы холостое срабатывание.
Так мы знаем что конкретно изменилось, если поменялся просто активный элемент без смены директории,
то например ничего не будем делать, а если сменилась сама директория, то может и захотим что-нибудь сделать

items - это активные панельные элементы, по одному справа и слева.
chg_actv_P - фокус перешел, справа налево или справа налево, третьего недано.
Остальные значение Curr_* и Prev_* означают "было" и "стало", по сравению с предыдущим евентом.
Как например, Prev_RghtItem это какой был предыдущий активный элемент.



PS
Пока ничего не качать, залил кривую версию
залил нормальную версию, можно и нужно скачивать

удалено, актуальную версию смотреть в конце темы
Last edited by citRiks on Mon 05 Oct, 2020 21:31, edited 5 times in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

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

Post by citRiks »

Особенности реализации
1.) Минимальная потребность в таймере, может быть использовано без таймера.
Таймер включается/отключается параметром USE_TIMER в самом скрипте, в начале скрипта.
2.) Проверяются, но, боже упаси, не перехватываются,
ХотКеи свидетельствующие о смене дириктории - Tab, Enter, CtrlU, CtrlF1, CtrlF2,
этим достигается мгновенность реакции и при отсутствии таймера.
3.) Мгновенная, корректная, гарантированная реакция БЕЗ таймера достигается добавлением какого-нибудь любого content column,
можно пустого фэйкового в один символ, можно в "status" (который статус текущего файла внизу под панелью).
В скрипте есть однако полезный односимвольный content column,
но для его использования его нужно добавить в file panel modes, например:
image.png
image.png (7.24 KiB) Viewed 241 times
Что дает прилагаемый Content column кроме обеспечания событийности:
* В одном символе показывает или hardlink если он есть, или symbolic линк если он есть, или выставленный archive bit если он есть.
Если ничего этого нет, то остается пустым, чтобы не загружать лишней информацией
* Если время сканирования на эти атрибуты файлов в директории слишком длинное и превзошло 5 секунд, то сканирование останавливается
Актуально для сетевых дисков или любых других медленных дисков, чтобы не тормозило
Last edited by citRiks on Mon 05 Oct, 2020 19:36, edited 1 time in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

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

Post by citRiks »

На всякий случай еще раз упоминаю, что скрипт ЗАВИСИТ от Sqlite3.exe, увы.
Лучше бы не зависел, так как чем меньше зависимостей тем лучше,
но руки все не доходят, а производительность вполне Ок и на моих совсем дохлых компьютерах тоже.

В приаттаченном REG-файле - избавление от некоторых побочных эффектов связанных с запусками sqlite3.exe,
причем без добавления других побочных эффектов :)
Attachments
Disable_UNC_Path_Warn.reg
(458 Bytes) Downloaded 10 times
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
Post Reply

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