Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
John Doe
Бюрократ
Posts: 12234
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Tue 16 Jun, 2015 12:36

Luacheck это статический анализатор для Lua.
Luacheck может обнаруживать разнообразные проблемы, такие как использование неопределённых глобальных переменных, неиспользованные переменные и значения, доступ к неинициализированным переменным, недостижимый код и многое другое.

А для удобной работы с luacheck в фаре предлагаю данный пакет скриптов, обеспечивающий работу Luacheck в редакторе и в командной строке.
Кроме того, в редакторе для Luacheck обеспечивается прозрачная "трансляция" MoonScript, что позволяет анализировать и *.moon-файлы.

Инструкции по установке, настройке, и работе — во встроенной справке.

Требования:
  • FAR 3 не старше b4831
  • luacheck не ниже v0.19
Attachments
luaсheck_far_v1.4.7z
(21.55 KiB) Downloaded 127 times
Last edited by John Doe on Sun 08 Oct, 2017 14:21, edited 1 time in total.

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Thu 26 Oct, 2017 09:04

Latest post of the previous page:

IgorZ wrote:
Thu 26 Oct, 2017 06:10
MacroComplete от SimSU работает динамически, очень удобно.
Согласен, но тут у нас немного другая ситуация.
IgorZ wrote:
Thu 26 Oct, 2017 06:10
Может, сделать вариант, когда глобальные переменные проверяются динамически, по наличию поля с таким именем в таблице _G?
Так и было по умолчанию в luacheck до версии 0.19.
Теперь же всё должно целиком определяться конфигом, и это принципиальная позиция автора: результат проверки не должен зависеть от текущего окружения.
(Для примера: при запуске из командной строки ваших добавлений в _G не будет.)

Поэтому рекомендую добавить нужные вам идентификаторы в конфиг. Более того, можно написать и "умный" конфиг, учитывающий все "добавления" автоматически. Но подумайте, действительно ли вам это надо?
Что представляют собой эти идентификаторы? Если это функции, используемые для отладки, то их не должно остаться в финальной версии, а значит и хорошо, что luacheck предупреждает.

Кроме того, рекомендую присмотреться к inline-опциям, позволяющим тонко менять настройки локально.

P.S.
package.moonpath я добавлю, а пока используйте конфиг, или инлайн-опцию.

Code: Select all

--luacheck: read globals package.moonpath

IgorZ
Posts: 603
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 37 times

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by IgorZ » Thu 26 Oct, 2017 11:11

John Doe wrote:
Thu 26 Oct, 2017 09:04
IgorZ wrote:
Thu 26 Oct, 2017 06:10
Может, сделать вариант, когда глобальные переменные проверяются динамически, по наличию поля с таким именем в таблице _G?
Так и было по умолчанию в luacheck до версии 0.19.
Теперь же всё должно целиком определяться конфигом, и это принципиальная позиция автора: результат проверки не должен зависеть от текущего окружения.
А как опцию? К примеру, std = "dynamic". Авторская позиция понятна, но раз уж есть возможность иметь несколько конфигураций, почему бы не сделать и такой вариант?

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Thu 26 Oct, 2017 11:42

IgorZ wrote:
Thu 26 Oct, 2017 11:11
почему бы не сделать и такой вариант?
Главный вопрос: зачем?
Я верю что надо, но от обоснования зависит в какой форме это лучше реализовать.

В частности, напоминаю, что std это не единственный способ задать глобальные идентификаторы.

IgorZ
Posts: 603
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 37 times

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by IgorZ » Thu 26 Oct, 2017 12:50

John Doe wrote:
Thu 26 Oct, 2017 11:42
IgorZ wrote:
Thu 26 Oct, 2017 11:11
почему бы не сделать и такой вариант?
Главный вопрос: зачем?
Я верю что надо, но от обоснования зависит в какой форме это лучше реализовать.

В частности, напоминаю, что std это не единственный способ задать глобальные идентификаторы.
Ну, например, у меня есть активно используемая таблица far.Guids.Plugins. Во-первых, её содержание достаточно объёмно, и забивать всё это вручную, как минимум, неохота. Во-вторых, оно ещё и различается для разных экземпляров Far (а у меня их несколько). Это тоже прибавит головной боли.
Ещё одно преимущество - отсутствие необходимости вносить изменения в список при появлении новых глобальных переменных в новых версиях LuaFar. И гарантия отсутствия ошибок и опечаток в списке.

Кстати, можно, наверное, сделать компромиссный вариант: скажем, таблица глобальных имён заполняется при вызове специальной функции из _macroinit.lua и далее сохраняется неизменной. Хотя лично меня вполне устроило бы старое поведение.

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Thu 26 Oct, 2017 13:33

