Менеджер Lua-скриптов для Farа

Здесь выкладываются готовые к использованию макросы и скрипты.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

Выводит список всех Lua-скриптов Farа и позволяет манипулировать ими.









Требуемая версия Far 3.0.5210+.

Начиная с версии 4.0, скрипт выполнен в виде модуля и набора вызывающих макросов.

Attachments
LuaManager.6.0.2.7z
Версия для Far 3.0.0.5934+
(65.47 KiB) Downloaded 81 times
LuaManager.5.2.0.7z
Версия для Far 3.0.0.5210+
(58.78 KiB) Downloaded 215 times
LuaManager.5.0.6.7z
Последняя опубликованная версия, поддерживающая Far 3.0.0.4000 и выше
(59.02 KiB) Downloaded 347 times
LuaManager.3.1.11.7z
Последняя версия, выполненная не в виде модуля
(50.56 KiB) Downloaded 510 times
Last edited by IgorZ on Wed 25 Oct, 2023 10:02, edited 24 times in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

Latest post of the previous page:

IgorZ wrote: Thu 03 May, 2018 06:41 Если вкратце - стандартная функция не учитывает строки с комментариями.
Хотелось бы подробностей
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

John Doe wrote: Thu 03 May, 2018 07:26
IgorZ wrote: Thu 03 May, 2018 06:41 Если вкратце - стандартная функция не учитывает строки с комментариями.
Хотелось бы подробностей
Вот как ожидаешь работу конвертора moon->lua и связанных с этим функций? Запоминает номера строк, преобразует, сохраняет соответствие исходных строк конечным. Потом, получив номер строки .lua-текста, соответствующая функция выдаёт номер строки в исходном .moon-тексте.
На самом же деле всё работает почти так: вначале конвертор выкидывает все строки, содержащие только комментарии, из исходного текста (вероятно, комментарии из строк с кодом тоже обрезаются, но на определение номеров строк это не влияет в любом случае). И только потом запоминает номера строк обескомментаренного .moon и далее по тексту. Что интересно, полностью пустые строки, не содержащие даже комментария, при конвертации не выбрасываются и учитываются в нумерации.
В результате, если, скажем, я получаю номер первой строки функции=200, с помощью errors.reverse_line_number получаю, что в исходнике.moon это строка 50, то чтобы получить реальную строку, надо отсчитать 49 строк, при этом пропуская, но не считая, строки, состоящие только из комментария. Во всяком случае, когда я стал высчитывать реальные строки в .moon-файлах именно по такому алгоритму, все ранее имевшиеся проблемы исчезли, и результат стал выдаваться точно, а не "куда-то туда".
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

Наверно стоит сюда написать https://github.com/leafo/moonscript/issues
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Менеджер Lua-скриптов для Farа

Post by Shmuel »

John Doe wrote: Thu 03 May, 2018 12:10 Наверно стоит сюда написать https://github.com/leafo/moonscript/issues
Предварительно проверив, что это ещё не починили в репозитории.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

John Doe wrote: Thu 03 May, 2018 12:10 Наверно стоит сюда написать https://github.com/leafo/moonscript/issues
Возможно, было бы неплохо, но для этого надо сначала убедиться, что в новых версиях (а в Far, как я понимаю, Moon не обновляется, так же, как Lua) это не исправлено, затем зарегистрироваться, писать, общаться - и всё это на английском, в котором я не особо силён: прочитать или написать примитивный текст смогу, но медленно, а в случае общения с носителем языка могу просто забуксовать из-за непонимания неформальных оборотов. Так что с радостью уступлю кому-либо более подкованному в английском, или же более заинтересованному в исправлении.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Менеджер Lua-скриптов для Farа

Post by zg »

IgorZ wrote: Thu 03 May, 2018 12:25что в новых версиях (а в Far, как я понимаю, Moon не обновляется, так же, как Lua)
в фар версия 0.5.0. на сайте новее я не вижу, обновляться на транк без достаточных оснований (возможно я что-то пропустил, всегда можно написать в соответствующей теме) — не вижу смысла.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

