Макрос для изменения environment

Здесь обсуждается всё, что касается макросов.
Post Reply
reaperman
Posts: 30
Joined: Wed 17 May, 2006 08:48
Has thanked: 3 times
Been thanked: 1 time

Макрос для изменения environment

Post by reaperman »

Понадобилось на днях написать макрос, помогающий в следующей ситуации - на рабочей машине установлено одновременно несколько версий некоего скриптового языка (допустим, Perl). Нужна необходимость быстрого переключения environment (минимально хотя бы PATH по-быстрому перетасовать).
Вот что получилось, возможно, кому-то пригодится, хотя бы как пример или рыба:

Примечания:
  • В моем случае особенность зоопарка версий используемого скриптового языка такова - каждая версия живет в своей отдельной директории под общей крышей c:\interpreter (там внутри есть директории 1.8.5, 1.9.2, 2.0 и так далее).
  • В каждой "версионной" поддиректории в bin/ должен жить interpreter.exe - это необходимое условие для попадания в результирующее меню.
  • Я использую модуль lfs, так как far.RecursiveSearch и far.GetDirList обходят указаннную директорию рекурсивно, что во многих случаях довольно затратно, мне нужны лишь элементы файловой системы первого уровня, побороть рекурсивность штатных средств не удалось вследствие отсутствия описания либо же моей неспособности его найти. В исходниках Far рыться неохота :)
  • Поскольку lfs не входит в поставку Far, пришлось скомпилировать из исходников, DLL приаттачиваю на всякий случай. У меня Windows 8.1, Far 3.0 build 3800 x64, соответственно библиотека тоже 64битная.
Attachments
lfs.dll.7z
lfs module for lua 5.1
(31.73 KiB) Downloaded 77 times
Shmuel
Posts: 6836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Макрос для изменения environment

Post by Shmuel »

reaperman wrote:Я использую модуль lfs, так как far.RecursiveSearch и far.GetDirList обходят указаннную директорию рекурсивно
far.RecursiveSearch НЕ обходит директорию рекурсивно, если только специально не постараться (включить бит FRS_RECUR в параметре Flags).
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Макрос для изменения environment

Post by John Doe »

reaperman wrote:побороть рекурсивность штатных средств не удалось вследствие отсутствия описания либо же моей неспособности его найти. В исходниках Far рыться неохота :)
В дистрибутиве фара есть документация по LuaFAR, крайне лаконичная, но название функции фар там присутствует, а по названию несложно найти информацию в Энциклопедии (которая также входит в дистрибутив).
Это конечно не очень удобно, поэтому я и "линкифицировал" luafar manual, см. в шапке темы о LuaFAR.

Ещё LuaFAR предоставляет функцию win.SearchPath (основанную на SearchPathW) (в данном случае не подходит)

Кроме того замечу, что для вашей задачи необязательно пользоваться ни функциями LuaFAR, ни lfs.
Достаточно выполнить команду "dir" (io.popen) и обработать её вывод.
Кстати именно dir используется в другом скрипте для python: http://forum.farmanager.com/viewtopic.php?f=15&t=7717
Shmuel
Posts: 6836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Макрос для изменения environment

Post by Shmuel »

John Doe wrote:Кроме того замечу, что для вашей задачи необязательно пользоваться ни функциями LuaFAR, ни lfs.
Достаточно выполнить команду "dir" (io.popen) и обработать её вывод.
Странно было бы пользоваться dir или io.popen при наличии штатной ф-ции far.RecursiveSearch. Да ещё и получить при этом потенциальные проблемы с Юникодом.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Re: Макрос для изменения environment

Post by DrKnS »

Запускать новый процесс, передавать ему параметры, читать сериализованный выхлоп, изобретать парсер для его десериализации - да это же труъ юнихъ вейъ. :ha:
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Макрос для изменения environment

Post by John Doe »

DrKnS
На Lua всё перечисленное выполняется одной короткой строкой :-)

Я не спорю, что при наличии лучших встроенных альтернатив этот способ рекомендовать смысла нет.
Но это всё же проще чем искать (и компилировать) подходящую стороннюю библиотеку.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Re: Макрос для изменения environment

Post by sToLp »

reaperman wrote:...пришлось скомпилировать из исходников, DLL ...
А чем не подходит плагин Environment Manager, который "позволяет настроить г р у п п ы настроек переменной среды, и с лёгкостью их включать/выключать"? И он есть и для x86, и для x64.
reaperman
Posts: 30
Joined: Wed 17 May, 2006 08:48
Has thanked: 3 times
Been thanked: 1 time

Re: Макрос для изменения environment

Post by reaperman »

