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

Здесь обсуждается всё, что касается макросов.
gene.pavlovsky
Posts: 163
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

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

Post by gene.pavlovsky » Mon 07 Nov, 2016 12:29

Как сделать, чтоб при каждом изменении директории в любой из панелей текущие пути сохранялись (как я увидел, они хранятся в 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: 11262
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 84 times

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

Post by John Doe » Mon 07 Nov, 2016 12:40

Не правильнее ли написать макрос, запускающий фар с нужными путями на панелях?

gene.pavlovsky
Posts: 163
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

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

Post by gene.pavlovsky » Mon 07 Nov, 2016 18:09

Ну это самый очевидный вариант - может, так и сделаю. Но что, если, к примеру, в текущем Фаре как раз что-то долгое копируется. Это один из частых случаев, когда хочется открыть новый фар в том же месте.

User avatar
Wave
Posts: 1716
Joined: Thu 04 Aug, 2005 18:47
Location: Харьков, Украина
Has thanked: 2 times
Been thanked: 9 times
Contact:

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

Post by Wave » Tue 08 Nov, 2016 09:13

Хотел сказать, что где-то тут на форуме есть скрипт «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
}
Пользуюсь ФАРом больше 15 лет © собирательный.

User avatar
John Doe
Бюрократ
Posts: 11262
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 84 times

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

Post by John Doe » Tue 08 Nov, 2016 09:36

gene.pavlovsky wrote: Но что, если, к примеру, в текущем Фаре как раз что-то долгое копируется.
Приостановить по Esc, и запустить новый фар макросом.

gene.pavlovsky
Posts: 163
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

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

Post by gene.pavlovsky » Tue 08 Nov, 2016 11:39

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

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

Один вопрос остался - как в макросе отловить событие смены директории в панели?
Штудирование энциклопедии, исходников, и темы viewtopic.php?f=15&t=7693 не дало результата. Или я что-то не проглядел, или от панели никаких макро-эвентов не зацепить?

User avatar
John Doe
Бюрократ
Posts: 11262
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 84 times

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

Post by John Doe » Tue 08 Nov, 2016 12:00

gene.pavlovsky wrote: или от панели никаких макро-эвентов не зацепить?
Увы. Но на мантисе есть http://bugs.farmanager.com/view.php?id=2826

gene.pavlovsky
Posts: 163
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

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

Post by gene.pavlovsky » Tue 08 Nov, 2016 12:52

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

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

Недоделанный макрос, общий принцип работает. Осталось сохранять состояние в файл, а в другом автостарт-макросе восстанавливать состояние из файла (по сути дублируется часть функционала localconfig.db, что очень некрасиво, но что поделаешь, кроме как писать feature request-ы).

User avatar
John Doe
Бюрократ
Posts: 11262
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 84 times

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

Post by John Doe » Tue 08 Nov, 2016 15:42

gene.pavlovsky wrote: Повесить макросы на все сочетания клавиш, меняющие путь в панели (для начала на Enter).
Или по таймеру проверять.

gene.pavlovsky
Posts: 163
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

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

Post by gene.pavlovsky » Tue 08 Nov, 2016 18:31

John Doe wrote:Или по таймеру проверять.
Да, я уже понял, что с клавишами я порядочно задолбаюсь, адаптирую сейчас ваш PickPathFromOtherFAR.lua под мою задачу.

User avatar
John Doe
Бюрократ
Posts: 11262
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 84 times

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

Post by John Doe » Tue 08 Nov, 2016 20:45

Ещё можно привязаться к ConsoleInput

gene.pavlovsky
Posts: 163
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

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

Post by gene.pavlovsky » Wed 09 Nov, 2016 01:01

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

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

Требования: Клиент 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

gene.pavlovsky
Posts: 163
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

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

Post by gene.pavlovsky » Wed 09 Nov, 2016 01:06

ConsoleInput вызывается при любом нажатии на клавишу, или?

User avatar
John Doe
Бюрократ
Posts: 11262
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 84 times

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

Post by John Doe » Wed 09 Nov, 2016 09:33

gene.pavlovsky wrote: Таймер проверяет панели раз в 50 мс.
Имхо достаточно раз в секунду или даже реже.
gene.pavlovsky wrote: ConsoleInput вызывается при любом нажатии на клавишу
Да

gene.pavlovsky
Posts: 163
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

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

Post by gene.pavlovsky » Wed 09 Nov, 2016 12:41

Code: Select all

Event { description="PanelChangeDir: Listen to key events"; group="ConsoleInput";
	action=function()
		local f = io.open('R:\\pcd.txt', 'a')
		f:write('.')
		f:close()
	end;
}
Попробовал для теста вот такой код. Файл pcd.txt живо наполняется точками (скажем, 40 в секунду), даже если никакие клавиши не нажимать. От такого эвента проку ноль... Или помимо group="ConsoleInput" ещё какие-то условия надо указать?

User avatar
zg
zero-gravity
Posts: 5266
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 44 times
Contact:

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

Post by zg » Wed 09 Nov, 2016 14:15

там не только клавиатура, там весь консольный ввод, включая мышь. всё, кроме нажатий на кнопки клавиатуры и мыши можно точно фильтровать.
ещё можно проверять текущее окно, если не панели, то тоже фильтровать, хотя тут не 100%.

Post Reply

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