FarNet — плагин для написания плагинов на .NET языках

Здесь можно обсудить ваш любимый плагин.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

Latest post of the previous page:

Посмотрел, что понадобится, чтобы добавить эти события. Работы много, даже если делать, тупо в лоб продублировав Фар АПИ, а не в .NET стиле, как это сделано в полном объеме для диалогов, создаваемых модулями Фарнет. Так что не буду торопиться с этой задачей, она слишком узко специализированная, нужна только для перехватов чужих диалогов. Для таких задач можно и обычный нативный плагин написать или воспользоваться Луа макросами. Причем, в них можно реализовать именно перехват события в чужом диалоге и сделать первичные проверки на гуиды и т.п., а потом уже перевызвать модуль Фарнета и реально обработку сделать там, написав на .NET и с использованием инструментов Фарнет для диалогов (в отличие от событий, они есть для любых Фар диалогов, а не только созданных в Фарнет).

Наверное, в идеале в самом Фарнет события для чужих диалогов не помешали бы, раз в Фар они есть. Но сложность (скорей, объем) реализации не оправдывает пока юз-кейсы, по-моему. Тем более, способы решения есть другие, перевызов через макрос Луа, например. Такого рода перевызовы, кстати, сплошь и рядом используются, особенно в модуле PowerShellFar для вызова PowerShell скриптов через Луа. Так что это нормальная рабочая практика.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

P.S. В подходе "макрос ловит и первично обратывает событие + вызов модуля из этого макроса" есть и бонус - модуль не обязан быть презагружаемым. А вот если бы в Фарнет были события для чужих диалогов, то модуль, использующий их, должен был бы быть презагружаемым, чтобы иметь возможность подписаться на эти события при загрузке. В итоге такой модуль будет грузиться всегда, даже если реально работать не будет.
LWhisper
Posts: 7
Joined: Sat 03 Aug, 2013 18:11

Re: FarNet — плагин для написания плагинов на .NET языках

Post by LWhisper »

Ну, по идее, при полноценной реализации (объемной, о которой ты говорил), как раз событие перевого открытия диалога и будет инциализировать загрузку необходимого для работы с ним модуля. :)
В остальном - понял, спасибо. Согласен, что нецелесообразно пока. А что касается хелпа - готовые примеры лучший хелп. Так что хотелось бы, конечно, именно больше примеров различных специализированных модулей. Если всё-таки освою FarNet (будет повод) - непременно займусь. :)
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

С наступающим Новым Годом, разработчики, плагинописатели, и пользователи FarNet и модулей! Творческих успехов всем и, вообще, пусть все будет хорошо! И даже немного лучше.

Несколько пояснений к последнему обновлению FarNet (5.0.39) и PowerShellFar (5.0.57). Как видно из анонсов, опубликованные пакеты (released packages) переехали на сервис NuGet. Причина: гуглекод останавливает подобный сервис через пару недель. Иначе говоря, нельзя будет выкладывать архивы для скачивания на гуглекоде.

Выбирал из трех альтернатив - PlugRing ("рекомендуемый стандарт" для плагинов), Google Drive (рекомендуемый гуглем вместо отвалившегося сервиса), и NuGet. Остановился на последнем, потому что он он позволяет автоматизировать абсолютно все - закачку, скачку, получение информации по имеющимся пакетам, и т.п. Кроме того, этот сервис специально заточен для выкладывания пакетов на публику, с неплохим API и, по опыту, достаточно надежный.

Первый блин - скрипт Update-FarPackage.ps1 для установки или обновления FarNet, его модулей (пока только PowerShellFar), любых других модулей (остальные скоро тоже переедут), и даже обычных плагинов, если кто-то надумает оформить их в виде NuGet пакетов определенного простого формата. Комом этот блин или нет? Используйте, смотрите, как работает, жалуйтесь на недостатки, предлагайте, как улучшить.

P.S. Скрипт лучше скопипастить в новый Update-FarPackage.ps1, а не скачать. Можно и скачать, но тогда нужно разблокировать его после скачивания (RMB > Properties > Unblock).
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