Shmuel wrote:far.RecursiveSearch НЕ обходит директорию рекурсивно, если только специально не постараться (включить бит FRS_RECUR в параметре Flags).
Да, действительно, если не указывать флаги при вызове, то всё в порядке, дальше первого уровня не идет. Не понимаю, как я мог такое пропустить...
John Doe wrote:Ещё LuaFAR предоставляет функцию win.SearchPath (основанную на SearchPathW)
Я ее находил в luafar_manual.chm, но там совершенно неочевидно, как это можно использовать для получения списка всех поддиректорий (можно ли вообще?). Чтение соответствующей страницы MSDN понимания не прибавило (для проверки существования заранее известного файла она подходит, или например для поиска dll где-то в путях), да и отсутствие примеров использования удручает.
John Doe wrote:Достаточно выполнить команду "dir" (io.popen) и обработать её вывод.
Про этот трюк я тоже был в курсе, его довольно часто рекомендуют и на StackOverflow, и на форумах, посвященных Lua, но тут я разделяю точку зрения DrKnS - всё это хорошо смотрится только в шелл-скриптах, при наличии возможности использовать родные системные вызовы, обернутые в функции используемого языка - грех не воспользоваться.
sToLp wrote:А чем не подходит плагин Environment Manager, который "позволяет настроить г р у п п ы настроек переменной среды, и с лёгкостью их включать/выключать"? И он есть и для x86, и для x64.
Пытался и его поиспользовать вначале, только не понял - он умеет ли изменять PATH так, чтобы там в любой момент времени был только один путь к Перлу? То есть из менюшки выбираем "Perl 5.6.1" - в путях появляется C:\Perl\5.6.1\bin, а потом если выбираем "Perl 1.2.3" - предыдущий исчезает, чтобы никак не мешаться, и на его месте появляется C:\Perl\1.2.3\bin ?
Мой способ хорош еще и тем, что при появлении в C:\interpreter новых версий в самом макросе ничего не надо допиливать - все подхватится автоматом.
Ну и еще пара indirect bonus'ов - я, так сказать, впервые обагрил свои руки первой кровью написательства макросов на Lua для Фара, плюс если мне вдруг приспичит какая нетривиальщина (работа с сокетами например) - множество уже изобретенных Lua-велосипедов к моим услугам, надо только будет скомпилять их :)
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Макрос для изменения environment

Post by John Doe »

reaperman wrote:Я ее находил в luafar_manual.chm, но там совершенно неочевидно, как это можно использовать для получения списка всех поддиректорий (можно ли вообще?).
Вы правы, она не для этого.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Re: Макрос для изменения environment

Post by sToLp »

reaperman wrote:
sToLp wrote:А чем не подходит плагин Environment Manager, который "позволяет настроить г р у п п ы настроек переменной среды, и с лёгкостью их включать/выключать"? И он есть и для x86, и для x64.
Пытался и его поиспользовать вначале, только не понял - он умеет ли изменять PATH так, чтобы там в любой момент времени был только один путь к Перлу? То есть из менюшки выбираем "Perl 5.6.1" - в путях появляется C:\Perl\5.6.1\bin, а потом если выбираем "Perl 1.2.3" - предыдущий исчезает, чтобы никак не мешаться, и на его месте появляется C:\Perl\1.2.3\bin ?
Судя по Вашему вопросу, подозреваю, что в этот плагин Вы не очень то вникали. Ведь Environment Manager с такими случаями, про которые Вы спрашиваете, справляется запросто, поскольку в основном под них и заточен.

Впрочем, разумеется, изобрести велосипед снова никому не возбраняется. Особенно, если в охотку. Искренне желаю Вам удачи в нахождении более простого решения!
reaperman
Posts: 30
Joined: Wed 17 May, 2006 08:48
Has thanked: 3 times
Been thanked: 1 time

Re: Макрос для изменения environment

Post by reaperman »

sToLp wrote:Судя по Вашему вопросу, подозреваю, что в этот плагин Вы не очень то вникали.
Судя по Вашему ответу, подозреваю, что Вы автор этого плагина :)
Да, признаюсь, я не очень вникал. Когда я его выкачивал "на посмотреть" у меня что-то там не срослось с изменением PATH, подробностей не помню уже, дальше копать не стал. Сейчас снова выкачал, поставил - всё в порядке, действительно корректно работает с путями. В общем, я в тот первый раз что-то где-то протупил, так же, как и с far.RecursiveSearch. Так что присоединяюсь к рекомендации - если речь идет только об изменении environment по ситуации - лучше использовать плагин, это проще и быстрее вытачивания самопальных решений.
Я, тем не менее, продолжу использовать свой макрос, поскольку у меня там не только изменение окружения, но и еще несколько специфичных вещей (запуск процессов в основном), которые я выкинул из опубликованного скрипта, пытаясь его привести к более "рыбному" виду.
Спасибо всем за обсуждение, для меня оно оказалось весьма полезным.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Re: Макрос для изменения environment

Post by sToLp »

reaperman wrote:Судя по Вашему ответу, подозреваю, что Вы автор этого плагина :)
Ответил в теме его обсуждения.
Post Reply

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