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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 12087
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 153 times

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

Post by John Doe » Wed 31 Oct, 2018 11:50

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

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

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

Update: https://bugs.farmanager.com/view.php?id=3681

Shmuel
Posts: 5615
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 187 times

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

Post by Shmuel » Wed 31 Oct, 2018 12:20

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

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

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

Post by John Doe » Wed 31 Oct, 2018 12:32

Shmuel wrote:
Wed 31 Oct, 2018 12:20
проверить полезность этой идеи можно прямо сейчас перехватом закрытия диалога "Apply command" (Ctrl-G)
Не совсем понял, что именно таким образом можно проверить?

User avatar
HaRT
Moderator
Posts: 8536
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 75 times
Been thanked: 138 times

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

Post by HaRT » Wed 31 Oct, 2018 12:39

Shmuel wrote:
Wed 31 Oct, 2018 12:20
придумать какой-то новый метасимвол, включающий параметры, сопоставить ему Lua-функцию, возвращаемое значение которой будет подставлено в результирующую строку
В качестве отправной точки для обсуждения синтаксиса можно взять аналогичную функциональность из замены в плагине RESearch.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
DrKnS
Posts: 5064
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 5 times
Been thanked: 178 times

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

Post by DrKnS » Wed 31 Oct, 2018 12:46

John Doe wrote:
Wed 31 Oct, 2018 11:50
Навеяно обсуждением на гитхабе
Забавно, я о чем-то таком тоже думал после этого обсуждения - метасимвол, в который можно будет засунуть вызов плагина по префиксу или ууиду.

Shmuel
Posts: 5615
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 187 times

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

Post by Shmuel » Wed 31 Oct, 2018 13:18

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

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

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

Post by John Doe » Wed 31 Oct, 2018 13:21

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

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

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

Post by John Doe » Wed 31 Oct, 2018 13:22

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: 12087
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 153 times

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

Post by John Doe » Wed 31 Oct, 2018 13:59

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

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: 8536
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 75 times
Been thanked: 138 times

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

Post by HaRT » Wed 31 Oct, 2018 14:05

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

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

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

Post by John Doe » Wed 31 Oct, 2018 14:42

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: 12087
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 153 times

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

Post by John Doe » Wed 31 Oct, 2018 15:52

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

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

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

Post by John Doe » Thu 01 Nov, 2018 08:59

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

И вот тут вместо этих ограниченных условий могут быть lua-скрипты, определяемые метасимволами.

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

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

Post by John Doe » Thu 01 Nov, 2018 11:46

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

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

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

IgorZ
Posts: 569
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 32 times

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

Post by IgorZ » Fri 02 Nov, 2018 06:04

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

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

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

Post by John Doe » Fri 02 Nov, 2018 08:25

IgorZ wrote:
Fri 02 Nov, 2018 06:04
Предлагаю в список возвращаемых значений добавить true - команду не выполнять, пометку снять: функция уже сама всё сделала.
Подскажите в каком сценарии это может быть полезно.
IgorZ wrote:
Fri 02 Nov, 2018 06:04
Может, вместо ... лучше таблицу?
... соответствует тому, как аргументы представлены при использовании метасимвола.
Это кстати тоже вполне вопрос для обсуждения, ведь можно и !lua!func {arg1=val1,arg2=val2} (имхо избыточно, но решать всё равно не мне).
IgorZ wrote:
Fri 02 Nov, 2018 06:04
В ряде случаев это удобнее.
arg = {...}.
IgorZ wrote:
Fri 02 Nov, 2018 06:04
Все флаги в параметрах, наверное, логично убрать в State.
Поясните.
IgorZ wrote:
Fri 02 Nov, 2018 06:04
Для Item, вероятно, наиболее логично использовать tPluginPanelItem.
Да, но см. fnparce.cpp: я вовсе не уверен что эта информация там доступна.
Также вспомните, что на плагиновых панелях Применить Команду вообще не реализовано, а при использовании ассоциаций элемент распаковывается во временную папку, и это уже совсем не tPluginPanelItem. Edit
При использовании ассоциаций из командной строки аналогично, элемент не принадлежит панели.
Last edited by John Doe on Tue 13 Nov, 2018 12:27, edited 1 time in total.

Post Reply

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