Скрипт Update-FarPackage.ps1 для обновления пакетов для Фара (FarNet, модули или даже обычные плагины) был переработан - упрощены параметры и расширены возможности. Упрощена требуемая структура самих пакетов. А также распаковка делается в десятки раз быстрее.

Те, кто уже успел поработать с первой версией могут удалить папку "%LOCALAPPDATA%\FarPackages", так как nupkg файлы теперь копятся в стандартном кеше NuGet "%LOCALAPPDATA%\NuGet\Cache", а распакованные папки пакетов находятся либо в текущей папке, либо в папке, заданной параметром OutputDirectory.

Есть ли какие предложения или замечания по работе скрипта обновления?

Например, можно добавить поддержку удаления установленных пакетов из Фара. Пакет может идти со специальным скриптом типа Uninstall-Xyz.ps1. А при обновлении опционально можно вызывать этот скрипт из уже установленного пакета перед обновлением (если имеется). Плюсы - в установленных пакетах не накапливаются старые файлы, которые удалены/переименованы в поставке (обновление же просто накатывает поверх и ничего не удаляет само). Мне самому это не особо надо, но если такая фича нужна, то могу подумать, как добавить поддержку в Update-FarPackage.ps1 и скрипты Uninstall-Xyz, куда следует.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

Скрипт Update-FarPackage.ps1 обновлен. В основном, мелкие улучшения. Из крупного - добавлен ключ Remove, который позволяет удалить установленные файлы. Вместо введения специальных скриптов удаления пакетов решено сделать гораздо проще. Remove используется вместе с Path, где Path - это последний скачанный пакет (должен быть в папке кеша, куда качаются пакеты). Скрипт с Remove делает почти то же самое, что и при обновлении, только не копирует файлы из пакета, а наоборот удаляет соответствующие файлы из FarHome. Образовавшиеся пустые папки удаляются тоже. Если были добавлены файлы, то они не удалятся. Думается, такой способ прост и эффективен для большинства случаев. Сложные случаи можно будет обдумать отдельно.

Примечание. Пока это еще не идеальное решение, вижу некоторые изъяны. Но все равно полезная фича, если правильно использовать.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

Скрипт Update-FarPackage.ps1 обновлен. Реализовано автоматическое обновление всех установленных пакетов в Фаре и изменен принцип их удаления, в частности, можно удалять и без наличия исходного файла nupkg.

Как это работает. При обновлении пакета в FarHome кроме файлов пакета генерируется дополнительный файл "Update.<Id>.info", например, для Фарнет это будет "Update.FarNet.info". Там хранится все, что нужно для авто-обновления или удаления. Лучше файлы эти не трогать, но для любознательных: там построчно хранятся: Source, Version, которые нужны для обновления, и список установленных файлов, которые нужны для авто-чистки.

При авто-обновлении проверяются все файлы "Update.<Id>.info", откуда берутся Id, Version, Source. С этой инфой запрашивается новейшая версия для Id из Source. Если она такая же как и Version, то ничего не делается. Если она другая, то выкачивается (если не в кеше) и распаковывается новая версия. Если это успешно удалось, то старые файлы пакета удаляются (относительные пути берутся из "Update.<Id>.info") и новые файлы копируются. Таким образом, после обновления никакого мусора не остается, если в пакетах что-то удаляется или переименовывается.

Для уже установленных пакетов это работать не будет, потому что у них еще нет файлов "Update.*.info". Чтобы их получить, просто обновите пакеты еще раз новым скриптом (по идее, ничего качаться не должно, все уже и так есть в кеше, где лучше хранить пару последних версий "для отката"). Как только файлы "Update.*.info" созданы, установленные пакеты готовы для автоматических обновлений, будущих, конечно.

Автоматическое обновление запускается простой командой:

Code: Select all

Update-FarPackage -FarHome <path>
Почему не используется %FARHOME%? Потому что желательно это делать при закрытом Фаре из отдельной консоли PowerShell. Иначе обновление может остановиться где-то в середине процесса (файлы залочены), что нежелательно. Повторный запуск при закрытом Фаре, скорей всего, все исправит, но лучше не рисковать. Иными словами, в таком сценарии %FARHOME% может и не быть, а потому и не используется.

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

