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

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 1444
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 118 times
Contact:

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

Post by buniak_a_h »

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


Active-Help.013.7z
Версия 013 с модулями
(21.18 KiB) Downloaded 68 times
Last edited by buniak_a_h on Sun 27 Jan, 2019 13:10, edited 24 times in total.

buniak_a_h
Posts: 1444
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 118 times
Contact:

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

Post by buniak_a_h »

Latest post of the previous page:

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: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

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: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

Выше я прокомментировал описание обновления, а теперь глянул код, и вот за что зацепился взгляд:
  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: 1444
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 118 times
Contact:

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

Post by buniak_a_h »

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 - новая; раньше таблиц такого размера у меня не бывало.

buniak_a_h
Posts: 1444
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 118 times
Contact:

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

Post by buniak_a_h »

John Doe wrote:
Mon 11 Sep, 2017 12:39
Выше я прокомментировал описание обновления, а теперь глянул код, и вот за что зацепился взгляд:
Спасибо за разбор. Собственно, для этого и присылал.
John Doe wrote:
Mon 11 Sep, 2017 12:39
1. Функция TableClone есть и в модуле, и в макросе
Ну да, я ж писал (тоже где-то выше): надоело копипастить. Забыл убрать.
John Doe wrote:
Mon 11 Sep, 2017 12:39
2. Встретил использование mf.env, mf.index, mf.substr, mf.fexist, mf.ucase, mf.lcase, и т.п. Рекомендую ознакомиться с темой Лишние функции macro api
Про некоторые я в курсе. Но в то же время некоторые вызовы функций из mf выглядят компактнее и логичнее. Особенно это касается функций mf.substr и mf.index
John Doe wrote:
Mon 11 Sep, 2017 12:39
3. В своей функции FindFile вы повторяете библиотечную win.SearchPath
Спасибо. Не хватает всё же нормального описания языка и библиотек (в т.ч. "специфических для FAR), объединённых в одном документе (лучше всего - pdf). Чтоб можно было читать всё подряд, а не получать справку по конкретной функции. Надо ещё знать о её существовании...
John Doe wrote:
Mon 11 Sep, 2017 12:39
4. Функция _FileExt тоже идёт своим путём, хотя есть mf.split, или же чисто lua: str:match"%.([^\\]+)$" or ""
За mf.split - спасибо. А насчёт str;match: (а) я именно её и использую и (б) сначала так и написал. Что-то не срослось. То ли при наличии точки в имени каталога, то ли при отсутствии полного пути вообще. Пришлось сделать if, в котором как раз та самая str:match.
John Doe wrote:
Mon 11 Sep, 2017 12:39
5. В ANSItoUTF_8 вместо числовой константы лучше использовать win.GetACP
А GetUTF8CP нету? Для замены 65001 . Если нет - то и замене смысла нет. Если есть - я не нашёл.
P.S. На самом деле явно не хватает функций перекодировки (особенно в UTF-8, на котором работает LuaFAR, но который на практике встречается довольно редко). Типа EncodeUTF8String ... OemToUtf8 нашёл (сейчас только). А AnsiToUtf8 - не нашёл. Ощущение такое, что как разработчикам самим понадобится функция - они делали. А AnsiToUtf8 им было без надобности...
John Doe wrote:
Mon 11 Sep, 2017 12:39
6. Функцию capital можно написать так str:lower():gsub("^%l", unicode.utf8.upper)
Ничего не понял, но спасибо. Таблицы unicode не встречал ни в текстах других авторов, ни в документации - откуда знать? А так - да, запись короче. Хотя и непонятней...
John Doe wrote:
Mon 11 Sep, 2017 12:39
7. Чтение hhc/hhk на lua уже привёл постом выше.
8. _ValidKey можно заменить far.NameToRecordTable
Ну, опять спасибо. И опять камень в огород авторов документации. Откуда я мог знать о существовании этой функции?
John Doe wrote:
Mon 11 Sep, 2017 12:39
9. Многострочные литералы удобнее <...>
Видимо, кто к чему привык... Мне моё читабельнее.
John Doe wrote:
Mon 11 Sep, 2017 12:39
10. Непропорционально много кода для организации диалогов.
Вот тут я согласен. Следующим постом опишу проблемы, с которыми столкнулся при написании диалогов (в т.ч. и полное отсутствие некоторых моментов в доументации. Хотя, может, я просто не нашёл).
Last edited by buniak_a_h on Mon 11 Sep, 2017 14:08, edited 1 time in total.

buniak_a_h
Posts: 1444
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 118 times
Contact:

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

Post by buniak_a_h »

John Doe wrote:
Mon 11 Sep, 2017 12:39
10. Непропорционально много кода для организации диалогов.
Возможно, я многого в организации диалогов не понимаю. Ну и на некоторые "странности" напоролся:
1. Если в элементе DI_LISTBOX указать текст с акселератором (например, "&4. Настройка файлов помощи") то перехода на листбокс всё равно не происходит.
2. Если фокус ввода стоит на листбоксе, то перейти из него клавишами-акселераторами на другой элемент тоже не получается.
3. Если движение по диалогу стрелками Up/Down приводит в листбокс, то после оттуда уже не выйти (только табуляцией). Согласитесь, неудобно.
4. Не нашёл возможности присвоить кнопкам шоткаты (было бы здорово!)
Пришлось эти функции реализовывать вручную. Возможно, всё давно решено...
Про флаги (в виде текста) в документации вообще не нашёл! Ну, как один сделать - я понял. Но перечисление флагов в виде таблицы - согласитесь, нетривиально!
Last edited by buniak_a_h on Mon 11 Sep, 2017 14:25, edited 1 time in total.

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

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

Post by John Doe »

buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
надоело копипастить
Как по мне, то для нужд данного скрипта ни эта, ни прочие функции модуля не нужны.
buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
Но в то же время некоторые вызовы функций из mf выглядят компактнее и логичнее. Особенно это касается функций mf.substr и mf.index
Лишь до тех пор, пока не привыкнете к lua.
buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
Пришлось сделать if, в котором как раз та самая str:match.
В данном случае я не функцию вам указываю, а на то, что операция простая, и будучи записана вот так получается компактнее и нагляднее (чем в каком-то дереве условий).
А mf.split я например не использую, по соображениям указанным выше.
buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
А GetUTF8CP нету? Для замены 65001 . Если нет - то и замене смысла нет. Если есть - я не нашёл.
65001 это в любом случае постоянное значение, в отличии от ANSI, значение которой не всегда 1251.
buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
Ощущение такое, что как разработчикам самим понадобится функция - они делали.
Обычный подход.
А функцию вы себе написали.
buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
Ничего не понял, но спасибо.
Мануал по lua поможет.
buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
Таблицы unicode не встречал ни в текстах других авторов, ни в документации - откуда знать?
Selene Unicode, в luafar_manual.chm
buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
А так - да, запись короче. Хотя и непонятней...
Это одна из идиом lua, непонятны они только если не пытаться ими пользоваться.
buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
Откуда я мог знать о существовании этой функции?
В документации она есть.

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

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

Post by John Doe »

buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
Следующим постом опишу проблемы, с которыми столкнулся при написании диалогов
Тонкостей может быть и много, но зачем вообще идти по сложному пути.

Достаточно было чего-то подобного Меню ассоциаций.
И кода в 10 раз меньше, и выглядит чище.

buniak_a_h
Posts: 1444
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 118 times
Contact:

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

Post by buniak_a_h »

John Doe wrote:
Mon 11 Sep, 2017 15:25
В документации она есть.
О... Чего только в документации нет! Даже то, чего вообще нет!

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

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

Post by John Doe »

buniak_a_h wrote:
Mon 11 Sep, 2017 15:43
Даже то, чего вообще нет!
Раньше было значительно хуже.
А чтобы стало лучше это кто-то должен сделать.

Так что вы предлагаете?

buniak_a_h
Posts: 1444
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 118 times
Contact:

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

Post by buniak_a_h »

John Doe wrote:
Mon 11 Sep, 2017 15:35
Достаточно было чего-то подобного Меню ассоциаций.
И кода в 10 раз меньше, и выглядит чище.
1. Когда начинал писать, ещё не знал, что придётся такое писать. Думал, для chm можно обойтись такой же командой, как для hlp (указать только ключ для поиска) Ну и думал, что потом сам настрою командную строку вызова.
2. если не заводить то, что у меня называется "Алиас", а файлов помощи ассоциировать с маской несколько, то меню выбора конкретного получается совершенно нечитабельным (особенно, если пути длинные).
3. В диалоге ассоциации фиксированное число полей (6). Этого может оказаться мало. Отсюда ListBox.
4. Кнопки "Импорт", "Экспорт" - для отладки у одного из юзеров. Просто чтоб я мог посмотреть, какие у него настройки (не работало). Решил пока оставить. Для примерчика.
4. Ну и - да, для файлов *.hlp, *.chm поля для параметров вызова лишние. Но! Может, потом (или у кого-нить) ещё что будет)
А в остальном он не сильно отличается. Хотя "лишние" поля я, наверно, удалю. И добавлю путь к 7z :-)
Жаль, нет аналога грида. И нет возможности (или я не нашёл?) редактирования строки листбокса прямо "по месту". Т.е. сделать-то можно, но процедура будет ещё сложнее

