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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Thu 07 Sep, 2017 11:34

Latest post of the previous page:

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 оправдан.

buniak_a_h
Posts: 352
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

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

Post by buniak_a_h » Thu 07 Sep, 2017 12:41

John Doe wrote:
Thu 07 Sep, 2017 11:34
Выборочно нет, только всё содержимое
Увы, всё содержимое прекрасно распаковывает плагин arclite, входящий в комплект ФАРа. Получается, в этом плане hh мне бесполезен :-(

User avatar
John Doe
Бюрократ
Posts: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Thu 07 Sep, 2017 13:01

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

В таком случае будем ждать решения тикета http://bugs.farmanager.com/view.php?id=3483
Что не мешает воспользоваться пока уже имеющимися средствами (выдирать строки открывая Редактор это как-то совсем нехорошо).

buniak_a_h
Posts: 352
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

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

Post by buniak_a_h » Fri 08 Sep, 2017 00:50

John Doe wrote:
Thu 07 Sep, 2017 13:01
выдирать строки открывая Редактор это как-то совсем нехорошо
Вы мне не объяснили, чем это нехорошо.
На самом деле редактор открывается "молча" (на экране ничего не отображается); потом я контекст (окно ФАРа) восстанавливаю. На время поиска блокирую запись в историю. Так что, вроде, никаких следов за собой не оставляю. А если нечто летает как утка, крякает как утка, выглядит как утка, то скорее всего это и есть утка. Т.е. задача решается, с точки зрения эффективности всяко уж не хуже вызова 7z.exe, а портить - ничего не портит. И чем плохо?
Поймите. Я не спорю. Просто для меня программирование на LUA для FAR-а - это нечто новое, и я хочу знать критерии - что считается хорошим, что - плохим. И ПОЧЕМУ.

User avatar
John Doe
Бюрократ
Posts: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Fri 08 Sep, 2017 10:16

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

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

P.S.
Я выразил мнение, а принимать ли его во внимание или нет это ваше право.

buniak_a_h
Posts: 352
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

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

Post by buniak_a_h » Fri 08 Sep, 2017 17:02

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: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Fri 08 Sep, 2017 18:13

buniak_a_h wrote:
Fri 08 Sep, 2017 17:02
Пока больше тормозит вызов 7z (даже с ключом -so)
Может ChmView побыстрее будет?
buniak_a_h wrote:
Fri 08 Sep, 2017 17:02
если реально сделать сортированный индекс и сохранить его в базе
Подозреваю достаточно сохранять в таблице во внешнем файле, откуда загружать с помощью loadfile.

buniak_a_h
Posts: 352
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

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

Post by buniak_a_h » Fri 08 Sep, 2017 18:44

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: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Fri 08 Sep, 2017 19:07

buniak_a_h wrote:
Fri 08 Sep, 2017 18:44
Т.е. типа "если Вы хотите получать контекстную помощь - установите это плагин"?
Не плагин, а утилита, может лежать рядом с макросом без установки, 20 килобайт.
x86, запускаться должна и на 64-битных системах (хотя возможны исключения, не в курсе).

User avatar
John Doe
Бюрократ
Posts: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Fri 08 Sep, 2017 19:12

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

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

buniak_a_h
Posts: 352
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

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

Post by buniak_a_h » Mon 11 Sep, 2017 02:45

John Doe wrote:
Fri 08 Sep, 2017 18:13
Подозреваю достаточно сохранять в таблице во внешнем файле, откуда загружать с помощью loadfile.
Я тут попробовал. Сохранение таблицы (точнее, преобразование в строку, соответствующую генератору таблицы на языке LUA) занимает у меня почти минуту (в индексе более 50 000 элементов). До проведённой мной оптимизации этот процесс занимал почти 5 минут. При том, что mf.msave занимает меньше секунды. Может, я что-то не то делаю? У Вас есть пример такого сохранения/восстановления? Ну и вдогонку (оффтопик): есть ли в языке LUA возможность сохранения таблицы без преобразования её в текст программы?

User avatar
John Doe
Бюрократ
Posts: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Mon 11 Sep, 2017 10:54

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

Но хотите реализовывать свою — пожалуйста.

User avatar
John Doe
Бюрократ
Posts: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Mon 11 Sep, 2017 11:11

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 (есть в прилагаемом архиве).
Подход оправдан когда у вас есть отлаженный модуль, функции которого реально используются в нескольких скриптах, и/или сами по себе могут быть полезны другим пользователям.

buniak_a_h
Posts: 352
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

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

Post by buniak_a_h » Mon 11 Sep, 2017 11:21

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 и наоборот. Т.е. при формировании таблицы надо не зависеть от порядка, да ещё и игнорировать лишнюю информацию.
Но мысль хорошая: после составления таблицы перевести её в такой вид..

User avatar
John Doe
Бюрократ
Posts: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Mon 11 Sep, 2017 11:42

buniak_a_h wrote:
Mon 11 Sep, 2017 11:21
после составления таблицы перевести её в такой вид..
Сразу можно в таком виде составлять.

Code: Select all

local text = [[
                <LI> <OBJECT type="text/sitemap">
                <param name="Name" value="FarGetPluginInformation">
                <param name="Local" value="html/structures/../structures/fargetplugininformation.html">
                </OBJECT>
--]]
for obj_str in text:gmatch('<OBJECT type="text/sitemap">(.+)</OBJECT>') do
  local obj = {}
  for param_str in obj_str:gmatch('<param(.-)>') do
    local param = {}
    for name,value in param_str:gmatch('(%S+)="(.-)"') do
      param[name] = value
    end
    obj[param.name]=param.value
  end
  far.Show((("[%q]=%q"):format(obj.Name,obj.Local)))
end

User avatar
John Doe
Бюрократ
Posts: 11240
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Mon 11 Sep, 2017 12:39

Выше я прокомментировал описание обновления, а теперь глянул код, и вот за что зацепился взгляд:
  1. Функция TableClone есть и в модуле, и в макросе
  2. Встретил использование mf.env, mf.index, mf.substr, mf.fexist, mf.ucase, mf.lcase, mf.exit, и т.п. Рекомендую ознакомиться с темой Лишние функции macro api
  3. В своей функции FindFile вы повторяете библиотечную win.SearchPath
  4. Функция _FileExt тоже идёт своим путём, хотя есть mf.split, или же чисто lua: str:match"%.([^\\]+)$" or ""
  5. В ANSItoUTF_8 вместо числовой константы лучше использовать win.GetACP
  6. Функцию capital можно написать так str:lower():gsub("^%l", unicode.utf8.upper)
  7. Чтение hhc/hhk на lua уже привёл постом выше.
  8. _ValidKey можно заменить far.NameToRecordTable
  9. Многострочные литералы удобнее не , а
  10. Непропорционально много кода для организации диалогов.
Last edited by John Doe on Tue 12 Sep, 2017 12:43, edited 1 time in total.

buniak_a_h
Posts: 352
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

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

Post by buniak_a_h » Mon 11 Sep, 2017 12:41

John Doe wrote:
Mon 11 Sep, 2017 11:11
Почему бы не сделать путь настраиваемым, хотя бы константой в макросе.
Неохота было возиться. Сделаю... Хотя главного ограничения не отменяет: он ДОЛЖЕН БЫТЬ! А разместить его в каталог, входящий в PATH - возможно, даже проще, чем менять скрипт.
John Doe wrote:
Mon 11 Sep, 2017 11:11
Файлы в поставке фара с каждым ночным билдом с новой датой, хотя по факту меняются редко.
А при чём тут файлы в поставке ФАРа? chm-файлы не только в ФАРе поставляются... Даже к старой Delphi некоторые компонены поставляются с такими файлами помощи и до сих пор меняются... А с ФАРовскими - ну, значит, будут перестраиваться индексы. У ФАРа они маленькие, на древней 15-летней машине индексируются меньше секунды. Не сохранять же КС (CRC32 или ещё что)! Проверка CRC будет происходить дольше, чем перестроение индекса. Да и софт искать... Точнее, софт есть, но его ещё надо приспособить для использования в скрипте.
John Doe wrote:
Mon 11 Sep, 2017 11:11
Подход оправдан когда у вас есть отлаженный модуль, функции которого реально используются в нескольких скриптах, и/или сами по себе могут быть полезны другим пользователям.
За других не скажу, а у меня эти процедуры используются много где. Просто надоело копипастить - выделил в модуль. Ну, правда, процедура TabQuickToString - новая; раньше таблиц такого размера у меня не бывало.

Post Reply

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