Page 1 of 6

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

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


Active-Help.013.7z
Версия 013 с модулями
(21.18 KiB) Downloaded 57 times

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

Posted: Sat 05 Aug, 2017 07:35
by Shmuel
Неплохо бы прилагать к сообщению файл(ы) макроса (архив zip или 7z). Некоторые пользователи не любят ковыряться с копи-пастой.

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

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

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

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

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

Posted: Sat 05 Aug, 2017 12:56
by buniak_a_h
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? Почему для хранения одной переменной требуется две строки? Что-то типа имени секции и имени параметра?
---
Что-то у меня с интуицией плоховато.

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

Posted: Sat 05 Aug, 2017 13:58
by John Doe
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" (кстати опечатка в заголовке)

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

Posted: Mon 04 Sep, 2017 23:31
by bigvax
Здраствуете.
У меня макрос почему-то «дерется» с плагином 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 ] ║ ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

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

Posted: Mon 04 Sep, 2017 23:43
by HaRT
 ! Message from: HaRT
bigvax, отредактируйте, пожалуйста, своё сообщение, заключив всё сообщение об ошибке в тэг ascii (над полем ввода комментария есть соответствующая кнопка).

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

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

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

Posted: Tue 05 Sep, 2017 02:43
by bigvax
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), соответственно через какое-то время у тебя висит куча открытых копий одного файла помощи.
Возможно стоит проверять, что файл уже открыт, и производить новый поиск в нем.

Заранее благодарен.

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

Posted: Tue 05 Sep, 2017 09:36
by buniak_a_h
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 определять, закрыто ли приложение, вызванное ранее. А писать нечто на "серьёзном" языке программирования - это уже действительно плагин, я не писал. И хотя не боги горшки обжигают, но на это надо время, а у меня завал. Так что пока проще закрывать хелпы.

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

Posted: Tue 05 Sep, 2017 10:27
by John Doe
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 (к сожалению самое интересно всё равно не будет работать, баги в апи..)

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

Posted: Tue 05 Sep, 2017 10:33
by John Doe
Посмотрел краем уха ваш макрос, и вижу что для поиска ключевых слов в файле вы открываете редактор :facepalm:

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

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

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

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

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

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