----

На заметку модуле- и плагно- писателей. Скрипт работает с любыми NuGet пакетами, а не только Фарнет. Можно использовать для других модулей. Можно использовать даже для обычных плагинов. Все, что нужно, это:
- пакет, выложенный на NuGet (поддерживаются разные источники, теоретически мог бы быть специальный сервер для Фара)
- извлекаемые из пакета файлы должны быть в корневой папке пакета "tools"
- подпапка "tools\FarHomе.x86|x64", если есть, выбирается в зависимости от битности Фара и копируется в FarHome с сохранением структуры
- подпапка "tools\FarHomе", если есть, копируется в FarHome с сохранением структуры
Остальное делается скриптом, от пакетов больше ничего не требуется.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

Концепция - JavaScript для автоматизации Far Manager с использованием FarNet API
https://github.com/nightroman/ClearScript

Замечание 1. Речь об "обычных" движках JavaScript, а не о различных реализациях для .NET, потому что это было бы слишком просто и ничего нового. Понятно, что для FarNet годятся любые .NET языки для создания FarNet модулей, а не только C#.

Замечание 2. Для проверки работоспособности концепции применяется PowerShell скрипт и PowerShellFar. Это исключительно для простоты проверки. В нормальном варианте нужен бы специальный FarNet модуль для JavaScript. Наподобие того, что являет из себя модуль PowerShellFar для PowerShell скриптов (только весьма проще, потому что в PSF 95% всего это уже надстройки). Этот FarNet модуль для JavaScript я пока не планирую, поэтому и использую PowerShell. (Примечание: скорее всего, не планирую вообще, потому что мощнее PowerShell на винде нет скриптового языка в настоящее время, спорить не буду, если что).

Дополнительные библиотеки. Я попробовал ClearScript (NuGet пакет называется ClearScript.V8, открытый код, разрабатывается MS, довольно активно). ClearScript поддерживает разные JavaScript движки, но мне был интересен V8 (Хром на нем, Node.js, MongoDB, для примера). Из этого пакета я взял и сложил бинарники в одной папке:

Code: Select all

ClearScript.dll
ClearScriptV8-32.dll
ClearScriptV8-64.dll
v8-ia32.dll
v8-x64.dll
И к этому определил переменную окружения (это не обязательно, но тогда надо будет в скрипте далее явно путь прописать):

Code: Select all

ClearScriptDll=...\ClearScript.dll
Чтобы это работало, нужно, чтобы был .NET 4.x, и понадобится кое-что от Visual Studio 2012. Если она не стоит, надо будет установить этот пакет: Microsoft Visual C++ 2012 Redistributable Package, найти в сети.

Последний шаг, пишем малюсенький PowerShell скрипт, запускатель js скриптов (Invoke-ClearScriptV8-.ps1):

Code: Select all

param(
     [Parameter(Mandatory=1)]
     [string]$Path
)
$Path = $PSCmdlet.GetUnresolvedProviderPathFromPSPath($Path)
$code = [System.IO.File]::ReadAllText($Path)

Add-Type -Path $env:ClearScriptDll
$js = New-Object Microsoft.ClearScript.V8.V8ScriptEngine
try {
     $js.AddHostObject('far', $Far)
     $js.Execute($code)
}
finally {
     $js.Dispose()
}
Готово. Теперь пара примеров на JavaScript, работающих с Фаром.

"Привет, мир" в диалоге (Hello-World-Message.v8f.js):

Code: Select all

far.Message('Hello World')
Более продвинутый "Привет, мир" в редакторе с диалогом и макросом (Hello-World-Editor.v8f.js):

Code: Select all

var editor = far.CreateEditor()
editor.FileName = 'Test.txt'
editor.Open()
editor.Add('Hello World')
editor.Redraw()

far.Message('Continue')
far.PostMacro('Keys("Esc Right Enter")')
Если называть такие скрипты, например, *.v8f.js, то на эту маску можно повесить в ассоциациях команду:

Code: Select all

ps: Invoke-ClearScriptV8-.ps1 (Get-FarPath)
Тогда просто жмем энтер на нужном скрипте *.v8f.js, и он запускается в Фаре.

