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

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 353
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

Latest post of the previous page:

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: 353
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 14:06

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: 353
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 14:23

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: 11246
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 15:25

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: 11246
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 15:35

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

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

buniak_a_h
Posts: 353
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 15:43

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

User avatar
John Doe
Бюрократ
Posts: 11246
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 15:50

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

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

buniak_a_h
Posts: 353
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 16:05

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: 353
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 16:18

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

User avatar
John Doe
Бюрократ
Posts: 11246
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 16:30

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: 11246
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 16:34

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

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

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

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

Post by HaRT » Mon 11 Sep, 2017 16:44

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

User avatar
John Doe
Бюрократ
Posts: 11246
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 16:46

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

buniak_a_h
Posts: 353
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 17:07

John Doe wrote:
Mon 11 Sep, 2017 16:46
Возможно ли задать для какой-нибудь маски (например *.lua) два файла, один из которых *.hlp, а другой *.chm?
Да, безусловно.
У меня для Delphi указаны и hlp (для самого языка Пасцаль), и chm для библиотеки jedi.

buniak_a_h
Posts: 353
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 17:11

John Doe wrote:
Mon 11 Sep, 2017 16:30
Лично я бы настройку ассоциаций вообще изначально сделал бы конфигом в редакторе, а потом уже посмотрел достаточно этого или нет
Добавлено
Например так:
Ну, я примерно так и делал. Хранение настройки сделал в текстовый файл, соответственно загрузку сделал. До того, как узнал про mf.mload/mf.msave

User avatar
John Doe
Бюрократ
Posts: 11246
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 17:34

buniak_a_h wrote:
Mon 11 Sep, 2017 17:07
Да, безусловно.
У меня для Delphi указаны и hlp (для самого языка Пасцаль), и chm для библиотеки jedi.
Ага, меня просто интерфейс сбил с толку.
А Команда для вызова помощи (+параметры) это опциональные поля?
buniak_a_h wrote:
Mon 11 Sep, 2017 17:11
Ну, я примерно так и делал. Хранение настройки сделал в текстовый файл, соответственно загрузку сделал. До того, как узнал про mf.mload/mf.msave
А при чём тут msave.
Я говорил о том, что можно было бы сэкономить немало часов времени разработки/отладки, если для начала ограничиться текстовым конфигом.
Потом, когда структура данных устаканится, можно и в диалоги вывести конечно.

То, как оно сейчас, учитывая особенности интерфейса, и необходимость как-то неочевидно перемещаться между управляющими элементами, мне не очень удобно.

buniak_a_h
Posts: 353
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 21:54

John Doe wrote:
Mon 11 Sep, 2017 17:34
А Команда для вызова помощи (+параметры) это опциональные поля?
Не просто опциональные - теперь оказалось вообще лишние. Ну, на будущее оставил.
Просто когда начинал, то не знал, как вызвать помощь по конкретной теме (ключу). Потом нашёл командную строку для hlp-файлов. Логично предположил (как мне казалось), что аналогичная строка существует и для chm ; просто я её ещё не нашёл. Поэтому оставил эти поля, чтоб тот, кто знает как, смог бы настроить командную строку. Однако с chm оказалось несколько сложнее. Поэтому для chm они вообще лишние; да и для hlp - тоже, т.к. для hlp я командную строку забил в макрос. Руки не дошли почикать (да и пока не знаю, может ещё какие системы помощи есть. Например, VC++ формирует какой-то запрос серверу...)
John Doe wrote:
Mon 11 Sep, 2017 17:34
buniak_a_h wrote:
Mon 11 Sep, 2017 17:11
Ну, я примерно так и делал. Хранение настройки сделал в текстовый файл, соответственно загрузку сделал. До того, как узнал про mf.mload/mf.msave
А при чём тут msave.
При том, что до того, как я узнал про settings и mf.load/mf.save, а читал и сохранял настройки в текстовый файл. Именно такого вида, как Вы нарисовали.
John Doe wrote:
Mon 11 Sep, 2017 17:34
Я говорил о том, что можно было бы сэкономить немало часов времени разработки/отладки, если для начала ограничиться текстовым конфигом.
Потом, когда структура данных устаканится, можно и в диалоги вывести конечно.
Я, собственно, и затеял поначалу всю эту канитель, чтобы посмотреть, какие возможности организации диалогов есть в FAR-е. И настройки было только две: клавиша для ShellExecute и клавиша для вызова справки.
John Doe wrote:
Mon 11 Sep, 2017 17:34
То, как оно сейчас, учитывая особенности интерфейса, и необходимость как-то неочевидно перемещаться между управляющими элементами, мне не очень удобно.
Ну, не последняя версия... По уму надо делать симуляцию грида с двумя столбцами. Хотя, если не делать алиасы, то весь вторичный диалог ("Редактирование помощи") сводится к двум полям: маске файла и многострочному списку файлов. Остальное просто пока без надобности.
Или Ваше замечание относится к первому диалогу? Так там, вроде, ничего лишнего.
Можно, конечно, разбить его не два диалога: настройка горячих клавиш и редактирование ассоциаций. Наверно, это будет правильно...
Спасибо за идею.

Post Reply

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