IgorZ wrote: Thu 03 May, 2018 12:25 Так что с радостью уступлю кому-либо более подкованному в английском, или же более заинтересованному в исправлении.
Готов запостить, если напишете (в ЛС) текст на русском, с примитивным примером, который не требует фара для воспроизведения.
(Тут можно проверить http://moonscript.org/compiler/)
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

Версия 5.0.1 -
  • Шаблон события ExitFar скорректирован в соответствии с изменениями в плагине.
    Событие "ExitFAR" вызывается в следующих случаях: (a) выход из Far Manager, (b) выгрузка плагина LuaMacro, (c) выгрузка либо перезагрузка макросов. Обработчик события получает один аргумент булевого типа: false для случаев (a) и (b); true для случая (c).
  • Исправлена ошибка с обработкой нажатия кнопки "Панели" в диалоге конфигурации (с ру-борда).
  • Ещё всякие мелочи.
John Doe wrote: Thu 03 May, 2018 13:07
IgorZ wrote: Thu 03 May, 2018 12:25 Так что с радостью уступлю кому-либо более подкованному в английском, или же более заинтересованному в исправлении.
Готов запостить, если напишете (в ЛС) текст на русском, с примитивным примером, который не требует фара для воспроизведения.
(Тут можно проверить http://moonscript.org/compiler/)
Я был не совсем прав. Всё ещё интереснее (хотя комментарии как-то влияют на результат). Скачал и поставил Lua 5.1 и moonscript 0.5, освоился (всё же, в Far куда удобнее среда работы), начал разбираться. В package.loaded есть moonscript.line_tables, содержащий таблицы, одну на каждый .moon-файл: каждая таблица содержит строки вида @имя_.moon-файла[№_строки_в_скомпилированном_.lua-файле] = позиция_символа,_считая_от_начала_файла_в_исходном_.moon-файле. Эти данные, при внимательном рассмотрении, выглядят достаточно странно.
Положить приложенные файлы в каталог с Lua (по крайней мере, я экспериментировал именно там) и выполнить команду lua test_line_num.moon.lua >res. В файле res видно, что позиции выглядят довольно странно. Немного порывшись в moonscript.lua, обнаружил, что позиции определяются где-то в процессе вызова функции string из moonscript.parse. Туда я уже не полез, поскольку код на первый взгляд показался довольно запутанным.
Вот результат моих изысканий на сегодняшний день.
Attachments
test_line_num.moon
(321 Bytes) Downloaded 384 times
test_line_num.moon.lua
(486 Bytes) Downloaded 368 times
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

IgorZ wrote: Fri 18 May, 2018 07:11 В файле res видно, что позиции выглядят довольно странно.
  1. ----------------------------------
  2.  
  3. @.\test_line_num.moon    -- >>  table: 0x004ce020  
  4.  
  5. ----------------------------------
  6.  
  7. ----------------------------------
  8.  
  9. Macro
  10.  
  11.   id:"1A13C75D-8599-480F-A3C0-E469DC60BB94"
  12.  
  13.   area:"Common"
  14.  
  15.   key:"CtrlAltMultiply"
  16.  
  17.   description:"Test"
  18.  
  19. --  filemask:""
  20.  
  21. --  flags:""
  22.  
  23. --  priority:50
  24.  
  25. --  sortpriority:50
  26.  
  27. --  condition:(key) -> true
  28.  
  29.   action: ->
  30.  
  31.     far.Show "test"
  32.  
  33.  
  34.  
  35. ["1"] = 71
  36.  
  37. Macro
  38.  
  39.   id:"1A13C75D-8599-480F-A3C0-E469DC60BB94"
  40.  
  41.   area:"Common"
  42.  
  43.   key:"CtrlAltMultiply"
  44.  
  45.   description:"Test"
  46.  
  47. --  filemask:""
  48.  
  49. --  flags:""
  50.  
  51. --  priority:50
  52.  
  53. --  sortpriority:50
  54.  
  55. --  condition:(key) -> true
  56.  
  57.   action: ->
  58.  
  59.     far.Show "test"
  60.  
  61.  
  62.  
  63. ["2"] = 82
  64.  
  65. "1A13C75D-8599-480F-A3C0-E469DC60BB94"
  66.  
  67.   area:"Common"
  68.  
  69.   key:"CtrlAltMultiply"
  70.  
  71.   description:"Test"
  72.  
  73. --  filemask:""
  74.  
  75. --  flags:""
  76.  
  77. --  priority:50
  78.  
  79. --  sortpriority:50
  80.  
  81. --  condition:(key) -> true
  82.  
  83.   action: ->
  84.  
  85.     far.Show "test"
  86.  
  87.  
  88.  
  89. ["3"] = 128
  90.  
  91. "Common"
  92.  
  93.   key:"CtrlAltMultiply"
  94.  
  95.   description:"Test"
  96.  
  97. --  filemask:""
  98.  
  99. --  flags:""
  100.  
  101. --  priority:50
  102.  
  103. --  sortpriority:50
  104.  
  105. --  condition:(key) -> true
  106.  
  107.   action: ->
  108.  
  109.     far.Show "test"
  110.  
  111.  
  112.  
  113. ["4"] = 143
  114.  
  115. "CtrlAltMultiply"
  116.  
  117.   description:"Test"
  118.  
  119. --  filemask:""
  120.  
  121. --  flags:""
  122.  
  123. --  priority:50
  124.  
  125. --  sortpriority:50
  126.  
  127. --  condition:(key) -> true
  128.  
  129.   action: ->
  130.  
  131.     far.Show "test"
  132.  
  133.  
  134.  
  135. ["5"] = 175
  136.  
  137. "Test"
  138.  
  139. --  filemask:""
  140.  
  141. --  flags:""
  142.  
  143. --  priority:50
  144.  
  145. --  sortpriority:50
  146.  
  147. --  condition:(key) -> true
  148.  
  149.   action: ->
  150.  
  151.     far.Show "test"
  152.  
  153.  
  154.  
  155. ["7"] = 292
  156.  
  157. far.Show "test"
  158.  
  159.  
  160.  
  161. ["9"] = 71
  162.  
  163. Macro
  164.  
  165.   id:"1A13C75D-8599-480F-A3C0-E469DC60BB94"
  166.  
  167.   area:"Common"
  168.  
  169.   key:"CtrlAltMultiply"
  170.  
  171.   description:"Test"
  172.  
  173. --  filemask:""
  174.  
  175. --  flags:""
  176.  
  177. --  priority:50
  178.  
  179. --  sortpriority:50
  180.  
  181. --  condition:(key) -> true
  182.  
  183.   action: ->
  184.  
  185.     far.Show "test"
  186.  
  187.  
  188.  
  189. ----------------------------------
Поясните
Last edited by John Doe on Fri 18 May, 2018 09:10, edited 1 time in total.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

John Doe wrote: Fri 18 May, 2018 09:08
IgorZ wrote: Fri 18 May, 2018 07:11 В файле res видно, что позиции выглядят довольно странно.
  1. ----------------------------------
  2.  
  3. @.\test_line_num.moon    -- >>  table: 0x004ce020  
  4.  
  5. ----------------------------------
  6.  
  7. ----------------------------------
  8.  
  9. Macro
  10.  
  11.   id:"1A13C75D-8599-480F-A3C0-E469DC60BB94"
  12.  
  13.   area:"Common"
  14.  
  15.   key:"CtrlAltMultiply"
  16.  
  17.   description:"Test"
  18.  
  19. --  filemask:""
  20.  
  21. --  flags:""
  22.  
  23. --  priority:50
  24.  
  25. --  sortpriority:50
  26.  
  27. --  condition:(key) -> true
  28.  
  29.   action: ->
  30.  
  31.     far.Show "test"
  32.  
  33.  
  34.  
  35. ["1"] = 71
  36.  
  37. Macro
  38.  
  39.   id:"1A13C75D-8599-480F-A3C0-E469DC60BB94"
  40.  
  41.   area:"Common"
  42.  
  43.   key:"CtrlAltMultiply"
  44.  
  45.   description:"Test"
  46.  
  47. --  filemask:""
  48.  
  49. --  flags:""
  50.  
  51. --  priority:50
  52.  
  53. --  sortpriority:50
  54.  
  55. --  condition:(key) -> true
  56.  
  57.   action: ->
  58.  
  59.     far.Show "test"
  60.  
  61.  
  62.  
  63. ["2"] = 82
  64.  
  65. "1A13C75D-8599-480F-A3C0-E469DC60BB94"
  66.  
  67.   area:"Common"
  68.  
  69.   key:"CtrlAltMultiply"
  70.  
  71.   description:"Test"
  72.  
  73. --  filemask:""
  74.  
  75. --  flags:""
  76.  
  77. --  priority:50
  78.  
  79. --  sortpriority:50
  80.  
  81. --  condition:(key) -> true
  82.  
  83.   action: ->
  84.  
  85.     far.Show "test"
  86.  
  87.  
  88.  
  89. ["3"] = 128
  90.  
  91. "Common"
  92.  
  93.   key:"CtrlAltMultiply"
  94.  
  95.   description:"Test"
  96.  
  97. --  filemask:""
  98.  
  99. --  flags:""
  100.  
  101. --  priority:50
  102.  
  103. --  sortpriority:50
  104.  
  105. --  condition:(key) -> true
  106.  
  107.   action: ->
  108.  
  109.     far.Show "test"
  110.  
  111.  
  112.  
  113. ["4"] = 143
  114.  
  115. "CtrlAltMultiply"
  116.  
  117.   description:"Test"
  118.  
  119. --  filemask:""
  120.  
  121. --  flags:""
  122.  
  123. --  priority:50
  124.  
  125. --  sortpriority:50
  126.  
  127. --  condition:(key) -> true
  128.  
  129.   action: ->
  130.  
  131.     far.Show "test"
  132.  
  133.  
  134.  
  135. ["5"] = 175
  136.  
  137. "Test"
  138.  
  139. --  filemask:""
  140.  
  141. --  flags:""
  142.  
  143. --  priority:50
  144.  
  145. --  sortpriority:50
  146.  
  147. --  condition:(key) -> true
  148.  
  149.   action: ->
  150.  
  151.     far.Show "test"
  152.  
  153.  
  154.  
  155. ["7"] = 292
  156.  
  157. far.Show "test"
  158.  
  159.  
  160.  
  161. ["9"] = 71
  162.  
  163. Macro
  164.  
  165.   id:"1A13C75D-8599-480F-A3C0-E469DC60BB94"
  166.  
  167.   area:"Common"
  168.  
  169.   key:"CtrlAltMultiply"
  170.  
  171.   description:"Test"
  172.  
  173. --  filemask:""
  174.  
  175. --  flags:""
  176.  
  177. --  priority:50
  178.  
  179. --  sortpriority:50
  180.  
  181. --  condition:(key) -> true
  182.  
  183.   action: ->
  184.  
  185.     far.Show "test"
  186.  
  187.  
  188.  
  189. ----------------------------------
Поясните
Для наглядности дополнительно приведу скомпилированный из test_line_num.moon .lua.
  1. return Macro({
  2.  
  3.   id = "1A13C75D-8599-480F-A3C0-E469DC60BB94",
  4.  
  5.   area = "Common",
  6.  
  7.   key = "CtrlAltMultiply",
  8.  
  9.   description = "Test",
  10.  
  11.   action = function()
  12.  
  13.     return far.Show("test")
  14.  
  15.   end
  16.  
  17. })
Что сразу видно: шестая строка есть. Причём, значащая, и соответствие ей в исходном .moon имеется. Однако, в таблице шестого элемента нет.
Кроме того, настораживает, что позиция в элементах 2-5 указывает не на начало строки, и даже не на первый непробельный символ (и то, и другое кажется достаточно логичным вариантом), а на значение поля таблицы. Впрочем, здесь ошибки вполне может и не быть: как именно работает алгоритм запоминания позиции, я не разбирался, а строка, в итоге, указана верная.
К отсутствию восьмого элемента, вроде бы, претензий нет - восьмая строка в .lua появилась из-за разницы в идеологии Lua и Moon и не имеет аналога в .moon. Но девятая строка того же происхождения! А девятый элемент есть, и по значению равен первому (что, на мой взгляд, логично: именно там открываются таблица и вызов функции Macro, закрывающиеся в девятой строке). Так что же неверно: наличие девятого элемента, или отсутствие восьмого (ведь восьмая строка - это закрытие функции, начало определения которой находится в шестой строке)?
Кстати, сейчас подумал: а ведь, похоже, правильно именно наличие девятого элемента, а отсутствие восьмого - следствие отсутствия шестого.
В общем, всё это выглядит несколько не так, как ожидалось бы, исходя из здравого смысла. А отсутствие шестого элемента просто приводит к тому, что LuaManager не в состоянии определить, в какой строке начинается функция action (это лично меня волнует больше всего: поддержка Moon оказывается какой-то сомнительной по независящим от меня обстоятельствам; и это же единственное, что выглядит безусловной ошибкой).
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

IgorZ wrote: Fri 18 May, 2018 09:55 В общем, всё это выглядит несколько не так, как ожидалось бы, исходя из здравого смысла.
Это не удивительно, ведь тут мы используем недокументированный внутренний интерфейс.
Исходя из этого отсутствие в таблице каких-то данных нельзя назвать ошибкой.

А получилось ли добиться неверных номеров строк?
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

John Doe wrote: Fri 18 May, 2018 10:10
IgorZ wrote: Fri 18 May, 2018 09:55 В общем, всё это выглядит несколько не так, как ожидалось бы, исходя из здравого смысла.
Это не удивительно, ведь тут мы используем недокументированный внутренний интерфейс.
Исходя из этого отсутствие в таблице каких-то данных нельзя назвать ошибкой.
Этот недокументированный интерфейс использует документированная moonscript.errors.reverse_line_number, описание которой я выудил (если память не изменяет) с официального сайта moonscript. И использует именно этим способом: получает номер строки в .lua, если элемент с таким номером есть в соответствующей таблице, берёт его значение, иначе уменьшает номер строки на 1, пока не найдёт элемент с таким номером. А затем берёт содержимое файла из кэша (или читает его, если в кэше нет) и match-ем считает, сколько строк имеется от начала файла до полученной из таблицы позиции.
John Doe wrote: Fri 18 May, 2018 10:10 А получилось ли добиться неверных номеров строк?
Если бы я использовал в примере reverse_line_number, то для 6-й строки .lua я получил бы 7-ю строку .moon вместо 13-й. Проверять сейчас некогда. Может, позже. Если нет, то на следующей неделе.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

IgorZ wrote: Fri 18 May, 2018 11:27 Этот недокументированный интерфейс использует документированная moonscript.errors.reverse_line_number, описание которой я выудил (если память не изменяет) с официального сайта moonscript.
Не находит https://google.com/search?q=site:moonsc ... ine_number
IgorZ wrote: Fri 18 May, 2018 11:27 Если бы я использовал в примере reverse_line_number, то для 6-й строки .lua я получил бы 7-ю строку .moon вместо 13-й.
Определённо неточность в определении строк присутствует, я сталкивался, и тоже как-то решал эту проблему.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

John Doe wrote: Fri 18 May, 2018 18:10
IgorZ wrote: Fri 18 May, 2018 11:27 Этот недокументированный интерфейс использует документированная moonscript.errors.reverse_line_number, описание которой я выудил (если память не изменяет) с официального сайта moonscript.
Не находит https://google.com/search?q=site:moonsc ... ine_number
Тогда даже и не скажу, где я это нашёл. Всё-таки, почти четыре года прошло, как я в этом разбирался.
John Doe wrote: Fri 18 May, 2018 18:10
IgorZ wrote: Fri 18 May, 2018 11:27 Если бы я использовал в примере reverse_line_number, то для 6-й строки .lua я получил бы 7-ю строку .moon вместо 13-й.
Определённо неточность в определении строк присутствует, я сталкивался, и тоже как-то решал эту проблему.
Я тупо прибавляю одну строку (с последующим уточнением в сторону начала текста, если надо). Но помогает не всегда. Кстати, в приведённом .moon примере не спасает.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

В связи с тем, что, как выяснилось, far.FreeSettings закрывает открытые настройки не для текущего скрипта, а глобально, выкладываю версию с исправлениями. Версия 5.0.2 -
  • Добавлен отдельный макрос вставки панельного плагина. В версии 5.0 забыл про него.
  • far.FreeSettings() заменён на <settings>:Free().
  • Прочий рефакторинг, делавшийся потихоньку.
  • Мелкие правки.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

Версия 5.0.3 -
  • Добавлена фильтрация по фиктивному/отстутствующему key. Теперь, если при фильтрации клавиш установить фильтр в "none" (регистр неважен), то покажутся только те макросы, у которых поле key не указано, или в него записано не название клавиши и не регулярное выражение (к примеру: "none", "Dummy", "Нет клавиши" и т. п.).
    Замечание: Клавиатурные комбинации MacroEx, к сожалению, отфильтровать, как корректные, пока не получилось.
  • Доработана поддержка несохранённых клавиатурных макросов: теперь более кореектно выводится информация, и, вроде бы, нет больше возможных ошибок из-за отсутствия имени файла.
Post Reply

Return to “Полезные макросы и скрипты”