Latest post of the previous page:
Простейший вариант как бы на поверхности: назначение макросу GUID'а (потребует поддержки со стороны LuaMacro; сделать это очень просто).Организация макросов, пользовательские хоткеи, настройки, …
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Организация макросов, пользовательские хоткеи, настройки
Имеется в виду дополнительное (опциональное?) поле в структуре Macro, о котором пользователь должен позаботиться сам (или спецмакросом)?
https://t.me/FarManager — Telegram чат
Re: Организация макросов, пользовательские хоткеи, настройки
Что самое забавное: в последнее время тоже серьёзно обдумываю реализацию этой идеи. Видимо, данное развитие мысли закономерно.John Doe wrote:Так и есть, посмотрел в черновиках. Конечной целью была как раз такая система, где для изменения хоткеев любого макроса не нужно предпринимать вообще никаких специальных действий в коде.John Doe wrote:В Macro Browser alt. давно реализована возможность переназначения (нажатием CtrlShiftF11 в списке макросов).
Правда не вижу нигде чтобы я это анонсировал... Вероятно просто не довёл до конца всё задуманное...
Просто открываешь Macro Browser, выбираешь нужный макрос, и задаёшь пользовательское сочетание клавиш, оно сохраняется в базе и используется вместо того что указано в файле.
Идея очень вкусная, я поддерживаю всеми руками. Смущает один нюанс: как быть с теми макросами, для которых гуид не задан? Навскидку, конечно, можно так: <полное имя файла с макросом, включая путь, с поддержкой переменных окружения>:<смещение до начала определения макроса в файле>. Но это тоже не совсем удобно. И не будет работать для макросов не из файлов, хотя это уже, наверное, не критично.Shmuel wrote:Дополнительное опциональное поле, заполняется автором макроса, не изменяется при обновлениях макроса.
Кстати, можно ли добавить следующую функциональность: при чтении макросов из файла сохранять смещение до начала его определения, чтобы затем получать его через debug.getinfo() или аналогичным способом, как это делается для функций?
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Организация макросов, пользовательские хоткеи, настройки
Ничего не делать.IgorZ wrote:Смущает один нюанс: как быть с теми макросами, для которых гуид не задан?
Функциональность, о которой мы говорим, может быть реализована и без каких-либо изменений в LuaMacro.IgorZ wrote:Кстати, можно ли добавить следующую функциональность: при чтении макросов из файла сохранять смещение до начала его определения,
Фокус в том, что функцию Macro можно подменить на собственную (идею можно посмотреть в MacroBrowserAlt).
А из собственной функции мы легко можем получить место её вызова -
debug.getinfo(2).currentline
- это и будет позиция начала определения макроса.- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Организация макросов, пользовательские хоткеи, настройки
Вот рабочий прототип модуля, реализующего 'лёгкое переназначение' клавиш, не затрагивая файлы макросов:
Этот модуль должен инициализироваться до всех определений макросов, поэтому его загрузку необходимо прописать в файле _macroinit.lua:
Для того, чтобы макрос можно было переназначить, у него должен быть задан идентификатор (поле guid). Например: Вот и всё. Для переназначения клавиш служит функция RebindMacro, возвращаемая в таблице модуля.
Запустить можно даже из командной строки:
Разумеется это только для демонстрации, а чтобы стало по-настоящему удобно переназначать клавиши необходимо сделать ещё один шаг — внедрить функцию переназначения в какой-либо из существующих MacroBrowser'ов.
P.S.
IgorZ
Обратите внимание, теперь в таблице макроса, получаемой по mf.GetMacroCopy, присутствует поле defline, в котором хранится номер строки, с которой начинается определение макроса.
Этот модуль должен инициализироваться до всех определений макросов, поэтому его загрузку необходимо прописать в файле _macroinit.lua:
require'rebind'
Для того, чтобы макрос можно было переназначить, у него должен быть задан идентификатор (поле guid). Например: Вот и всё. Для переназначения клавиш служит функция RebindMacro, возвращаемая в таблице модуля.
Запустить можно даже из командной строки:
Code: Select all
lm:post require"rebind".RebindMacro"5D3CBA90-F32D-433C-B016-9BB4AF96FAC1"
P.S.
IgorZ
Обратите внимание, теперь в таблице макроса, получаемой по mf.GetMacroCopy, присутствует поле defline, в котором хранится номер строки, с которой начинается определение макроса.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Организация макросов, пользовательские хоткеи, настройки
Есть только прототип этой функциональности. И автор LuaMacro пока не давал комментариев на этот счёт, т.е. будет ли нечто подобное 'из коробки' — неизвестно.SUSim wrote:Кстати, guid'ы к макросам делать?
Как бы там ни было, но в своём Macro Browser alt. я обязательно реализую такое 'лёгкое переназначение'.
(Хотя в качестве идентификаторов я бы предпочёл произвольные строки, а не гуиды)
Подход, предлагаемый выше, решает только вопрос с переназначением клавиш, об остальных настройках надо заботиться самостоятельно, как и раньше.SUSim wrote:или подход с отдельными файлами настроек лучше???
Вообще такой общий способ переназначения мне нравиться тем, что:
1) не требует от автора скрипта вообще никаких усилий по реализации
2) избавляет пользователя от необходимости вникать в особенности реализации всего велопарка настроек (каждый автор ведь всё делает по-своему)
Собственно, если вы как автор предпочитаете настройки/хоткеи в файлах, то это ваше право.
Я лично не вижу препятствий в том, чтобы совмещать оба подхода, а пользователь уж решит как ему удобнее.
Re: Организация макросов, пользовательские хоткеи, настройки
С пользователем дело обстоит так:John Doe wrote: 2) избавляет пользователя от необходимости вникать в особенности реализации всего велопарка настроек (каждый автор ведь всё делает по-своему)
- ставит пользователь Far 3 x64;
- потирая рученки записывает макрос;
- проверяет - макрос работает;
- жмет F11 \ Macro Browser - видит там свой макрос, правда как-то не понятно, но по хоткею видно, что это он (да и других нету);
- жмет F4 и получает "Имя файла недоступно";
- перекособочившись в лице, перезапускает Far и обнаруживает, что макроса больше нет;
- совершенно обоснованно изрекает связку матов в сторону фанатов вской скриптовой фигни типа lua, ибо до этого все работало и было прозрачно даже для школьника. А теперь lua, какие-то недоступные файлы и записанный макрос нигде не сохранился.
Вот такие дела со стороны пользователя, который не понимает, зачем разработчики то и дело добавляют геммороя и портят то, что было почти идеально.
Re: Организация макросов, пользовательские хоткеи, настройки
P.S.: В догонку:
- пользователь - администратор;
- винда - семерка;
- UAC выключен;
- владелец всех файлов/папок на диске - "Администраторы";
- "Все" имеют полные права на эти все файлы.
- пользователь - администратор;
- винда - семерка;
- UAC выключен;
- владелец всех файлов/папок на диске - "Администраторы";
- "Все" имеют полные права на эти все файлы.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Организация макросов, пользовательские хоткеи, настройки
Испокон веков для сохранения записанных макросов надо нажать ShiftF9 чтобы сохранить конфигурацию (если у вас до сих пор отключено автосохранение).
Только в этой теме это оффтопик.
Только в этой теме это оффтопик.
https://t.me/FarManager — Telegram чат
Re: Организация макросов, пользовательские хоткеи, настройки
Что есть НЕ интуитивно.Испокон веков для сохранения записанных макросов надо нажать ShiftF9 чтобы сохранить конфигурацию
И испокон веков я помню запрос на сохранение макроса. А необходимости фиксировать весь конфиг фара после записи мне не приходилось.
Ну и если бы конфиг макросов находился в одном файле, то и сушить голову вопросом "как однозначно переназначать хоткеи" не пришлось бы (ибо все ОДНОзначно в ОДНОМ файле). Причем, кому - диалог, а кто захочет - вручную может править файл (а не 100 файлов). Одни удобства.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Организация макросов, пользовательские хоткеи, настройки
Погуляйте-ка до завтрашнего вечера, может память восстановится.
Или попробуйте тут освежить.
2All
Прошу оффтопик не продолжать.
Или попробуйте тут освежить.
2All
Прошу оффтопик не продолжать.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Организация макросов, пользовательские хоткеи, настройки
Вниманию противников хранения переназначенных клавиш в базе:
Есть и другой вариант, без использования базы — см. давнюю идею о переопределении клавиш посредством Rebind {...} (а недавно подобное пожелание высказывал Max Rusov).
Функция Rebind по употреблению чем-то схожа с Macro {...}.
Допустим, у нас определены такие макросы:
Чтобы их переопределить, достаточно создать другой макрофайл с переопределениями:
Как видно, доступны такие поля:
uid — любой уникальный идентификатор, в данном случае гуид
key — новая клавиша, переопределяющая ту, что была указана в декларации Macro {...}
disabled — возможность просто отключить макрос
Есть и другой вариант, без использования базы — см. давнюю идею о переопределении клавиш посредством Rebind {...} (а недавно подобное пожелание высказывал Max Rusov).
Функция Rebind по употреблению чем-то схожа с Macro {...}.
Допустим, у нас определены такие макросы:
Чтобы их переопределить, достаточно создать другой макрофайл с переопределениями:
Code: Select all
--local Rebind = require'rebind'.Rebind
Rebind {
uid="B25591B0-4E9C-46BC-82F1-259F855F4DBA";
key="CtrlF1"; disabled=true;
}
Rebind {
uid="B8FAEC0A-EC03-4C0B-BF49-D039994459C0";
key="CtrlF1";
}
uid — любой уникальный идентификатор, в данном случае гуид
key — новая клавиша, переопределяющая ту, что была указана в декларации Macro {...}
disabled — возможность просто отключить макрос
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Организация макросов, пользовательские хоткеи, настройки
uid как и сказано выше, может представлять собой любую строку, главное чтобы она была уникальна.
Часто для этого используют гуиды. Кто не в курсе — сгенерировать гуид можно даже из командной строки
Да, только мы ведь уже понаустанавливали стотыщ макросов, и никакие гуиды там не прописаны...
В общем-то в качестве идентификатора макроса можно было бы использовать его описание + имя макрофайла.
Уникальность получившихся идентификаторов можно контролировать, и в случае совпадений выдавать предупреждение.
Для надёжности этот режим стоит по умолчанию запретить, а в случае необходимости активировать с помощью настроек, вот так:
(Потенциально) выдаваемые предупреждения служат для того, чтобы пользователь сразу устранил конфликт.
Но если, допустим, возиться сейчас нет желания, то предупреждения можно временно отключить:
Всё, теперь можно переназначения записать так:
Часто для этого используют гуиды. Кто не в курсе — сгенерировать гуид можно даже из командной строки
Да, только мы ведь уже понаустанавливали стотыщ макросов, и никакие гуиды там не прописаны...
В общем-то в качестве идентификатора макроса можно было бы использовать его описание + имя макрофайла.
Уникальность получившихся идентификаторов можно контролировать, и в случае совпадений выдавать предупреждение.
Для надёжности этот режим стоит по умолчанию запретить, а в случае необходимости активировать с помощью настроек, вот так:
require'rebind'.Setup {auto_uids=true}
(Потенциально) выдаваемые предупреждения служат для того, чтобы пользователь сразу устранил конфликт.
Но если, допустим, возиться сейчас нет желания, то предупреждения можно временно отключить:
require'rebind'.Setup {auto_uids=true,no_warnings=true}
Всё, теперь можно переназначения записать так:
Code: Select all
Rebind {
FileName="test_rebind.lua";
description="test rebind 1";
key="CtrlF1"; disabled=true;
}
Rebind {
FileName="test_rebind.lua";
description="test rebind 2";
key="CtrlF1";
}
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Организация макросов, пользовательские хоткеи, настройки
Ещё один момент: необходимо чтобы переопределения загрузились до соответствующих макросов.
Лучше всего загружать биндинги из _macroinit.lua.
Можно разместить переопределения прямо в нём, но имхо удобнее выделить для них отдельный файл, загрузку которого осуществлять из _macroinit.lua.
Чтобы облегчить задачу — можно предложить функцию LoadBindings(file), если file не указан, то используется scripts\bindings.
...
В общем, всё вышеописанное реализовано, и вроде работает:
P.S.
Чтобы воспользоваться автоматическим назначением уидов надо в файле _macroinit.lua раскоментировать строку
Update:
Новая версия пока здесь: http://forum.farmanager.com/viewtopic.p ... 34#p120234
Лучше всего загружать биндинги из _macroinit.lua.
Можно разместить переопределения прямо в нём, но имхо удобнее выделить для них отдельный файл, загрузку которого осуществлять из _macroinit.lua.
Чтобы облегчить задачу — можно предложить функцию LoadBindings(file), если file не указан, то используется scripts\bindings.
...
В общем, всё вышеописанное реализовано, и вроде работает:
P.S.
Чтобы воспользоваться автоматическим назначением уидов надо в файле _macroinit.lua раскоментировать строку
--rebind.Setup {auto_uids=true,no_warnings=true}
Update:
Новая версия пока здесь: http://forum.farmanager.com/viewtopic.p ... 34#p120234
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Организация макросов, пользовательские хоткеи, настройки
Задача изменения пользовательских шорткатов из общего интерфейса вроде как решена.
Но у скрипта помимо этого могут быть и другие настройки.
Хочу предложить идею общего управления настройками любого скрипта.
В первую очередь, скрипт необходимо однозначно идентифицировать.
И нужна команда для регистрации скрипта.
В идеале это должна быть встроенная команда LuaMacro, но для примера можно сделать всё обычным модулем: А для самого скрипта, требующего настроек, всё может выглядеть так:
Запустив этот пример мы увидим "1, 2", значит наши настройки из модуля подхватились.
В этой иллюстрации настройки a и b жёстко зашиты в модуле.
На практике они могут читаться из пользовательского файла, или из базы LuaMacro.
Преимущество такого подхода: автору скрипта не требуется выдумывать велосипед для задания и хранения настроек.
И пользователю скрипта тоже легче жить, т.к. не приходится вникать в особенности настроек каждого скрипта.
Но у скрипта помимо этого могут быть и другие настройки.
Хочу предложить идею общего управления настройками любого скрипта.
В первую очередь, скрипт необходимо однозначно идентифицировать.
И нужна команда для регистрации скрипта.
В идеале это должна быть встроенная команда LuaMacro, но для примера можно сделать всё обычным модулем: А для самого скрипта, требующего настроек, всё может выглядеть так:
Code: Select all
require"regscript"{uid="xxx"}
a = a or 0 -- defaults
b = b or 0 --
far.Show(a,b) --test
В этой иллюстрации настройки a и b жёстко зашиты в модуле.
На практике они могут читаться из пользовательского файла, или из базы LuaMacro.
Преимущество такого подхода: автору скрипта не требуется выдумывать велосипед для задания и хранения настроек.
И пользователю скрипта тоже легче жить, т.к. не приходится вникать в особенности настроек каждого скрипта.