Макрос, реализующий функции плагина Active-Help

Здесь обсуждается всё, что касается макросов.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by buniak_a_h »

Был хороший плагин active-Help, который перестал работать на 64-разрядной версии. Я всех его возможностей не помню, использовал только запуск отмеченного текста как команды ShellExecute и вызов помощи по языку программирования (*.hlp, *.chm). Постарался сделать его заменитель на макро (Lua)



Active-Help.1_13_5.7z
Версия 1.13.5
(15.64 KiB) Downloaded 95 times
settings.cfg.7z
Примерная настройка для получения справки по функциям ФАР-макросов, LuaFAR и т.п.
(499 Bytes) Downloaded 105 times


P/S. Данный скрипт интегрируется с моими же скриптами для выбора элемента таблицы (LuaComplete.lua и LuaComplete Tabbed, просмотра таблиц в панельном модуле TablePanel и мой аналог браузера таблиц (мой - TableBrowser, на замену tableview)
Last edited by buniak_a_h on Thu 08 Oct, 2020 05:12, edited 27 times in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by John Doe »

Latest post of the previous page:

Действительно)
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by buniak_a_h »

John Doe wrote: Thu 07 Sep, 2017 07:21hh.exe у всех есть.
Да, вы уже писали. Только я, видимо, не понял...
Единственный найденный мной сайт описывает командную строку для hh.exe, что в ней надо указывать имя html. Т.е. ни распаковать индекс или оглавление, ни искать по ключевому слову hh не умеет - надо самому. Тогда объясните мне, при чём тут hh и как им пользоваться. Возможно, я нашёл какой-то древний сайт, не учитывающий новые параметры.
Так-то после поиска по индексу я найденное имя html вставляю в командную чтроку вызова hh через "::/". Ну не нашёл я другого способа найти топик по ключевому слову! Знаете - подскажите.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by John Doe »

buniak_a_h wrote: Thu 07 Sep, 2017 09:36распаковать индекс или оглавление
Выборочно нет, только всё содержимое
https://msdn.microsoft.com/en-us/librar ... s.85).aspx
buniak_a_h wrote: Thu 07 Sep, 2017 09:36искать по ключевому слову
Искать может KeyHH или ffi код из моего примера выше.
Но ищет громко сказано, скорее открывает вкладку Index и вписывает ключевое слово в поиск.
Т.е. как минимум Enter придётся нажать. Баг в API, который уже фича.
Поэтому ваш подход с поиском по hhk/hhc оправдан.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by buniak_a_h »

