Идея: скрипты в метасимволах

Здесь обсуждается всё, что касается макросов.
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 »

Навеяно обсуждением на гитхабе: Enhancement: Special Symbol for File Description #65
Там предлагается ввести новый метасимвол !*, в который будет подставляться описание файла.

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

Что если предоставить пользователю возможность самостоятельно запрограммировать нужную функциональность?
Синтаксически это будет как один метасимвол, но с параметрами.

Update: https://bugs.farmanager.com/view.php?id=3681
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Идея: скрипты в метасимволах

Post by Shmuel »

Это по идее не очень сложно реализовать, но 10-20 часов работы просматриваются.
В принципе проверить полезность этой идеи можно прямо сейчас перехватом закрытия диалога "Apply command" (Ctrl-G). Естественно, сначала придумать какой-то новый метасимвол, включающий параметры, сопоставить ему 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 »

Shmuel wrote: Wed 31 Oct, 2018 12:20 проверить полезность этой идеи можно прямо сейчас перехватом закрытия диалога "Apply command" (Ctrl-G)
Не совсем понял, что именно таким образом можно проверить?
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Идея: скрипты в метасимволах

Post by HaRT »

Shmuel wrote: Wed 31 Oct, 2018 12:20 придумать какой-то новый метасимвол, включающий параметры, сопоставить ему Lua-функцию, возвращаемое значение которой будет подставлено в результирующую строку
В качестве отправной точки для обсуждения синтаксиса можно взять аналогичную функциональность из замены в плагине RESearch.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Идея: скрипты в метасимволах

Post by DrKnS »

John Doe wrote: Wed 31 Oct, 2018 11:50Навеяно обсуждением на гитхабе
Забавно, я о чем-то таком тоже думал после этого обсуждения - метасимвол, в который можно будет засунуть вызов плагина по префиксу или ууиду.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Идея: скрипты в метасимволах

Post by Shmuel »

John Doe wrote: Wed 31 Oct, 2018 12:32 Не совсем понял, что именно таким образом можно проверить?
Проверить и продемонстрировать полезность этой идеи, ещё до того, как она будет (если будет) реализована Far Group.
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 »

Shmuel wrote: Wed 31 Oct, 2018 13:18
John Doe wrote: Wed 31 Oct, 2018 12:32 Не совсем понял, что именно таким образом можно проверить?
Проверить и продемонстрировать полезность этой идеи, ещё до того, как она будет (если будет) реализована Far Group.
Так просто не выйдет, ведь подстановка не один раз должна производиться, а для каждого файла.
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 »

Shmuel wrote: Wed 31 Oct, 2018 12:20 придумать какой-то новый метасимвол, включающий параметры
Как вариант, синтаксис может быть похож на используемый в lua при вызове функции:
!*func(arg1,arg2), где аргументы указываются стандартным образом, т.е. строки в "кавычках", или в [[скобках]] (для экранирования).

Символ может быть и другим, можно и уйти от закорючек:
!lua!func(arg1,arg2)
(А при вызове без параметров возможно и скобки не нужны.)

Todo
Наличие аргументов усложняют для парсера задачу вычленения метасимвола из строки, поэтому могут понадобиться какие-то правила экранирования.
Last edited by John Doe on Mon 05 Nov, 2018 15:42, edited 1 time in total.
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 »

Учитывая равную применяемость метасимволов в Ассоциациях (панельных, и командной строки), Меню Пользователя, и Применить Команду, определение может выглядеть так :

Code: Select all

Symbol {
  description="";                 --string (optional)
  name="func";                    --string
  flags="runonce";                --string (optional)
  --or: runonce=true;             --boolean (optional)
  action=function(Params,...)     --function
    return SubstValue             --string, boolean, or nil
  end;
}
  • Поля description и id – опциональные, их значения по умолчанию – пустая строка.
  • name - имя, используемое для вызова функции в метасимволе. Предполагается что оно уникально.
  • flags - флаги, в настоящий момент нужен лишь один [поэтому возможно достаточно логического поля].
    Флаг "runonce" (или "SelectedAtOnce") указывает фару, что при использовании в Применить команду требуется однократный вызов (не нужно повторять команду для каждого выделенного файла отдельно).
    То же самое поведение в настоящий момент мы наблюдаем при использовании метасимволов !@!, !$!, !&, !&~.
  • action - функция, выполняющая подстановку (замену символа на реальное значение).
    [возможно правильнее использовать имя process]
    • Функция получает следующие аргументы:
    • Возвращаемое значение: string, или nil, или false:
Кроме того, если идея получит развитие, то возможны дополнения, например дополнительный запуск функции после обработки нескольких выделенных файлов.
Last edited by John Doe on Thu 01 Nov, 2018 10:58, edited 3 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 »

John Doe wrote: Wed 31 Oct, 2018 13:59 Параметры функций обдумываю
Учитываете ли вы возможность передавать метасимволу не только какие-то данные одного элемента, но и все выделенные элементы (инлайн-списком или путём к файлу-списку)?
Фар есть инструмент, а не нянька. © 2009 DrKnS
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 »

HaRT wrote: Wed 31 Oct, 2018 14:05 Учитываете ли вы возможность передавать метасимволу не только какие-то данные одного элемента, но и все выделенные элементы (инлайн-списком или путём к файлу-списку)?
В том виде, как это сформулировали вы, ничего специально делать не потребуется: если фар будет предварительно раскрывать прочие метасимволы, то можно будет передать эти данные указав аргументом соответствующий метасимвол.

Только врядли это удобно, скрипту проще получить эти элементы самостоятельно, используя апи.

Edit: возможно впоследствии окажется удобным сразу получать данные, как таблицу элементов, но пока этот вопрос не принципиален.
Last edited by John Doe on Wed 31 Oct, 2018 15:58, edited 1 time in total.
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 »

Добавил в спецификацию flags="runonce";
Указал требуемые действия, в зависимости от возвращаемого значения action.
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 »

John Doe wrote: Wed 31 Oct, 2018 15:52 Указал требуемые действия, в зависимости от возвращаемого значения action.
nil === Пропустить: команда не выполняется, соответствующий элемент панели остаётся помеченым.
Ещё одна мысль, делающая обсуждаемую идею вдвойне привлекательной: а ведь так программируемые метасимволы могут служить условиями выполнения ассоциаций!
Напомню, что если файлу сопоставлено несколько ассоциаций, то при запуске показывается меню выбора.
Но сначала отсеиваются ассоциации, в которых присутствуют и не выполняются условия if exist / if defined.

И вот тут вместо этих ограниченных условий могут быть 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 »

Обновил определение, постаравшись учесть максимум ньюансов.

Осталась неопределённость с параметрами action, поскольку мне неизвестно, какие в точности данные об обрабатываемых элементах (и контексте) предоставит фар.

Плюс, в тех местах, где требуетсяжелательна различная реакция фара в зависимости от результата подстановки, нет уверенности что это легко реализовать.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Идея: скрипты в метасимволах

Post by IgorZ »

Предлагаю в список возвращаемых значений добавить true - команду не выполнять, пометку снять: функция уже сама всё сделала.
Может, вместо ... лучше таблицу? В ряде случаев это удобнее.
Все флаги в параметрах, наверное, логично убрать в State.
В итоге, функция будет выглядеть как имя(Item,State,Args)
Для Item, вероятно, наиболее логично использовать tPluginPanelItem.
Post Reply

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