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

Здесь обсуждается всё, что касается макросов.
Post Reply
plastikat
Posts: 77
Joined: Fri 17 Jul, 2009 10:55
Has thanked: 1 time

Макрос на событие смены директории

Post by plastikat »

Возможно ли в Far3 повесить Lua-макрос на событие смены директории?
Если более конкретно, то хотелось бы задавать/обновлять значения некоторых переменных окружения после смены директории.
User avatar
cmd.exe
Posts: 378
Joined: Fri 16 Apr, 2010 18:26
Location: Нижний Новгород
Has thanked: 181 times
Been thanked: 10 times
Contact:

Макрос на событие смены директории

Post by cmd.exe »

Для этого отлично подходит плагин Environment Manager.
На событие вход в деректорию:
Panel.Left Folder == "SomePath"
Panel.Right Folder == "SomePath"
или Active Panael == "SomePath"
Выполнить изменение конфигурации плагина Environment Manager. было-бы не плохо что-бы это было не только способами макроса, но и возможностью самого плагина.
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it. (c) I Am Devloper
I know nothing except the fact of my ignorance. (с) Socrates
plastikat
Posts: 77
Joined: Fri 17 Jul, 2009 10:55
Has thanked: 1 time

Макрос на событие смены директории

Post by plastikat »

Спасибо за информацию об интересном плагине, но, для моего случая он не подходит. Или я просто не понял как с его помощью можно реализовать идею, описанную по ссылке...
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

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

Post by gene.pavlovsky »

Как сделать, чтоб при каждом изменении директории в любой из панелей текущие пути сохранялись (как я увидел, они хранятся в localconfig.db)?
Зачем: Хочется в ConEmu иметь возможность открыть новую вкладку с Фаром с теми же путями, что и уже открытый Фар. На данный момент использую в ConEmu Task Parameters /dir "%CD%", но это дублирует лишь активную панель. Хочется и пассивную тоже.
Возможно ли написать макрос, который по смене директории сохраняет текущие панели в localconfig? Сохранять по такому делу весь конфиг (Shift-F9) не хочется?
1. Как вызывать макрос по событию смены директории?
2. Как сохранить панели в localconfig?

Upd: рабочий вариант
Last edited by gene.pavlovsky on Thu 10 Nov, 2016 15:57, edited 3 times in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Сохранение путей в localconfig при каждом chdir

Post by John Doe »

Не правильнее ли написать макрос, запускающий фар с нужными путями на панелях?
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

Сохранение путей в localconfig при каждом chdir

Post by gene.pavlovsky »

Ну это самый очевидный вариант - может, так и сделаю. Но что, если, к примеру, в текущем Фаре как раз что-то долгое копируется. Это один из частых случаев, когда хочется открыть новый фар в том же месте.
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

Сохранение путей в localconfig при каждом chdir

Post by Wave »

Хотел сказать, что где-то тут на форуме есть скрипт «Pick path from other FAR instances», но оказалось, что когда в соседней панели работает копирование, сам «pick path» в этот момент не знает, какие пути под диалогом копирования таятся. Так что можешь глянуть его, но проблему не решит. Или вызывать его перед операцией копирования.
P.s. Скрипт не заменяет путь текущей панели, а вставляет путь в комстроку или диалог. Поэтому в дополнение к нему можно было бы пользоваться таким вот макросом:

Code: Select all

Macro {
  area = "Shell Search"; key = "CtrlShiftG"; description = "Panel: Go to path from clipboard"; action = function()
    mypath = prompt("GoTo", "Input path", 0x00000010); mypath = mf.trim(mypath); mypath = mf.replace(mypath, "\\", "\\"); Panel.SetPath(0, mypath);
  end
}
Пользуюсь ФАРом больше 20 лет © собирательный.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Сохранение путей в localconfig при каждом chdir

Post by John Doe »

gene.pavlovsky wrote: Но что, если, к примеру, в текущем Фаре как раз что-то долгое копируется.
Приостановить по Esc, и запустить новый фар макросом.
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

