Организация макросов, пользовательские хоткеи, настройки, …

Здесь обсуждается всё, что касается макросов.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Организация макросов, пользовательские хоткеи, настройки

Post by Shmuel »

Latest post of the previous page:

Простейший вариант как бы на поверхности: назначение макросу GUID'а (потребует поддержки со стороны LuaMacro; сделать это очень просто).
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Организация макросов, пользовательские хоткеи, настройки

Post by John Doe »

Имеется в виду дополнительное (опциональное?) поле в структуре Macro, о котором пользователь должен позаботиться сам (или спецмакросом)?
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Организация макросов, пользовательские хоткеи, настройки

Post by Shmuel »

Дополнительное опциональное поле, заполняется автором макроса, не изменяется при обновлениях макроса.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Re: Организация макросов, пользовательские хоткеи, настройки

Post by IgorZ »

John Doe wrote:
John Doe wrote:В Macro Browser alt. давно реализована возможность переназначения (нажатием CtrlShiftF11 в списке макросов).
Правда не вижу нигде чтобы я это анонсировал... Вероятно просто не довёл до конца всё задуманное...
Так и есть, посмотрел в черновиках. Конечной целью была как раз такая система, где для изменения хоткеев любого макроса не нужно предпринимать вообще никаких специальных действий в коде.

Просто открываешь Macro Browser, выбираешь нужный макрос, и задаёшь пользовательское сочетание клавиш, оно сохраняется в базе и используется вместо того что указано в файле.
Что самое забавное: в последнее время тоже серьёзно обдумываю реализацию этой идеи. Видимо, данное развитие мысли закономерно.
Shmuel wrote:Дополнительное опциональное поле, заполняется автором макроса, не изменяется при обновлениях макроса.
Идея очень вкусная, я поддерживаю всеми руками. Смущает один нюанс: как быть с теми макросами, для которых гуид не задан? Навскидку, конечно, можно так: <полное имя файла с макросом, включая путь, с поддержкой переменных окружения>:<смещение до начала определения макроса в файле>. Но это тоже не совсем удобно. И не будет работать для макросов не из файлов, хотя это уже, наверное, не критично.

Кстати, можно ли добавить следующую функциональность: при чтении макросов из файла сохранять смещение до начала его определения, чтобы затем получать его через debug.getinfo() или аналогичным способом, как это делается для функций?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Организация макросов, пользовательские хоткеи, настройки

Post by John Doe »

IgorZ wrote:Смущает один нюанс: как быть с теми макросами, для которых гуид не задан?
Ничего не делать.
IgorZ wrote:Кстати, можно ли добавить следующую функциональность: при чтении макросов из файла сохранять смещение до начала его определения,
Функциональность, о которой мы говорим, может быть реализована и без каких-либо изменений в LuaMacro.
Фокус в том, что функцию Macro можно подменить на собственную (идею можно посмотреть в MacroBrowserAlt).
А из собственной функции мы легко можем получить место её вызова - debug.getinfo(2).currentline - это и будет позиция начала определения макроса.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Организация макросов, пользовательские хоткеи, настройки

Post by John Doe »

Вот рабочий прототип модуля, реализующего 'лёгкое переназначение' клавиш, не затрагивая файлы макросов:
Этот модуль должен инициализироваться до всех определений макросов, поэтому его загрузку необходимо прописать в файле _macroinit.lua: require'rebind'

Для того, чтобы макрос можно было переназначить, у него должен быть задан идентификатор (поле guid). Например:
  1. Macro { description="test rebind 1";
  2.  
  3.   area="Shell"; key="F1"; guid="5D3CBA90-F32D-433C-B016-9BB4AF96FAC1";
  4.  
  5.   action=function() msgbox"just test" end;
  6.  
  7. }
Вот и всё. Для переназначения клавиш служит функция RebindMacro, возвращаемая в таблице модуля.
Запустить можно даже из командной строки:

Code: Select all

lm:post require"rebind".RebindMacro"5D3CBA90-F32D-433C-B016-9BB4AF96FAC1"
Разумеется это только для демонстрации, а чтобы стало по-настоящему удобно переназначать клавиши необходимо сделать ещё один шаг — внедрить функцию переназначения в какой-либо из существующих MacroBrowser'ов.

P.S.
IgorZ
Обратите внимание, теперь в таблице макроса, получаемой по mf.GetMacroCopy, присутствует поле defline, в котором хранится номер строки, с которой начинается определение макроса.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Организация макросов, пользовательские хоткеи, настройки

Post by John Doe »

SUSim wrote:Кстати, guid'ы к макросам делать?
Есть только прототип этой функциональности. И автор LuaMacro пока не давал комментариев на этот счёт, т.е. будет ли нечто подобное 'из коробки' — неизвестно.
Как бы там ни было, но в своём Macro Browser alt. я обязательно реализую такое 'лёгкое переназначение'.
(Хотя в качестве идентификаторов я бы предпочёл произвольные строки, а не гуиды)
SUSim wrote:или подход с отдельными файлами настроек лучше???
Подход, предлагаемый выше, решает только вопрос с переназначением клавиш, об остальных настройках надо заботиться самостоятельно, как и раньше.

Вообще такой общий способ переназначения мне нравиться тем, что:
1) не требует от автора скрипта вообще никаких усилий по реализации
2) избавляет пользователя от необходимости вникать в особенности реализации всего велопарка настроек (каждый автор ведь всё делает по-своему)