buniak_a_h
Posts: 1444
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 118 times
Contact:

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

Post by buniak_a_h »

John Doe wrote:
Mon 11 Sep, 2017 15:50
Так что вы предлагаете?
Не, не предлагаю. Я понимаю, что проект - чисто любительский, денег за него не платят.
Во времена СССР в таких случаях привлекали первокурсников за зачёт: и им хорошо, и денег не требуется :-)
Но нужна официальная администрация...
Хотя первое, что хочется получить - это как-то сконвертировать chm в pdf. Я не знаю, правда, есть ли такой софт.

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

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

Post by John Doe »

buniak_a_h wrote:
Mon 11 Sep, 2017 16:05
Когда начинал писать, ещё не знал, что придётся такое писать. Думал, для chm можно обойтись такой же командой, как для hlp (указать только ключ для поиска)
А какая разница сколько команд, когда в любом случае можно проще.
buniak_a_h wrote:
Mon 11 Sep, 2017 16:05
2. если не заводить то, что у меня называется "Алиас", а файлов помощи ассоциировать с маской несколько, то меню выбора конкретного получается совершенно нечитабельным (особенно, если пути длинные).
Пути можно обрезать, например. Впрочем, к алиасу у меня лично вопросов нет.
buniak_a_h wrote:
Mon 11 Sep, 2017 16:05
3. В диалоге ассоциации фиксированное число полей (6). Этого может оказаться мало. Отсюда ListBox.
Я имел ввиду другой листбокс, то что в основном диалоге конфигурации, вместо него проще было сделать меню.
Но и в "Редактировании помощи" тоже можно упростить интерфейс, если угодно.

Лично я бы настройку ассоциаций вообще изначально сделал бы конфигом в редакторе, а потом уже посмотрел достаточно этого или нет
Добавлено
Например так:

Code: Select all

Types {
  chm = {
    command = "keyhh.exe",
    args = " -MyID -#klink %s %s",
    path = "%FARHOME%\\Encyclopedia\\"
  }
}

Help {
  mask="*.lua",
  files={
    {"FarEncyclopedia.ru.chm"},
    {"macroapi_manual.ru.chm"},
    {"luafar_manual.chm"},
  }
}
Last edited by John Doe on Mon 11 Sep, 2017 16:59, edited 1 time in total.

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

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

Post by John Doe »

buniak_a_h wrote:
Mon 11 Sep, 2017 14:06
_ValidKey можно заменить far.NameToRecordTable
Тут я похоже недопонял назначение функции, поэтому нет.

И вот нашёл баг в диалоге конфигурации.
Если в листбоксе нажить F2 или F8 мышью, то падает

User avatar
HaRT
Moderator
Posts: 9275
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 98 times
Been thanked: 206 times

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

Post by HaRT »

Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by John Doe »

Возможно ли задать для какой-нибудь маски (например *.lua) два файла, один из которых *.hlp, а другой *.chm?

Post Reply

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