Сохранение путей в localconfig при каждом chdir

Post by gene.pavlovsky »

"Pick path" частично решает проблему, но если запущено несколько фаров, то как узнать, который из них был последний активен?
Плюс несколько штук запущенных фаров, 20 раз в секунду опрашивающих файловую систему на наличие файла - из пушки по воробьям (для моего ограниченного случая).

Я подумал, что в принципе мне localconfig не упёрся, я мог бы текущие пути на панелях сохранять также во временный файл. А запуск фара из conemu делать через wrapper, считывающий этот файл, и уже запускающий фар с нужными путями.

Один вопрос остался - как в макросе отловить событие смены директории в панели?
Штудирование энциклопедии, исходников, и темы http://forum.farmanager.com/viewtopic.php?f=15&t=7693 не дало результата. Или я что-то не проглядел, или от панели никаких макро-эвентов не зацепить?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Сохранение путей в localconfig при каждом chdir

Post by John Doe »

gene.pavlovsky wrote: или от панели никаких макро-эвентов не зацепить?
Увы. Но на мантисе есть http://bugs.farmanager.com/view.php?id=2826
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

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

Post by gene.pavlovsky »

Спасибо. Уже нашёл данный wish и откомментил...

На данный момент вижу для себя следующий геморноватый, но реальный способ.
Повесить макросы на все сочетания клавиш, меняющие путь в панели (для начала на Enter). Сначала послать собственно эти сочетания клавиш, а потом вызвать ф-цию UpdateDirs().

Недоделанный макрос, общий принцип работает. Осталось сохранять состояние в файл, а в другом автостарт-макросе восстанавливать состояние из файла (по сути дублируется часть функционала localconfig.db, что очень некрасиво, но что поделаешь, кроме как писать feature request-ы).
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

gene.pavlovsky wrote: Повесить макросы на все сочетания клавиш, меняющие путь в панели (для начала на Enter).
Или по таймеру проверять.
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

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

Post by gene.pavlovsky »

John Doe wrote:Или по таймеру проверять.
Да, я уже понял, что с клавишами я порядочно задолбаюсь, адаптирую сейчас ваш PickPathFromOtherFAR.lua под мою задачу.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Ещё можно привязаться к ConsoleInput
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

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

Post by gene.pavlovsky »

Не нравится мне, что так извращаться приходится, но вот каков получился результат.

Функционал: При любом переходе в директорию или перемещении курсора текущее состояние панелей автосохраняется. При запуске нового экземпляра Фара он будет запущен с теми же путями, что и последний используемый Фар.

Требования: Клиент sqlite3.exe для командной строки, я использую из состава Cygwin, можно любой другой сборки. Путь прописан в макросе в переменной SQLITE. Чтоб совсем не тормозило, надо запускать команду через os.execute в фоне, я использую Cygwin-овский setsid, вроде бы ещё есть некий emSpawn (не пробовал).

Как работает: Таймер проверяет панели раз в 50 мс. Если путь или текущий файл на одной из панелей изменились, либо состоялся переход на др. панель, либо панели поменялись местами - начинается обратный отсчёт тиков таймера (автосохранение состояния делается не моментально после каждого изменения, чтоб не грузить излишне систему). Если через 6 тиков (~300 мс) таймера других обновлений не было, состояние панелей сохраняется. Если же на любом тике состояние опять изменилось, отсчёт начинается сначала (с 6). Это позволяет, к примеру, зажать Enter на директории, либо Up/Down на длинном списке файлов, и избежать неприятных задержек. Далее текущее состояние панелей оформляется в виде SQL-запроса, и он применяется через os.execute клиентом sqlite3 к localconfig.db в Far Profile. Чтобы это совсем не тормозило, хорошо бы запускать команду в фоновом режиме, я использую Cygwin-овский setsid.exe, ещё есть некий emSpawn специально для Lua (не пробовал). Тогда вообще не чувствуется никаких задержек. Загрузка CPU в среднем не изменилась.

Panel_ChangeDir.lua
Post Reply

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