View Issue Details

IDProjectCategoryView StatusLast Update
0002021WishesMacropublic2014-06-10 15:23
ReporterJohnDoeAssigned To 
PrioritynormalSeverityfeatureReproducibilityN/A
Status closedResolutionduplicate 
Product Version3.0 
Target VersionFixed in Version 
Summary0002021: Макрофункция Exec (для запуска приложений и плагинов)
DescriptionЭта функция позволит скрестить возможности макроязыка с возможностями сотен внешних утилит.
Нужна возможность прямого запуска, без необходимости выходить в панели и "печатать" командную строку.

Предлагается сделать это в виде функции наподобие:
Errorlevel=Exec(Cmdline,[Options,...])
Steps To Reproduce--
Errollevel - код возврата, в случае успеха >=0. Внутренние ошибки <0.

--
Cmdline - строка как если бы она была запущена прямо из командной строки (в панелях).
Допустимы префиксы плагинов, но только если активны панели.
Опционально - обработка метасимволов.

--
Options ещё требуется обсудить. Хотелось бы иметь возможность указывать режимы запуска, например гасить ли панели, скрывать ли вывод, и др.
Можно оставить реализацию этого на будущее, т.к. и без опций функция востребована.
Additional InformationОбсуждение на форуме: http://forum.farmanager.com/viewtopic.php?p=76719#p76719
TagsNo tags attached.
Build0

Activities

JohnDoe

2012-02-15 15:49

updater   bugnote:0008577

Данная функция перекрывает предлагаемую в тикете 0001903 функцию Plugin.Prefix()

NightRoman

2012-02-15 16:46

reporter   bugnote:0008578

Last edited: 2012-02-15 16:52

View 2 revisions

> Допустимы префиксы плагинов, но только если активны панели.
Почему такое ограничение "только если активны панели"?

Вызывающий вызывает, скажем, из редактора по префиксу. Что в этом не так? Если он вызывает при этом запуск панели, то он сам криворук. Есть масса более простых способов проявить криворукость, чем Exec с префиксом из редактора.

Но если плагин по этой команде предназначен делать что-то в редакторе, то все законно и полезно. И необязательно пилить UI для F1 | Plugin | MyCommmand (команда еще без параметров, то есть их придется еще несколько, скажем, напилить или с дополнительными диалогами для уточнения параметров).

А можно всего лишь:
Exec("prefix:command param1 param2 ...")
Почему лишать этой возможности? Ну и что, что из редактора или еще откуда не из панелей?

И это не из пальца высосан сценарий. Именно так через префикс и callplugin сейчас работает FarNet и конкретно, например, его модуль RightControl, который по префиксу выполняет работу в 3-х областях - редактор, диалоги, комстрока.

JohnDoe

2012-02-15 18:22

updater   bugnote:0008581

Last edited: 2012-02-15 18:24

View 3 revisions

>Почему такое ограничение "только если активны панели"?
Я попытался сформулировать то, что устроит всех, иначе не видать нам этой функции до пришествия.
Ваше замечание справедливо, но это спорный вопрос, требующий отдельного обсуждения .
Предлагаю обсуждать детали на форуме (ссылка выше), а тут только подведём итоги.
Потому как иначе никому из разработчиков не захочется вникать в наши летописи (проверено).

Maximus

2012-02-15 22:54

reporter   bugnote:0008592

Last edited: 2012-02-15 22:56

View 2 revisions

> Именно так через префикс и callplugin сейчас работает FarNet
Хм... не верю.
Через callplugin да, и его вроде пока никто не убивает.
А как _сейчас_ ты можешь вызвать FarNet из редактора через префикс - я не представляю.

ИМХО - префикс только в панелях, иначе бардак.
Но и Callplugin, в принципе, та еще дыра. Им можно вызвать плагин, который на него не рассчитан. Раньше все было "четко" по SysID, а сейчас-то гуид у всех есть...

NightRoman

2012-02-15 23:09

reporter   bugnote:0008594

> Хм... не верю.
Не, ну с точки зрения Фара это не через префикс, конечно. Но я говорю про концепцию, как таковую. В Фарнет все это работает через префиксы *модулей*, все равно где. Это оказалось просто и красиво, проверено временем, ничего лучшего придумывать просто не понадобилось.

Так же могло бы быть и в Фаре, а почему нет, если где-то технология обкатана и работоспособна.

Фарнету это все равно, ибо там это уже сделано. Предлагал я это не с Фарнетом на прицеле, а в пользу нативным плагинам.

NightRoman

2012-02-15 23:22

reporter   bugnote:0008595

> Но и Callplugin, в принципе, та еще дыра. Им можно вызвать плагин, который на него не рассчитан.
Пользователь хотел и вызвал, что в этом плохого? Для сравнения - хотел и сделал ShiftDel на папке, которая для удаления не предназначена - Фар в этом не виноват.