John Doe wrote: Thu 07 Sep, 2017 11:34Выборочно нет, только всё содержимое
Увы, всё содержимое прекрасно распаковывает плагин arclite, входящий в комплект ФАРа. Получается, в этом плане hh мне бесполезен :-(
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by John Doe »

Получается так
buniak_a_h wrote: Thu 07 Sep, 2017 12:41Получается, в этом плане hh мне бесполезен :-(
Выходит что так.

В таком случае будем ждать решения тикета http://bugs.farmanager.com/view.php?id=3483
Что не мешает воспользоваться пока уже имеющимися средствами (выдирать строки открывая Редактор это как-то совсем нехорошо).
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by buniak_a_h »

John Doe wrote: Thu 07 Sep, 2017 13:01выдирать строки открывая Редактор это как-то совсем нехорошо
Вы мне не объяснили, чем это нехорошо.
На самом деле редактор открывается "молча" (на экране ничего не отображается); потом я контекст (окно ФАРа) восстанавливаю. На время поиска блокирую запись в историю. Так что, вроде, никаких следов за собой не оставляю. А если нечто летает как утка, крякает как утка, выглядит как утка, то скорее всего это и есть утка. Т.е. задача решается, с точки зрения эффективности всяко уж не хуже вызова 7z.exe, а портить - ничего не портит. И чем плохо?
Поймите. Я не спорю. Просто для меня программирование на LUA для FAR-а - это нечто новое, и я хочу знать критерии - что считается хорошим, что - плохим. И ПОЧЕМУ.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by John Doe »

buniak_a_h wrote: Fri 08 Sep, 2017 00:50Вы мне не объяснили, чем это нехорошо.
"Хорошо" для меня это использовать максимально прямой способ когда он есть.

Задача решена, но не оптимально. Чем плохо? Тормозит, например.

P.S.
Я выразил мнение, а принимать ли его во внимание или нет это ваше право.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by buniak_a_h »

John Doe wrote: Fri 08 Sep, 2017 10:16Тормозит, например
Пока больше тормозит вызов 7z (даже с ключом -so). Да ещё для поиска распакованное надо перекодировать из ANSI в UTF-8.
С другой стороны, если реально сделать сортированный индекс и сохранить его в базе (по mf.msave/mf.mload), а для поиска использовать бинарную процедуру, то, может, и можно получить выигрыш. Не знаю, насколько быстро загружаются данные из ФАРовской базы . Правда, это всё же один раз... Но всё же за идею спасибо. Тем более, что мне прислали chm-файл, в котором узлы Name и Local идут в другом порядке - всё равно переделывать поиск... Я думал, софт делает всегда одинаково. Увы... :-(
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by John Doe »

buniak_a_h wrote: Fri 08 Sep, 2017 17:02Пока больше тормозит вызов 7z (даже с ключом -so)
Может ChmView побыстрее будет?
buniak_a_h wrote: Fri 08 Sep, 2017 17:02 если реально сделать сортированный индекс и сохранить его в базе
Подозреваю достаточно сохранять в таблице во внешнем файле, откуда загружать с помощью loadfile.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by buniak_a_h »

John Doe wrote: Fri 08 Sep, 2017 18:13
buniak_a_h wrote: Fri 08 Sep, 2017 17:02Пока больше тормозит вызов 7z (даже с ключом -so)
Может ChmView побыстрее будет?
1. Я посмотрю, но остаётся всё тот же минус: ChmView не входит в комплект поставки. Т.е. типа "если Вы хотите получать контекстную помощь - установите это плагин"? А потом что-нить изменится, он начнёт конфликтовать с чем-нить... Например, у меня сейчас 64-разрядный Far, а плагин - x86. Active-Help не запускается; думаете, ChmView запустится?
2. На самом деле вся процедура укладывается в одну секунду на компе возрастом в 10 лет (я к тому, что не слишком резвый). Во всяком случае, os.difftime возвращает 0 потрачено времени. Поэтому эффективность - менее приоритетный критерий, чем независимость от сторонних разработчиков.

John Doe wrote: Fri 08 Sep, 2017 18:13
buniak_a_h wrote: Fri 08 Sep, 2017 17:02 если реально сделать сортированный индекс и сохранить его в базе
Подозреваю достаточно сохранять в таблице во внешнем файле, откуда загружать с помощью loadfile.
Может, надо мной опять довлеет привычка (в таможенной сфере если сделаешь какой-нить незарегистрированный фай - будешь долго объяснять ФАПСИ зачем он нужен).
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by John Doe »

buniak_a_h wrote: Fri 08 Sep, 2017 18:44 Т.е. типа "если Вы хотите получать контекстную помощь - установите это плагин"?
Не плагин, а утилита, может лежать рядом с макросом без установки, 20 килобайт.
x86, запускаться должна и на 64-битных системах (хотя возможны исключения, не в курсе).
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by John Doe »

buniak_a_h wrote: Fri 08 Sep, 2017 18:44Тогда надо организовывать диалог "где хранить"
По-умолчанию например в той же папке что и макрос.
Назначать папку можно и без диалога, простым присваиванием в начале макрофайла.

Конечно и в базе можно, только тогда перед вами другая задача возникнет - как чистить базу от ненужных индексов.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by buniak_a_h »

John Doe wrote: Fri 08 Sep, 2017 18:13Подозреваю достаточно сохранять в таблице во внешнем файле, откуда загружать с помощью loadfile.
Я тут попробовал. Сохранение таблицы (точнее, преобразование в строку, соответствующую генератору таблицы на языке LUA) занимает у меня почти минуту (в индексе более 50 000 элементов). До проведённой мной оптимизации этот процесс занимал почти 5 минут. При том, что mf.msave занимает меньше секунды. Может, я что-то не то делаю? У Вас есть пример такого сохранения/восстановления? Ну и вдогонку (оффтопик): есть ли в языке LUA возможность сохранения таблицы без преобразования её в текст программы?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by John Doe »

buniak_a_h wrote: Mon 11 Sep, 2017 02:45При том, что mf.msave занимает меньше секунды. Может, я что-то не то делаю? У Вас есть пример такого сохранения/восстановления?
Ссылка в соответствующей теме http://forum.farmanager.com/viewtopic.p ... 37#p145737, ну и собственно код mf.msave смотрите в luamacro\api.lua.
buniak_a_h wrote: Mon 11 Sep, 2017 02:45Ну и вдогонку (оффтопик): есть ли в языке LUA возможность сохранения таблицы без преобразования её в текст программы?
Конечно есть.
Смысл сохранения в виде "текста программы" заключается в том, что так получается готовая процедура загрузки.

Но хотите реализовывать свою — пожалуйста.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Макрос, реализующий функции плагина Active-Help

Post by John Doe »

buniak_a_h wrote: Sat 05 Aug, 2017 05:51Принципиальное изменение: с файлами помощи CHM макрос теперь работает только при наличии 7z.exe и при возможности запуска его без указания путей (путь к нему должен быть прописан в path).
Почему бы не сделать путь настраиваемым, хотя бы константой в макросе.
buniak_a_h wrote: Sat 05 Aug, 2017 05:51Индекс создаётся при необходимости в случае, если он отсутствовал, либо стал неактуален (изменилось время последней модификации CHM-файла)
Файлы в поставке фара с каждым ночным билдом с новой датой, хотя по факту меняются редко.
buniak_a_h wrote: Sat 05 Aug, 2017 05:51Для работы макроса необходимо в каталог %FARPROFILE%\Macros\modules\BAX\ модуль TabUtils (есть в прилагаемом архиве).
Подход оправдан когда у вас есть отлаженный модуль, функции которого реально используются в нескольких скриптах, и/или сами по себе могут быть полезны другим пользователям.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Сохранение и чтение таблиц в файле

Post by buniak_a_h »

John Doe wrote: Mon 11 Sep, 2017 10:35
Оптимизированный код - 40 секунд
Вероятно в коде проблема.
Главное что незачем изобретать сериализацию таблиц при наличии проверенных решений, посмотрите например здесь http://lua-users.org/wiki/TableSerialization.
за ссылку - спасибо. Чтобы лазать по сайтам, посвящённым этой теме, надо заниматься именно этим, а я - только по выходным в плохую погоду... Потому здесь и спрашиваю - вдруг кто видел или сам делал...
John Doe wrote: Mon 11 Sep, 2017 10:35 Впрочем, для вашей задачи ничего такого не требуется.
Разве не достаточно сохранять в индексе пары "ключ=значение"?

Code: Select all

file:write(("[%q]=%q"):format(key,value))
А вся остальная информация может в базе лежать, как и раньше.
Я так сначала и сделал. Пока думал, что в исходных файлах порядок узлов фиксирован (принят какой-то стандарт, например). Ну и нарвался на пример, что идут сначала Name, потом Local и наоборот. Т.е. при формировании таблицы надо не зависеть от порядка, да ещё и игнорировать лишнюю информацию.
Но мысль хорошая: после составления таблицы перевести её в такой вид..
Post Reply

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