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

Здесь обсуждается всё, что касается макросов.
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 » Sat 05 Aug, 2017 05:51

Был хороший плагин active-Help, который перестал работать на 64-разрядной версии. Я всех его возможностей не помню, использовал только запуск отмеченного текста как команды ShellExecute и вызов помощи по языку программирования (*.hlp, *.chm). Постарался сделать его заменитель на макро (Lua)
Active-Help.010.7z
Active-Help версия 10
(9.33 KiB) Downloaded 1 time
Новое в версии:
  • Версия 4:
    • Добавлена возможность позиционирования по ключевому слову и названию параграфа в файлах *.chm (только при вызове из немодального редактора).
  • Версия 5:
    • Добавлена возможность при наличии установленного пакета 7zip (и доступности 7zip.exe по path) позиционирования в файлах *.chm также в модальном редакторе.
    • Добавлена возможность задания ключа для вызова диалога настройки.
  • Версия 6
    • Реализовано в полном объёме сопоставление имени файла с маской. В том числе и вида *.*|Excl.usiveисключениями)
  • Версия 7
    • Исправлена ошибка, проявлявшаяся при отсутствии сохранённых настроек. Спасибо bigvax
  • Версия 8
    • Принципиальное изменение: с файлами помощи CHM макрос теперь работает только при наличии 7z.exe и при возможности запуска его без указания путей (путь к нему должен быть прописан в path). Надеюсь, это не навсегда (заявка на модификацию arclite оставлена на мантисе)
    • Для файлов CHM теперь создаётся сортированный индекс ключевых слов и содержания; он записывается в базу. Это заметно ускорило поиск ключевых слов. Индекс создаётся при необходимости в случае, если он отсутствовал, либо стал неактуален (изменилось время последней модификации CHM-файла)
    • Макрос теперь работает и без отметки ключа поиска (ищет слово над курсором)
    • Реализован импорт и экспорт настроек в текстовый файл.
    • Для работы макроса необходимо в каталог %FARPROFILE%\Macros\modules\BAX\ модуль TabUtils (есть в прилагаемом архиве).
  • Версия 9
    • Исправлен вылет пи нажатии мышкой на [ F2 ... ]
    • Переписана процедура экспорта настроек во внешний файл
    • Немного изменён диалог настройки.
  • Версия 10
    • Добавлена настройка пути к программе 7z.exe
    • Добавлена возможность автоматического поиска по всем chm-файлам. Для этого требуется, чтобы:
      (а) была включена настройка 6. Автоматический поиск по всем chm-файлам [x];
      (б) с редактируемым файлом были ассоциированы только chm-файлы
Last edited by buniak_a_h on Tue 19 Sep, 2017 15:22, edited 20 times in total.

Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Sat 05 Aug, 2017 07:35

Неплохо бы прилагать к сообщению файл(ы) макроса (архив zip или 7z). Некоторые пользователи не любят ковыряться с копи-пастой.

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

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

Post by buniak_a_h » Sat 05 Aug, 2017 11:39

Shmuel wrote:
Sat 05 Aug, 2017 07:35
Неплохо бы прилагать к сообщению файл(ы) макроса (архив zip или 7z). Некоторые пользователи не любят ковыряться с копи-пастой.
  1. Думал, так удобнее анализировать для критики. Когда (и если) макрос признают полезным и перенесут в раздел "полезные макросы", я бы это сделал.
  2. Когда-то в Codebox-ах была возможность скачивания. Что-то я теперь не вижу...
Я там нагородил с сохранением-восстановлением настроек... Как читать данные типа FST_DATA - я пример нашёл. А как сохранять - увы, нет. Наверняка есть более короткий способ сохранить таблицу, чем перебирать все значения; надеялся, что знатоки мне подскажут, как это делается короче.

Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Sat 05 Aug, 2017 11:46

buniak_a_h wrote:
Sat 05 Aug, 2017 11:39
Когда (и если) макрос признают полезным
Это признание - весьма субъективно, не стоит обращать на это внимание.
buniak_a_h wrote:
Sat 05 Aug, 2017 11:39
Наверняка есть более короткий способ сохранить таблицу, чем перебирать все значения
Есть функции mf.mload и mf.msave - они весьма простые и интуитивные в использовании.

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

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

