View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002021 | Wishes | Macro | public | 2012-02-15 11:44 | 2014-06-10 12:23 |
Reporter | JohnDoe | Assigned To | |||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | closed | Resolution | duplicate | ||
Product Version | 3.0 | ||||
Summary | 0002021: Макрофункция 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 | ||||
Tags | No tags attached. | ||||
Build | 0 | ||||
|
Данная функция перекрывает предлагаемую в тикете 0001903 функцию Plugin.Prefix() |
|
> Допустимы префиксы плагинов, но только если активны панели. Почему такое ограничение "только если активны панели"? Вызывающий вызывает, скажем, из редактора по префиксу. Что в этом не так? Если он вызывает при этом запуск панели, то он сам криворук. Есть масса более простых способов проявить криворукость, чем Exec с префиксом из редактора. Но если плагин по этой команде предназначен делать что-то в редакторе, то все законно и полезно. И необязательно пилить UI для F1 | Plugin | MyCommmand (команда еще без параметров, то есть их придется еще несколько, скажем, напилить или с дополнительными диалогами для уточнения параметров). А можно всего лишь: Exec("prefix:command param1 param2 ...") Почему лишать этой возможности? Ну и что, что из редактора или еще откуда не из панелей? И это не из пальца высосан сценарий. Именно так через префикс и callplugin сейчас работает FarNet и конкретно, например, его модуль RightControl, который по префиксу выполняет работу в 3-х областях - редактор, диалоги, комстрока. |
|
>Почему такое ограничение "только если активны панели"? Я попытался сформулировать то, что устроит всех, иначе не видать нам этой функции до пришествия. Ваше замечание справедливо, но это спорный вопрос, требующий отдельного обсуждения . Предлагаю обсуждать детали на форуме (ссылка выше), а тут только подведём итоги. Потому как иначе никому из разработчиков не захочется вникать в наши летописи (проверено). |
|
> Именно так через префикс и callplugin сейчас работает FarNet Хм... не верю. Через callplugin да, и его вроде пока никто не убивает. А как _сейчас_ ты можешь вызвать FarNet из редактора через префикс - я не представляю. ИМХО - префикс только в панелях, иначе бардак. Но и Callplugin, в принципе, та еще дыра. Им можно вызвать плагин, который на него не рассчитан. Раньше все было "четко" по SysID, а сейчас-то гуид у всех есть... |
|
> Хм... не верю. Не, ну с точки зрения Фара это не через префикс, конечно. Но я говорю про концепцию, как таковую. В Фарнет все это работает через префиксы *модулей*, все равно где. Это оказалось просто и красиво, проверено временем, ничего лучшего придумывать просто не понадобилось. Так же могло бы быть и в Фаре, а почему нет, если где-то технология обкатана и работоспособна. Фарнету это все равно, ибо там это уже сделано. Предлагал я это не с Фарнетом на прицеле, а в пользу нативным плагинам. |
|
> Но и Callplugin, в принципе, та еще дыра. Им можно вызвать плагин, который на него не рассчитан. Пользователь хотел и вызвал, что в этом плохого? Для сравнения - хотел и сделал ShiftDel на папке, которая для удаления не предназначена - Фар в этом не виноват. Если пользователь создал макрос с callplugin, который зовет плагин по guid плагина, который для этого не предназначен - это надо еще очень постараться сделать. Вероятность, что это делается по ошибке, мизерна. А делать это как-то "защищенно" будет менее удобно для пользование, сложней для написания. |
|
Но я согласен, что эта концепция вызова по префиксу откуда угодно - новая, непривычная. Она не была бы такой необычной, если в Фаре можно было бы вызывать команды откуда угодно (и иметь юзер меню, как сдедствие, например). А что в этом странного? PowerShellFar, например, позволяет набрать и выполнить команду где угодно, в редакторе, диалоге, вьюере. Это удобно. Не надо выходить из диалогов, прерывая работу, переключаться в панели, и т.п. Да, не все команды имеют смысл в некоторых областях. Но юзер их и не вызывает. |
|
>Вероятность, что это делается по ошибке, мизерна Есть же макросы и посложней, где пользователь может элементарно просчитаться. Пример: макрос открывает файл, и запускает плагин. Но если во время открытия файла произойдёт ошибка - значит плагин будет вызван не вовремя. В идеале было бы предусмотреть защиту от дурака, может же плагин как-то обозначить флагами откуда его можно звать а откуда нет. Но мы сильно отдалились от темы - почему бы callplugin не обсудить на форуме? |
|
Сейчас есть две функции, запускающие внешние утилиты: os.execute (не юникодная) и win.ShellExecute (юникодная). Актуален ли данный тикет? |
|
Lua снимает большую часть потребностей, однако не все. Допустим даже убрать из условий задачи префиксы плагинов и метасимволы. Всё ещё не хватает следующего: - Поиск запускаемого файла в нужных местах (включая AppPath и алиасы) - Осуществление запуска со штатным гашением панелей, чтобы вывод был доступен впоследствии в буфере экрана (под панелями). Наверно можно это всё как-то эмулировать, дублируя логику фара, но не знаю как, и не очень это правильно. |
|
Пример недостаточности встроенных функций запуска. DOSKEY /MACROFILE = "C:\APPs\Far3\Profile\Alias\alias.doskey" Команда, загружающая консольные алиасы, выполняется у меня макросом при старте фара, в панелях. os.execute не юникодная, а win.ShellExecute не срабатывает (нужен ShellExecuteEx). Конечно имея FFI можно сделать всё, но и тут как минимум надо знать C и понимать WinAPI. |
|
Тикет был сформулирован до lua, и сейчас уже нецелесообразно его реализовывать в исходной формулировке. Подводя итоги: - запуск плагинов по префиксу: 0002381 - запуск приложений в текущей консоли: 0002700 - получение вывода программы: io.popen - гашение панелей: panel.GetUserScreen/SetUserScreen Закрываем. |
Date Modified | Username | Field | Change |
---|---|---|---|
2012-02-15 11:44 | JohnDoe | New Issue | |
2012-02-15 11:49 | JohnDoe | Note Added: 0008577 | |
2012-02-15 12:46 | NightRoman | Note Added: 0008578 | |
2012-02-15 12:52 | NightRoman | Note Edited: 0008578 | |
2012-02-15 14:22 | JohnDoe | Note Added: 0008581 | |
2012-02-15 14:23 | JohnDoe | Note Edited: 0008581 | |
2012-02-15 14:24 | JohnDoe | Note Edited: 0008581 | |
2012-02-15 18:54 | Maximus | Note Added: 0008592 | |
2012-02-15 18:56 | Maximus | Note Edited: 0008592 | |
2012-02-15 19:09 | NightRoman | Note Added: 0008594 | |
2012-02-15 19:22 | NightRoman | Note Added: 0008595 | |
2012-02-15 19:39 | NightRoman | Note Added: 0008596 | |
2012-02-15 19:48 | JohnDoe | Note Added: 0008597 | |
2013-05-30 13:26 | shmuel | Note Added: 0011048 | |
2013-05-30 14:03 | JohnDoe | Note Added: 0011049 | |
2013-05-30 14:11 | JohnDoe | Note Added: 0011051 | |
2014-05-27 08:56 | JohnDoe | Note Edited: 0011051 | |
2014-06-10 11:41 | JohnDoe | Note Added: 0012495 | |
2014-06-10 12:23 | shmuel | Build | => 0 |
2014-06-10 12:23 | shmuel | Status | new => closed |
2014-06-10 12:23 | shmuel | Resolution | open => duplicate |