P.S. ClearScript в этой поставке поддерживает еще и виндовые JScriptEngine, VBScriptEngine. Тогда, наверное, только одна DLL всего понадобится и скрипт-запускатель надо в одной строке изменить. Но я не пробовал, мне было интересно, заработает ли именно движок V8.
Last edited by NightRoman on Sun 20 Dec, 2020 10:40, edited 1 time in total.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

Для полноты картины попробовал и JScriptEngine, что от MS (аналогично должно быть и для VBScriptEngine). Отметить можно следующие моменты.

1. Из бинарников пакета ClearScript нужен только один файл ClearScript.dll. Вероятно, что и С++ рантайм от VS 2012 в таком случае не нужен, так как это библиотека без С++.

2. Скрипт запускатель можно использовать такой (Invoke-ClearScriptJS-.ps1)

Code: Select all

param(
	[Parameter(Mandatory=1)]
	[string]$Path,
	[switch]$Debugging
)

$Path = $PSCmdlet.GetUnresolvedProviderPathFromPSPath($Path)
$code = [System.IO.File]::ReadAllText($Path)

Add-Type -Path $env:ClearScriptDll
if ($Debugging) {
	$js = New-Object Microsoft.ClearScript.Windows.JScriptEngine ([Microsoft.ClearScript.Windows.WindowsScriptEngineFlags]3)
	$code = "debugger;`r`n$code"
}
else {
	$js = New-Object Microsoft.ClearScript.Windows.JScriptEngine
}
try {
	$js.AddHostObject('far', $Far)
	$js.Execute($code)
}
finally {
	$js.Dispose()
}
3. Заметьте, что в этом скрипте есть ключ Debugging (ассоциацию скриптов с -Debugging можно на другую клавишу повесить, скажем, [CtrlPgDn]). Отладку можно и для движка V8 добавлять, но она там другая, пока не вникал. А с MS скриптами с отладкой все просто при наличии Visual Studio (у меня стоит VS 2010). С этим ключом при запуске скрипта запускается и студия с отладчиком, где скрипт можно отлаживать привычным для студии способом.

Такие скрипты для Фара у себя обозвал *.jsf.js и ассоциации на [Enter], [CtrlPgDn] добавил такие:

Code: Select all

ps: Invoke-ClearScriptJS-.ps1 (Get-FarPath)
ps: Invoke-ClearScriptJS-.ps1 (Get-FarPath) -Debugging
Plus168
Posts: 18
Joined: Thu 05 Nov, 2009 13:12

Re: FarNet — плагин для написания плагинов на .NET языках

Post by Plus168 »

Чувствую себя полным идиотом, нифига не вышло поставить FarNet.
Помогайте.
Скачасл NuGet.exe
Сделал
Install-Package FarNet
Install-Package FarNet.PowerShellFar
В Plugins\FarNet положил плагин multihasher.
Перегрузил Far - плагина нет.
По-всякому пытался воспользоваться Update-FarPackage.ps1
Так же ничего, кроме "VERBOSE: Automatic update of installed packages.", не получил.
Не догоняю.
По всей видимости надо еще что-то сделать, но никак не пойму что именно.
Вероятно из пакета NuGet файлы должны каким-то образом попадать в директорию плагинов far'а, но этого не происходит.
Руками надо копировать? Тогда причем тут заявленная возможность обновления? Если руками, то обновления не будет.
Короче, я в ступоре.
Можете по шагам написать что надо сделать? Или где это написано?
:oops:
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

Все написано в About-FarNet.htm. Читали? Если да, то проверьте еще раз внимательно.
В Plugins\FarNet положил плагин multihasher.
Неправильно. Класть надо так: %FARHOME%\FarNet\Modules\multihasher
По-всякому пытался воспользоваться Update-FarPackage.ps1
1. Help к Update-FarPackage.ps1 читали? Если да, то проверьте команды еще раз внимательно.
2. Примеры команд, которые "не работают"? Если что-то не работает, как надо, буду разбираться и ремонтировать.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