Post by buniak_a_h » Sat 05 Aug, 2017 12:56

Shmuel wrote:
Sat 05 Aug, 2017 11:46
Есть функции mf.mload и mf.msave - они весьма простые и интуитивные в использовании.
Описание функции в "энцилопедии":
E=mload(S) Считать из базы значение глобальной переменной с именем S (область Vars).
Ну и пример далее какой-то дикий, из первого ФАРа... :wacko:
Описание из macroapi_manual.ru.chm:
ret = mf.mload (key, name [, location])
Какому верить?
Если первому, то можно ли сохранять таким способом локальные переменные? Правильно ли я понял, что "глобальные" - это те, что входят в таблицу _G?
Если второму, то что означают строковые параметры key и name? Почему для хранения одной переменной требуется две строки? Что-то типа имени секции и имени параметра?
---
Что-то у меня с интуицией плоховато.
Last edited by buniak_a_h on Sat 05 Aug, 2017 12:59, edited 1 time in total.

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

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

Post by John Doe » Sat 05 Aug, 2017 13:58

buniak_a_h wrote:
Sat 05 Aug, 2017 12:56
Какому верить?
macroapi_manual.
Написано же красным по белому: http://api.farmanager.com/ru/macro/index.html
buniak_a_h wrote:
Sat 05 Aug, 2017 12:56
Правильно ли я понял, что "глобальные" - это те, что входят в таблицу _G?
В Энциклопедии этот раздел не читайте.
buniak_a_h wrote:
Sat 05 Aug, 2017 12:56
Если первому, то можно ли сохранять таким способом локальные переменные?
Можно сохранить таблицу значений.
buniak_a_h wrote:
Sat 05 Aug, 2017 12:56
что означают строковые параметры key и name?
Адрес в базе, куда вы хотите сохранить.
"key" может содержать множество значений с разными "name".
Например key="buniak_a_h"; name="Acvtive-Help" (кстати опечатка в заголовке)

User avatar
bigvax
Posts: 18
Joined: Fri 02 Jun, 2006 17:18
Location: где-то во времени
Has thanked: 1 time
Contact:

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

Post by bigvax » Mon 04 Sep, 2017 23:31

Здраствуете.
У меня макрос почему-то «дерется» с плагином LuaMacro.
Вот такое выскакивает при старте Far'а.
╔═══════════════════════════════════════════════════════ LuaMacro ═════════════════════════════════════════════════════════════ ║ C:\Program Files\Far\Profile\Macros\scripts\Active-Help.lua:143: attempt to index local 'S1' (a nil value) stack traceback: ║ ║ C:\Program Files\Far\Profile\Macros\scripts\Active-Help.lua:143: in function 'MergeSettings' ║ ║ C:\Program Files\Far\Profile\Macros\scripts\Active-Help.lua:148: in main chunk ║ ║ [ C]: in function 'xpcall' ║ ║ C:\Program Files\Far\Plugins\LuaMacro\utils.lua:711: in function <C:\Program Files\Far\Plugins\LuaMacro\utils.lua:691> ║ ║ [ C]: in function 'RecursiveSearch' ║ ║ C:\Program Files\Far\Plugins\LuaMacro\utils.lua:780: in function <C:\Program Files\Far\Plugins\LuaMacro\utils.lua:622> ║ ╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢ ║ { OK } [ Edit ] ║ ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Last edited by bigvax on Mon 04 Sep, 2017 23:47, edited 3 times in total.
Всегда виртуально Ваш, BigVax

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

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

Post by HaRT » Mon 04 Sep, 2017 23:43

 ! Message from: HaRT
bigvax, отредактируйте, пожалуйста, своё сообщение, заключив всё сообщение об ошибке в тэг ascii (над полем ввода комментария есть соответствующая кнопка).
Фар есть инструмент, а не нянька. © 2009 DrKnS

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 » Tue 05 Sep, 2017 01:37

bigvax wrote:
Mon 04 Sep, 2017 23:31
У меня макрос почему-то «дерется» с плагином LuaMacro.
Спасибо. Была ошибка, проявлявшаяся при отсутствии сохранённых настроек. Исправлено. Новая версия в первом топике.

User avatar
bigvax
Posts: 18
Joined: Fri 02 Jun, 2006 17:18
Location: где-то во времени
Has thanked: 1 time
Contact:

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

