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

Здесь обсуждается всё, что касается макросов.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

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

Post by buniak_a_h »

Latest post of the previous page:

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

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

Post by gotar »

Кто нибудь может подтвердить , что far.MacroLoadAll можно безопасно вызывать из обработчика событий редактора?
Last edited by gotar on Sun 12 Jul, 2020 07:33, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 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: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

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

Post by gotar »

Вот что у меня получилось:
  1. local F=far.Flags
  2.  
  3.  
  4.  
  5. _G.LoadMacrosFromWorkDir=_G.LoadMacrosFromWorkDir or {}
  6.  
  7. L=_G.LoadMacrosFromWorkDir
  8.  
  9. OldDir=L.OldDir or ""
  10.  
  11. OldEditorId=L.OldEditorId or -1
  12.  
  13. local dir=
  14.  
  15.  
  16.  
  17.  
  18.  
  19. Event {
  20.  
  21.   description="Load macros from current work dirrectory";
  22.  
  23.   group       = "EditorEvent";
  24.  
  25.   id="fc741241-b11c-489b-948d-3eecd0c469bf";
  26.  
  27.  
  28.  
  29.   condition=function(id,event,param)
  30.  
  31.      if id==OldEditorId then return false ; end;
  32.  
  33.      if event==F.EE_CLOSE then OldEditorId=-1; return false; end;
  34.  
  35.      if event ~= F.EE_READ and event ~= F.EE_GOTFOCUS  then return false; end;
  36.  
  37.      dir=mf.fsplit(Editor.FileName,3)
  38.  
  39.  
  40.  
  41.      if dir==OldDir then return false; end;
  42.  
  43.      return true;
  44.  
  45.   end;
  46.  
  47.   action=function(id,event,param)
  48.  
  49.       L.OldDir=dir
  50.  
  51.       L.OldEditorId=id
  52.  
  53.       far.MacroLoadAll(dir .. '/Macros;' .. win.GetEnv('FARPROFILE') .. [[\Macros\scripts]])
  54.  
  55.   end
  56.  
  57. }
Пока макросы загружаются только для редактора. Когда вернут события смены каталогов, можно будет сделать для остальных областей.
Last edited by gotar on Mon 10 Aug, 2020 23:26, edited 4 times in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 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: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

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

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.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

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

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

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

Post by citRiks »

В этой версии вылечены пара детских болезней, предыдущая удаляется
если у кого-то что не так, непонятно, не работает - сообщайте
<удалено, актуальную версию смотреть в конце темы>
Last edited by citRiks on Mon 05 Oct, 2020 19:19, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 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.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 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 2456 times
Что дает прилагаемый Content column кроме обеспечания событийности:
* В одном символе показывает или hardlink если он есть, или symbolic линк если он есть, или выставленный archive bit если он есть.
Если ничего этого нет, то остается пустым, чтобы не загружать лишней информацией
* Если время сканирования на эти атрибуты файлов в директории слишком длинное и превзошло 5 секунд, то сканирование останавливается
Актуально для сетевых дисков или любых других медленных дисков, чтобы не тормозило
Last edited by citRiks on Mon 05 Oct, 2020 19:36, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

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

В приаттаченном REG-файле - избавление от некоторых побочных эффектов связанных с запусками sqlite3.exe,
причем без добавления других побочных эффектов :)
Attachments
Disable_UNC_Path_Warn.reg
(458 Bytes) Downloaded 104 times
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

только страх опозориться перед потомками заставляет меня делать нормальный QA.
Добавлена функциональность позволяющая различать смену физической директории,
и директории в плагине, в архиве например.
Баги починены, перезалито.

UPD
аттачмент удален, здесь и далее будет храниться здесь:
https://github.com/dr-dba/far-lua-direc ... ange-event
Last edited by citRiks on Sat 16 Jan, 2021 12:12, edited 2 times in total.
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

citRiks wrote: Mon 05 Oct, 2020 16:53 items - это активные панельные элементы, по одному справа и слева
А для чего они? Те, что можно получить прямо от Фара, чем-то плохи? Я-то скриптом не пользуюсь, но другим может оказаться полезно знать.
citRiks wrote: Mon 05 Oct, 2020 19:30 В одном символе показывает или hardlink если он есть, или symbolic линк если он есть, или выставленный archive bit если он есть.
В одном знакоместе можно довольно наглядно показывать любую комбинацию значений 5 атрибутов/флагов.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

HaRT wrote: Tue 06 Oct, 2020 00:25А для чего они? Те, что можно получить прямо от Фара, чем-то плохи?
По многим причинам, но наверное все эти причины исходят из, как минимум, полезности консистентности, а как максимум - необходимости консистентности.
Если в двух словах - на момент обработки события текущие предметы (айтемы) курсор, и даже директории, могут уже отличаться от обрабатываемового события,
событие оно на то и событие чтобы быть несколько асинхронным, даже если рассинхрон всего лишь несколько милисекунд.
курсор может и за милисекунду уехать куда угодно, а нам надо на момент события где он был, а не где он сейчас.
Но и кроме консистентности, вопрос что эффективнее.
Т.е., например, создателю скрипта полезнее держать все данные в одной структуре, чтобы не бегать по разным углам пересобирая и обрабатывая данные.
Но, это полезно не только скриптописателю, но еще и самому ЦПУ, меньше пересобирать все, и больше делать чего-то может быть, более полезного.
Далее, получить набор данных вместе сразу в одной табличке полезно не только лишь всем, но еще и тому кому придется расширять возможности этого скрипта, для чего он и написан.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

HaRT wrote: Tue 06 Oct, 2020 00:25 В одном знакоместе можно довольно наглядно показывать любую комбинацию значений 5 атрибутов/флагов.
Да интересно, надо будет разобраться. я правда забыл упомянуть что в моем контент-колумне показываются пустые папки, большая буква Е - папака совсем пустая, малеьнкая буква Е - с другими пустыми директориями
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Индивидуальные преднастройки для сортировки конкретных каталогов

Post by buniak_a_h »

citRiks wrote: Fri 15 Jan, 2021 21:50 Здесь все прекрасно и уже давно работает, (почти) без таймера, без загрузки CPU:
Я пытался посмотреть, наткнулся на макрос, повешенный на Enter - и это меня срубило. Возможно, теперь этого уже нету, но было.
Post Reply

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