И еще. Если используется Update-FarPackage.ps1, то NuGet.exe вообще не нужен. В общем, каша. Но я готов ответить на конкретные вопросы. А также, если есть предложения о том, как упростить процесс или сделать документацию более понятной - пожалуйста, предлагайте, обдумаю, учту, дельные советы применю. (Кроме одного - на русском писать документацию не получится, на это не хватает ресурсов.)
Plus168
Posts: 18
Joined: Thu 05 Nov, 2009 13:12

Re: FarNet — плагин для написания плагинов на .NET языках

Post by Plus168 »

About-FarNet.htm не читал, он мне просто не попался.

Наверху страницы есть
Описание и исходники здесь, скачать тоже здесь:
http://code.google.com/p/farnet
Пошел по ссылке как раз за описанием.
Там:
FarNet framework and Far Manager plugin
Distributed as the NuGet package FarNet
Пошел читать там. Поставил "Install-Package FarNet". И все. Дальше куда?
Можно ссылку на About-FarNet.htm в шапку? Вероятно в нем должно быть что-то из того, что мне нужно.

Update-FarPackage.ps1 без подписи, сходу powershell заявляет что нифига исполнять не будет. Поставил Set-ExecutionPolicy. а потом должно не могу понять как им воспользоваться. Install он делать не умеет, по крайней мере я вижу только remove в обрабатываемых параметрах.
Запускал
Update-FarPackage FarNet.PowerShellFar -FarHome "C:\Program Files (x86)\Far Manager"
Получил все то же "Automatic update of installed packages." и в farhome даже не появилось файла похожего на Update.*.info
Плагина также не появилось. Так что тут я тоже туплю.
To install and update Far Manager packages, use this PowerShell script:
https://farnet.googlecode.com/svn/trunk ... ackage.ps1
---
To install FarNet, run the following command in the Package Manager Console
от сюда https://www.nuget.org/packages/FarNet мне как-то тоже оказалось маловато.
И кстати, я так и не понял, на этой странице указаны два способа установки одного и того же, или их надо делать последовательно?

Плагин я положил в %FARHOME%\FarNet\Modules\multihasher, этот путь был в txt-файле плагина, просто не акцентировал на этом внимание, т.к. проблема для меня в FarNet, который ни в каком виде не хочет ни в FarHome, ни куда-либо еще ставиться.


Давайте последовательно действовать, начнем с About-FarNet.htm (желательно ссылку в шапку), а потом может мне уже и понятно все станет :-)
Написание плагинов на .net для far'а выглядит уж больно заманчивым.
Plus168
Posts: 18
Joined: Thu 05 Nov, 2009 13:12

Re: FarNet — плагин для написания плагинов на .NET языках

Post by Plus168 »

Кстати о "How to get and install".
Nuget.exe скачал и запустил. Результат:
D:\>nuget.exe install FarNet
'FarNet 5.0.47' already installed.
Но даже папка в C:\Program Files (x86)\Far Manager\Plugins\ не создалась.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

Много всего, есть дельное, спасибо.

About-FarNet.htm в распакованной папке должен быть.
Запускал
Update-FarPackage FarNet.PowerShellFar -FarHome "C:\Program Files (x86)\Far Manager"
Получил все то же "Automatic update of installed packages." и в farhome даже не появилось файла похожего на Update.*.info
Пока не верю. Если имя пакета указано, то "Automatic update of installed packages." не должно писаться, ибо это не обновление пакетов, а обновление конкретного. Чтобы обновлять все надо так:
Update-FarPackage -FarHome "C:\Program Files (x86)\Far Manager"

Но могу еще раз проверить у себя. Проверять или сначала Вы?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: FarNet — плагин для написания плагинов на .NET языках

Post by NightRoman »

Plus168 wrote:Кстати о "How to get and install".
Nuget.exe скачал и запустил. Результат:
D:\>nuget.exe install FarNet
'FarNet 5.0.47' already installed.
Но даже папка в C:\Program Files (x86)\Far Manager\Plugins\ не создалась.
А кто обещал? Программа делает то, что вы просите, а не то, что хотите.
Post Reply

Return to “Обсуждение плагинов”