Собственно, если вы как автор предпочитаете настройки/хоткеи в файлах, то это ваше право.
Я лично не вижу препятствий в том, чтобы совмещать оба подхода, а пользователь уж решит как ему удобнее.
edd_k
Posts: 3
Joined: Thu 26 Dec, 2013 17:58

Re: Организация макросов, пользовательские хоткеи, настройки

Post by edd_k »

John Doe wrote: 2) избавляет пользователя от необходимости вникать в особенности реализации всего велопарка настроек (каждый автор ведь всё делает по-своему)
С пользователем дело обстоит так:
- ставит пользователь Far 3 x64;
- потирая рученки записывает макрос;
- проверяет - макрос работает;
- жмет F11 \ Macro Browser - видит там свой макрос, правда как-то не понятно, но по хоткею видно, что это он (да и других нету);
- жмет F4 и получает "Имя файла недоступно";
- перекособочившись в лице, перезапускает Far и обнаруживает, что макроса больше нет;
- совершенно обоснованно изрекает связку матов в сторону фанатов вской скриптовой фигни типа lua, ибо до этого все работало и было прозрачно даже для школьника. А теперь lua, какие-то недоступные файлы и записанный макрос нигде не сохранился.

Вот такие дела со стороны пользователя, который не понимает, зачем разработчики то и дело добавляют геммороя и портят то, что было почти идеально.
edd_k
Posts: 3
Joined: Thu 26 Dec, 2013 17:58

Re: Организация макросов, пользовательские хоткеи, настройки

Post by edd_k »

P.S.: В догонку:
- пользователь - администратор;
- винда - семерка;
- UAC выключен;
- владелец всех файлов/папок на диске - "Администраторы";
- "Все" имеют полные права на эти все файлы.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Организация макросов, пользовательские хоткеи, настройки

Post by John Doe »

Испокон веков для сохранения записанных макросов надо нажать ShiftF9 чтобы сохранить конфигурацию (если у вас до сих пор отключено автосохранение).
Только в этой теме это оффтопик.
https://t.me/FarManager — Telegram чат
edd_k
Posts: 3
Joined: Thu 26 Dec, 2013 17:58

Re: Организация макросов, пользовательские хоткеи, настройки

Post by edd_k »

Испокон веков для сохранения записанных макросов надо нажать ShiftF9 чтобы сохранить конфигурацию
Что есть НЕ интуитивно.

И испокон веков я помню запрос на сохранение макроса. А необходимости фиксировать весь конфиг фара после записи мне не приходилось.

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

Re: Организация макросов, пользовательские хоткеи, настройки

Post by John Doe »

Погуляйте-ка до завтрашнего вечера, может память восстановится.
Или попробуйте тут освежить.

2All
Прошу оффтопик не продолжать.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Организация макросов, пользовательские хоткеи, настройки

Post by John Doe »

Вниманию противников хранения переназначенных клавиш в базе:
Есть и другой вариант, без использования базы — см. давнюю идею о переопределении клавиш посредством 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 — возможность просто отключить макрос
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Организация макросов, пользовательские хоткеи, настройки

Post by John Doe »

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";
}
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Организация макросов, пользовательские хоткеи, настройки

Post by John Doe »

Ещё один момент: необходимо чтобы переопределения загрузились до соответствующих макросов.
Лучше всего загружать биндинги из _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
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 »

Задача изменения пользовательских шорткатов из общего интерфейса вроде как решена.
Но у скрипта помимо этого могут быть и другие настройки.
Хочу предложить идею общего управления настройками любого скрипта.

В первую очередь, скрипт необходимо однозначно идентифицировать.
И нужна команда для регистрации скрипта.
В идеале это должна быть встроенная команда LuaMacro, но для примера можно сделать всё обычным модулем:
  1. local settings = { --sample settings for script "xxx"
  2.  
  3.   xxx = {a=1,b=2}
  4.  
  5. }
  6.  
  7. local scripts = {}
  8.  
  9. local function regscript(t,FullPath)
  10.  
  11.   if not type(t)=="table" then return end
  12.  
  13.   if not t.uid then return end --check if uid is present
  14.  
  15.   if scripts[t.uid] then return end --check if uid is unique
  16.  
  17.   t.FileName = FullPath
  18.  
  19.   scripts[t.uid] = t
  20.  
  21.   local e = settings[t.uid]
  22.  
  23.   if e then
  24.  
  25.     local env = getfenv(2)
  26.  
  27.     le(env)
  28.  
  29.     for k,v in pairs(e) do
  30.  
  31.       if env[k]==nil then
  32.  
  33.         env[k] = v
  34.  
  35.       end
  36.  
  37.     end
  38.  
  39.   end
  40.  
  41. end
  42.  
  43. return regscript
А для самого скрипта, требующего настроек, всё может выглядеть так:

Code: Select all

require"regscript"{uid="xxx"}

a = a or 0  -- defaults
b = b or 0  --

far.Show(a,b) --test
Запустив этот пример мы увидим "1, 2", значит наши настройки из модуля подхватились.

В этой иллюстрации настройки a и b жёстко зашиты в модуле.
На практике они могут читаться из пользовательского файла, или из базы LuaMacro.

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

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