IgorZ wrote:
Thu 26 Oct, 2017 12:50
Ну, например, у меня есть активно используемая таблица far.Guids.Plugins. Во-первых, её содержание достаточно объёмно, и забивать всё это вручную, как минимум, неохота. Во-вторых, оно ещё и различается для разных экземпляров Far (а у меня их несколько).
То что отличается это не страшно, можно забить максимально полный (и не обязательно вручную).
Хотя в вашем случае мне кажется строгий контроль содержания Plugins не требуется, а значит можно "задекларировать" саму таблицу без содержимого.
IgorZ wrote:
Thu 26 Oct, 2017 12:50
Ещё одно преимущество - отсутствие необходимости вносить изменения в список при появлении новых глобальных переменных в новых версиях LuaFar.
Сомнительное преимущество. Во-первых, это не позволит выявить ваши персональные идентификаторы, что важно, если скрипты не только на этой машине должны запускаться.
Во-вторых, это никак не поможет учесть идентификаторы, отсутствующих в _G (например загрузочные функции).
И в-третьих, добавить-то не сложно на самом деле.
IgorZ wrote:
Thu 26 Oct, 2017 12:50
И гарантия отсутствия ошибок и опечаток в списке.
В моём списке я гарантирую отсутствие опечаток, поскольку изначально получал его из _G, а затем сверял с мануалами.
Могут оставаться конечно какие-то неточности, но совсем в других аспектах (может чего-то ещё не хватать, или неправильно определёно RO/RW-свойство).

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Thu 26 Oct, 2017 13:39

IgorZ wrote:
Thu 26 Oct, 2017 12:50
Хотя лично меня вполне устроило бы старое поведение.
Старое поведение таково, что элементы _G учитывались в один уровень, не рекурсивно, и по умолчанию считались доступными для записи.
Т.е. luacheck знал, что есть таблица far, а дальше ему всё равно, хоть far.Plugins, хоть far.Qwerty, хоть far = Far.

Вернуть его не просто, а очень просто, например как вы там предлагали в _macroinit:

Code: Select all

local G = {}
for k,v in pairs(_G) do G[#G+1] = k end
require "luacheck.builtin_standards".G = {globals=G}
Но боюсь, это не то, чего вы хотели)

Развиваем мысль дальше:
Last edited by John Doe on Sat 28 Oct, 2017 11:32, edited 1 time in total.

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Sat 28 Oct, 2017 16:59

Реализуя не связанную идею подошёл к вопросу с другой стороны: можно ведь дополнительно анализировать список, полученный от luacheck.
Так что заодно и ваше пожелание осуществил.

buniak_a_h
Posts: 705
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 67 times
Been thanked: 19 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by buniak_a_h » Fri 18 May, 2018 04:00

Здравствуйте!
У меня предложение: сделать мелкое, но (как показал опыт) полезное дополнение к скрипту - "подсказка" для вставки в текст слов (ключевых слов языка или имена полей/пропертей таблиц). Первый маленький скрипт на эту тему я сделал; естественно, там много недоделок (не подставляются известные в контексте имена переменных, имена методов (например, запросить тип переменной и дать выбрать).
P/S. Я знаю о существовании скрипта WordComplee в пакете Rh_Scripts. НО! (а) Одна инструкция по установке осложняет даже ознакомление; (б) Требует установки плагина LuaFAR for Editor, а его функции во многом пересекаются (дублируют) то, что у меня реализовано скриптами, и сделано удобнее (и гибче, т.к. доступен текст). От этого плагина мне (ПОКА) пришлось отказаться.. (в) да и вообще - не хочется устанавливать ещё один плагин, если вопрос решается скриптом. А в вашей системе LuaCheck есть практически вся информация, необходимая для выдачи подсказок (в т.ч и информация о видимости переменных) .

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Fri 18 May, 2018 08:39

buniak_a_h wrote:
Fri 18 May, 2018 04:00
полезное дополнение к скрипту - "подсказка" для вставки в текст слов (ключевых слов языка или имена полей/пропертей таблиц). Первый маленький скрипт на эту тему я сделал
...
А в вашей системе LuaCheck есть практически вся информация, необходимая для выдачи подсказок (в т.ч и информация о видимости переменных)
В ближайшее время я не планирую включать такое дополнение в пакет, но вы вполне можете развивать свой скрипт, "эксплуатируя" данные LuaCheck (удобнее будет в отдельной теме).
buniak_a_h wrote:
Fri 18 May, 2018 04:00
Требует установки плагина LuaFAR for Editor
Рекомендую использовать LuaMacro-версии: viewtopic.php?f=60&t=10954, viewtopic.php?f=60&t=10315

Кроме того, существует и независимая от LuaFAR реализация, Editor_WordComplete: viewtopic.php?f=60&t=7075
(если не верите, что это - удобно)]
Конечно верю, сам хотел написать такой скрипт.

buniak_a_h
Posts: 705
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 67 times
Been thanked: 19 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by buniak_a_h » Fri 18 May, 2018 11:16

John Doe wrote:
Fri 18 May, 2018 08:39
Рекомендую использовать LuaMacro-версию: viewtopic.php?f=60&t=10954