Если пользователь создал макрос с callplugin, который зовет плагин по guid плагина, который для этого не предназначен - это надо еще очень постараться сделать. Вероятность, что это делается по ошибке, мизерна. А делать это как-то "защищенно" будет менее удобно для пользование, сложней для написания.

NightRoman

2012-02-15 23:39

reporter   bugnote:0008596

Но я согласен, что эта концепция вызова по префиксу откуда угодно - новая, непривычная. Она не была бы такой необычной, если в Фаре можно было бы вызывать команды откуда угодно (и иметь юзер меню, как сдедствие, например). А что в этом странного? PowerShellFar, например, позволяет набрать и выполнить команду где угодно, в редакторе, диалоге, вьюере. Это удобно. Не надо выходить из диалогов, прерывая работу, переключаться в панели, и т.п. Да, не все команды имеют смысл в некоторых областях. Но юзер их и не вызывает.

JohnDoe

2012-02-15 23:48

updater   bugnote:0008597

>Вероятность, что это делается по ошибке, мизерна
Есть же макросы и посложней, где пользователь может элементарно просчитаться.
Пример: макрос открывает файл, и запускает плагин. Но если во время открытия файла произойдёт ошибка - значит плагин будет вызван не вовремя.

В идеале было бы предусмотреть защиту от дурака, может же плагин как-то обозначить флагами откуда его можно звать а откуда нет.

Но мы сильно отдалились от темы - почему бы callplugin не обсудить на форуме?

shmuel

2013-05-30 16:26

developer   bugnote:0011048

Сейчас есть две функции, запускающие внешние утилиты: os.execute (не юникодная) и win.ShellExecute (юникодная). Актуален ли данный тикет?

JohnDoe

2013-05-30 17:03

updater   bugnote:0011049

Lua снимает большую часть потребностей, однако не все.
Допустим даже убрать из условий задачи префиксы плагинов и метасимволы.

Всё ещё не хватает следующего:
- Поиск запускаемого файла в нужных местах (включая AppPath и алиасы)
- Осуществление запуска со штатным гашением панелей, чтобы вывод был доступен впоследствии в буфере экрана (под панелями).

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

JohnDoe

2013-05-30 17:11

updater   bugnote:0011051

Last edited: 2014-05-27 11:56

View 2 revisions

Пример недостаточности встроенных функций запуска.
DOSKEY /MACROFILE = "C:\APPs\Far3\Profile\Alias\alias.doskey"

Команда, загружающая консольные алиасы, выполняется у меня макросом при старте фара, в панелях.

os.execute не юникодная, а win.ShellExecute не срабатывает (нужен ShellExecuteEx).
Конечно имея FFI можно сделать всё, но и тут как минимум надо знать C и понимать WinAPI.

JohnDoe

2014-06-10 14:41

updater   bugnote:0012495

Тикет был сформулирован до lua, и сейчас уже нецелесообразно его реализовывать в исходной формулировке.

Подводя итоги:
- запуск плагинов по префиксу: 0002381
- запуск приложений в текущей консоли: 0002700
- получение вывода программы: io.popen
- гашение панелей: panel.GetUserScreen/SetUserScreen

Закрываем.

Issue History

Date Modified Username Field Change
2012-02-15 15:44 JohnDoe New Issue
2012-02-15 15:49 JohnDoe Note Added: 0008577
2012-02-15 16:46 NightRoman Note Added: 0008578
2012-02-15 16:52 NightRoman Note Edited: 0008578 View Revisions
2012-02-15 18:22 JohnDoe Note Added: 0008581
2012-02-15 18:23 JohnDoe Note Edited: 0008581 View Revisions
2012-02-15 18:24 JohnDoe Note Edited: 0008581 View Revisions
2012-02-15 22:54 Maximus Note Added: 0008592
2012-02-15 22:56 Maximus Note Edited: 0008592 View Revisions
2012-02-15 23:09 NightRoman Note Added: 0008594
2012-02-15 23:22 NightRoman Note Added: 0008595
2012-02-15 23:39 NightRoman Note Added: 0008596
2012-02-15 23:48 JohnDoe Note Added: 0008597
2013-05-30 16:26 shmuel Note Added: 0011048
2013-05-30 17:03 JohnDoe Note Added: 0011049
2013-05-30 17:11 JohnDoe Note Added: 0011051
2014-05-27 11:56 JohnDoe Note Edited: 0011051 View Revisions
2014-06-10 14:41 JohnDoe Note Added: 0012495
2014-06-10 15:23 shmuel Build => 0
2014-06-10 15:23 shmuel Status new => closed
2014-06-10 15:23 shmuel Resolution open => duplicate