Post by bigvax » Tue 05 Sep, 2017 02:43

buniak_a_h wrote:
Tue 05 Sep, 2017 01:37
Спасибо. Была ошибка, проявлявшаяся при отсутствии сохранённых настроек.
Тебе спасибо, что так быстро исправил. ;)

А скажи, плиз, что прописывать в настройках поле «Алиас файла помощи»?
А то я что-то туплю.

Например настраиваю вызов помощи для PHP - для начала хочу попробовать все по дефолту:
- пп.1-3 - настройки клавиш: не трогаю
- в маски файлов: *.php, *.phtml
- Файл помощи: D:\blah-blah\php_enanced_ru.chm
- «Алиас...», «Команда...», «Параметры...» - тоже пока не трогаю.
- Сохраняю

В файле .php при курсоре на топике и нажатии CtrlF1 - ничего не происходит
при выделении топика + CtrlF1 - открывается этот самый php_enanced_ru.chm, но не в разделе топика а на странице ошибки:



Т.е. нет поиска по файлу .chm


При добавлении в настройках в раздел команды: hh - Все аналогично
Возможно, я просто что-то не догоняю, и неправильно настраиваю... :(

И еще, можно-ли сделать как в АН - что-бы помощь открывалась не только при выделении топика, но и просто при курсоре на топике (типа ловля слова под курсором)

И еще - сколько раз ни нажимаешь CtrlF1, столько запускается копий файла помощи (.chm), соответственно через какое-то время у тебя висит куча открытых копий одного файла помощи.
Возможно стоит проверять, что файл уже открыт, и производить новый поиск в нем.

Заранее благодарен.
Last edited by bigvax on Tue 05 Sep, 2017 03:26, edited 2 times in total.
Всегда виртуально Ваш, BigVax

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 » Tue 05 Sep, 2017 09:36

bigvax wrote:
Tue 05 Sep, 2017 02:43
А скажи, плиз, что прописывать в настройках поле «Алиас файла помощи»?
Если для одного файла указано несколько файлов помощи, то можно для каждого написать нечто типа "читабельного" алиаса. Например, "Помощь по языку", "Краткий список тегов" и т.п. . При вызове справки именно эти алиасы будут присутствовать в меню.
bigvax wrote:
Tue 05 Sep, 2017 02:43
при выделении топика
Там в условие макроса я написал, чтобы он срабатывал только при наличии выделения. И именно выделенный кусок ищется. Можно было бы сделать поиск слова над курсором, но это - если будет кому-нить надо.
bigvax wrote:
Tue 05 Sep, 2017 02:43
Т.е. нет поиска по файлу .chm
На самом деле я делал поиск "методом тыка", проверял на ФАРовской энциклопедии (на всех файлах, поставляемых с ФАРом) и ещё на паре CHM. И я не уверен, что такое работает всегда. Посему у меня к Вам просьба: пришлите мне, пожалуйста (если не секретно) CHM-файл, на котором не работает, и укажите что Вы ищете. В личку. Или даже лучше на почту: в личных сообщениях у них очень строгое ограничение на размер вложения. Адрес моей почты я напишу Вам в личку.
bigvax wrote:
Tue 05 Sep, 2017 02:43
И еще, можно-ли сделать как в АН - что-бы помощь открывалась не только при выделении топика, но и просто при курсоре на топике (типа ловля слова под курсором)
Ну, попозже...
bigvax wrote:
Tue 05 Sep, 2017 02:43
Возможно стоит проверять, что файл уже открыт, и производить новый поиск в нем.
Увы, я не умею из lua определять, закрыто ли приложение, вызванное ранее. А писать нечто на "серьёзном" языке программирования - это уже действительно плагин, я не писал. И хотя не боги горшки обжигают, но на это надо время, а у меня завал. Так что пока проще закрывать хелпы.

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

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

Post by John Doe » Tue 05 Sep, 2017 10:27

buniak_a_h wrote:
Tue 05 Sep, 2017 09:36
Увы, я не умею из lua определять, закрыто ли приложение, вызванное ранее. А писать нечто на "серьёзном" языке программирования - это уже действительно плагин, я не писал. И хотя не боги горшки обжигают, но на это надо время, а у меня завал. Так что пока проще закрывать хелпы.
Когда-то я начинал писать подобный плагин, и вот такой черновик нашёл сейчас на диске.

Code: Select all

local ffi = require("ffi")
local HH = ffi.load"hhctrl.ocx"
local C = ffi.C

ffi.cdef[[
//http://msdn.microsoft.com/library/ms670172
HWND HtmlHelpW(
  HWND    hwndCaller,
  LPCTSTR pszFile, //Att!!
  UINT    uCommand,
  DWORD   dwData);
]]

local HH_ = {
  DISPLAY_TOPIC=0x0000,
  DISPLAY_TOC=0x0001,
  DISPLAY_INDEX=0x0002,
  DISPLAY_SEARCH=0x0003,
  KEYWORD_LOOKUP=0x000D,
  DISPLAY_TEXT_POPUP=0x000E,
  HELP_CONTEXT=0x000F,
  CLOSE_ALL=0x0012,
  ALINK_LOOKUP=0x0013,
  GET_LAST_ERROR=0x0014,
}

local wsize = ffi.sizeof"wchar_t"
local function _w(str)
  local len = str:len()
  str = win.Utf8ToUtf16(str)
  local buffer = ffi.new("wchar_t[?]",len+1)
  ffi.copy(buffer,str,len*wsize)
  return buffer
end
Использовать так:

Code: Select all

local chmfile = [[C:\apps\far3\Encyclopedia\FarEncyclopedia.ru.chm]]
HH.HtmlHelpW(nil,_w(chmfile),HH_.DISPLAY_TOPIC,0) --https://msdn.microsoft.com/ru-ru/library/ms670084

-- поиск в индексе:
local keywords = "$Continue"
HH.HtmlHelpW(nil,_w(chmfile),HH_.DISPLAY_INDEX,ffi.cast("DWORD",_w(keywords)))
Аналогичным образом можно делать всё остальное, описанное на MSDN (к сожалению самое интересно всё равно не будет работать, баги в апи..)
Last edited by John Doe on Sat 16 Sep, 2017 16:55, edited 1 time in total.

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

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

Post by John Doe » Tue 05 Sep, 2017 10:33

Посмотрел краем уха ваш макрос, и вижу что для поиска ключевых слов в файле вы открываете редактор :facepalm:

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

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

Post by John Doe » Tue 05 Sep, 2017 10:45

John Doe wrote:
Tue 05 Sep, 2017 10:27
Это только черновик, он определённо не доделан..
Возможно вам проще будет воспользоваться keyhh.

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 » Tue 05 Sep, 2017 23:42

John Doe wrote:
Tue 05 Sep, 2017 10:33
Посмотрел краем уха ваш макрос, и вижу что для поиска ключевых слов в файле вы открываете редактор :facepalm:
  1. Я знаю только ещё один способ поиска в файле: через io.lines. Так я и делаю, если приходится "вытаскивать" индекс (и оглавление) из chm во внешний файл. Но тут есть ограничение: требуется, чтобы был установлен 7-zip; требуется место для распаковки (и вообще не люблю внешних файлов: некоторые мои клиенты напрочь запрещают запись на диск!). Этим способом я пользуюсь, если первоначальный редактор модальный (тогда просто не открыть индекс в редакторе).
  2. Если исходный редактор (из которого вызывается помощь) не модальный, то я для поиска использую плагин arclite, открываю индексы в редакторе и ищу.
Я спрашивал, можно ли плагином arclite "вытащить" файл из архива. Увы, ответа (ну, кроме последовательности клавиш) я не получил. Надо мной даже посмеялись (типа наличие плагина вовсе не означает, что его можно вызвать через CallPlugin). Хотя мне кажется, что это - плохой стиль.
Если знаете другой способ поиска в файле внутри архива и расскажете мне о нём - буду признателен.

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 » Tue 05 Sep, 2017 23:54

John Doe wrote:
Tue 05 Sep, 2017 10:45
Возможно вам проще будет воспользоваться keyhh.
Лично мне - да. Я даже могу сделать маленькую утилитку (увы, на дельфях; просто другого не осталось), ищущую по имени файла и ключевому слову. Просто хотелось сделать всё в макросе. В частности, чтоб не зависеть от версии ОС.

Post Reply

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