Кроме того, существует и независимая от LuaFAR реализация, Editor_WordComplete
Возможно, я неточно описал то, что делает мой макрос...
В отличие от плагина WordComlete и указанного Вами макроса, мой не использует те слова, которые уже имеются в тексте! Правда, Word Comlete из пакета Rh_Scripts я не проверял, но есть у меня подозрение, что он делает тоже самое.
Мой:
(а) заточен на написание макросов на LUA (и, возможно, moon - не знаю) и
(б) для поиска не использует имеющийся текст, а берёт список keywords из Вашего модуля, а также список доступных полей и пропертей таблицы _G (со всеми вложенными).
Это больше похоже на сервис IDE (например, в Delphi-7 настройка, включающая такой сервис, называется Code Insight -> Code completion). Дело за определением доступности имён переменных в конкретном контексте. Ваша LuaCheck это умеет делать совершенно точно (диагностирует же обращение к неопределённой переменной!). И это было бы кузяво - накладывать такой фильтр на список слов, поставляемых тем же WordComplete...

buniak_a_h
Posts: 705
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 67 times
Been thanked: 19 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by buniak_a_h » Fri 18 May, 2018 11:32

John Doe wrote:
Fri 18 May, 2018 08:39
вы вполне можете развивать свой скрипт, "эксплуатируя" данные LuaCheck (удобнее будет в отдельной теме).
Воспользовался Вашим советом. LuaComplete - завершение слов макроса на LUA

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by HaRT » Tue 22 May, 2018 12:57

1. В название файла luaсheck_far_v1.4.7z, вложенного в заглавное сообщение, вскралась кириллическая ‘с’.

2. Распаковал все файлы в папку Scripts, открыл lua-файл в редакторе, вызвал LuaCheck, в меню с сообщениями нажал F1. Файл luacheck_editor.lua лежит рядом с luacheck_far.ru.hlf, язык Справки “Russian (Русский)”. ЧЯДНТ?

3. Если нажать F1 из кратковременного серенького окошка No warnings (где, между прочим, F1 фигурирует в числе доступных клавиш), то почему-то открывается Help - BufferScroll. :shock:
Last edited by HaRT on Tue 22 May, 2018 13:25, edited 1 time in total.
Reason: Добавлен пункт 3 (про F1 --> Help - BufferScroll)
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Tue 22 May, 2018 13:31

> Requested help topic not found: Editor

В редакторе откройте файл справки и поищите раздел @Editor
Если не найдёте, значит ваш файл не соответствует тому, что в шапке.

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by HaRT » Tue 22 May, 2018 13:38

John Doe wrote:
Tue 22 May, 2018 13:31
поищите раздел @Editor
из того же, архива, что и скрипты, раздел @Editor там, разумеется, есть. Может ли дело быть в том, что у меня язык Фара английский, а язык Справки — русский?

P.S.
4. Также неплохо бы включить в Справку описание клавиши CtrlPgDn (как возврат после CtrlPgUp).
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Tue 22 May, 2018 14:41

На днях обновлю весь архив, а пока прилагаю свой luacheck_far.ru.hlf.
HaRT wrote:
Tue 22 May, 2018 13:38
Также неплохо бы включить в Справку описание клавиши CtrlPgDn (как возврат после CtrlPgUp).
А нет такой функциональности.
Вместо "возврата" следует вернуться на выбранный пункт списка, возможно при нажатии CtrlPgDn генерируется соответствующее событие, но это не более чем совпадение, справедливое и для каких-то других комбинаций.
Last edited by John Doe on Tue 22 May, 2018 15:07, edited 1 time in total.

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by HaRT » Tue 22 May, 2018 15:05

John Doe wrote:
Tue 22 May, 2018 14:41
На днях обновлю весь архив, а пока прилагаю свой luacheck_far.ru.hlf.
Спасибо, однако в плане вызова из редактора ничего не изменилось — ни из списка предупреждений, ни из окна об их отсутствии.
John Doe wrote:
Tue 22 May, 2018 14:41
возможно при нажатии CtrlPgDn генерируется соответствующее событие
Тогда это очень ценный побочный эффект, который надо беречь, потому что иногда нажимаешь CtrlPgUp и понимаешь, что хочется перейти всё-таки по основному месту. И вот тут непонятно, как вернуться, особенно если в списке единственный элемент.
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe » Tue 22 May, 2018 15:18

HaRT wrote:
Tue 22 May, 2018 15:05
Тогда это очень ценный побочный эффект
Посмотрел, всё-таки не побочный эффект.
В разделе @EditorMore сказано
...чтобы синхронизировать позицию редактора с текущим предупреждением можно
воспользоваться #Ctrl-Enter#...
А в коде к этому добавлены ещё и клавиши CtrlPgDn CtrlNum3 Ctrl3
HaRT wrote:
Tue 22 May, 2018 15:05
в плане вызова из редактора ничего не изменилось — ни из списка предупреждений, ни из окна об их отсутствии.
Ну тогда пробуйте luacheck_editor.lua
Last edited by John Doe on Tue 22 May, 2018 18:39, edited 1 time in total.

Post Reply

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