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

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

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

Post by John Doe »

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

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

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

Требования:
  • FAR 3 не старше b5106
  • luacheck не ниже v0.19
Attachments
far_standards.lua.cfg_v1.5.7z
Обновлённые определения (far 6114 / lm 772)
(8.5 KiB) Downloaded 92 times
luaсheck_far_v1.4.3.7z
far5505.lm712
(23.38 KiB) Downloaded 340 times
Last edited by John Doe on Sat 09 Nov, 2019 16:08, edited 3 times in total.
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

luacheck — статический анализатор для Lua

Post by HaRT »

Latest post of the previous page:

John Doe wrote:За положение меню отвечает строка Props.Y = -2
Хотел было использовать -1, но тут небольшой облом:
Far.Menu wrote:X,Y
Координаты верхнего левого угла меню.
Чтобы назначить их автоматически, приравняйте их -1.
В результате меню оказывается снова в центре. Пришлось пожертвовать кусочком ещё одной строки и остановиться на значении 0.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

luacheck — статический анализатор для Lua

Post by John Doe »

HaRT wrote: Просто меня дико сбивает то, что происходит при переключении.
Устроит ли отдельная кнопка, максимизирующая в центральном положении?
Повторное нажатие может возвращать назад (надо переделывать), или уменьшать в центральном же положении (это проще).
HaRT wrote: А как Вам идея про «пинг-понг»?
Не уверен в интуитивности, т.к. если текущее положение "центр", то непонятно куда переместиться список.
Пришлось пожертвовать кусочком ещё одной строки
Вот и я с этим столкнулся )
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

luacheck — статический анализатор для Lua

Post by HaRT »

John Doe, я в порядке тренировки (в дополнение к „невылезанию“ вверх) реализовал себе «пинг-понг» и отдельное разворачивание/восстановление по F5 — развёрнутый список позиционируется в центре, при восстановлении возвращается в ранее заданную позицию:
  1. --- luacheck_editor.lua Mon Jul 13 22:37:20 2015
  2.  
  3. +++ luacheck_editor.lua Tue Jul 14 19:25:43 2015
  4.  
  5. @@ -3,7 +3,7 @@
  6.  
  7.  
  8.  
  9.  -- list options
  10.  
  11.  local MaxHeight = 10
  12.  
  13. -local ListPos = "Bottom" --Top,Bottom,Max or nil
  14.  
  15. +local InitListPos = "Bottom" --Top,Bottom,Center
  16.  
  17.  local AutoPos = true
  18.  
  19.  local ConvertToAnsi = true
  20.  
  21.  
  22.  
  23. @@ -140,6 +140,32 @@
  24.  
  25.    return newBreakKeysArr
  26.  
  27.  end
  28.  
  29.  
  30.  
  31. +local function maximizable(list)
  32.  
  33. +  return list.nItems>list.nLines and list.nLines<list.MaxItems
  34.  
  35. +end
  36.  
  37. +local ListState = {
  38.  
  39. +  currPos = InitListPos;
  40.  
  41. +  prevPos = nil;
  42.  
  43. +  maxHght = false;
  44.  
  45. +  jump = function( self, to )
  46.  
  47. +      assert( self.currPos ~= self.prevPos )
  48.  
  49. +      if to == nil then  -- ping-pong
  50.  
  51. +        local opposite = { ["Top"] = "Bottom", ["Bottom"] = "Top" }
  52.  
  53. +        to = ( self.currPos == "Center" ) and opposite[ self.prevPos ] or "Center"
  54.  
  55. +      end
  56.  
  57. +      if to ~= self.currPos then
  58.  
  59. +        self.prevPos = self.currPos
  60.  
  61. +      end
  62.  
  63. +      self.currPos = to
  64.  
  65. +      assert( self.currPos ~= self.prevPos )
  66.  
  67. +    end;
  68.  
  69. +  zoom = function( self, list )
  70.  
  71. +      if maximizable(list) then
  72.  
  73. +        self.maxHght = not self.maxHght
  74.  
  75. +      end
  76.  
  77. +    end;
  78.  
  79. +}
  80.  
  81. +
  82.  
  83.  local function setPos(info) editor.SetPosition(nil,info); editor.Redraw() end
  84.  
  85.  local function scrollEditor(dir)
  86.  
  87.    local ei = editor.GetInfo()
  88.  
  89. @@ -169,9 +195,9 @@
  90.  
  91.      local ei = editor.GetInfo()
  92.  
  93.      local y = w.line-ei.TopScreenLine --calculated screen line of warning
  94.  
  95.      local a,b = 0,ei.WindowSizeY      --valid screen lines (a..b)
  96.  
  97. -    if ListPos=="Top" then
  98.  
  99. -      a = a+nLines+1
  100.  
  101. -    elseif ListPos=="Bottom" then
  102.  
  103. +    if ListState.currPos=="Top" then
  104.  
  105. +      a = a+nLines+3
  106.  
  107. +    elseif ListState.currPos=="Bottom" then
  108.  
  109.        b = b-nLines-3
  110.  
  111.      end
  112.  
  113.      TopScreenLine = (y<a or force_top) and math.max(w.line-a,1)
  114.  
  115. @@ -187,9 +213,6 @@
  116.  
  117.      setPos(bak_pos)
  118.  
  119.    end
  120.  
  121.  end
  122.  
  123. -local function maximizable(list)
  124.  
  125. -  return list.nItems>list.nLines and list.nLines<list.MaxItems
  126.  
  127. -end
  128.  
  129.  local bKeys = expandBreakKeys {
  130.  
  131.    {BreakKey="C+UP    C+NUMPAD8",action=function()  scrollEditor(-1) end},
  132.  
  133.    {BreakKey="C+DOWN  C+NUMPAD2",action=function()  scrollEditor(1) end},
  134.  
  135. @@ -203,15 +226,11 @@
  136.  
  137.    {BreakKey="C+PRIOR C+NUMPAD9",action=function(w,list)
  138.  
  139.       if w.prev_line then gotoWarning({line=w.prev_line,column=w.prev_column,name=w.name},list.nLines) end
  140.  
  141.     end},
  142.  
  143. -  {BreakKey="C+HOME NUMPAD7",   action=function()  ListPos = "Top" end},
  144.  
  145. -  {BreakKey="C+END  NUMPAD1",   action=function()  ListPos = "Bottom" end},
  146.  
  147. -  {BreakKey="NUMPAD4",          action=function(_,list)
  148.  
  149. -     ListPos = not ListPos and (maximizable(list) and "Max" or ListPos)
  150.  
  151. -   end},
  152.  
  153. -  {BreakKey="F5 CLEAR",         action=function(_,list)
  154.  
  155. -     local next = {["Top"]="Bottom",["Bottom"]=false,[false]=maximizable(list) and "Max" or "Top",["Max"]="Top"}
  156.  
  157. -     ListPos = next[ListPos]
  158.  
  159. -   end},
  160.  
  161. +  {BreakKey="C+HOME NUMPAD7", action=function() ListState:jump( "Top"    ) end},
  162.  
  163. +  {BreakKey="C+END  NUMPAD1", action=function() ListState:jump( "Bottom" ) end},
  164.  
  165. +  {BreakKey="       NUMPAD4", action=function() ListState:jump( "Center" ) end},
  166.  
  167. +  {BreakKey="         CLEAR", action=function() ListState:jump(--[[auto]]) end},
  168.  
  169. +  {BreakKey="F5"            , action=function(_,list) ListState:zoom(list) end},
  170.  
  171.    {BreakKey="ADD",              action=function() editor.AddSessionBookmark() end},
  172.  
  173.    {BreakKey="CS+1 CS+2 CS+3 CS+4 CS+5 CS+6 CS+7 CS+8 CS+9 CS+0 C+1 C+2 C+3 C+4 C+5 C+6 C+7 C+8 C+9 C+0",keys=true},
  174.  
  175.    {BreakKey="F1",               action=showHelp},
  176.  
  177. @@ -265,14 +284,14 @@
  178.  
  179.        Props.X = maxlen<xSize-4 and (xSize-maxlen)/2-2 or -1
  180.  
  181.        local nItems = #Items
  182.  
  183.        local nLines = math.min(nItems,MaxHeight,MaxItems)
  184.  
  185. -      if not ListPos or ListPos=="Max" or nLines==MaxItems then
  186.  
  187. +      if ListState.currPos=="Center" or ListState.maxHght or nLines==MaxItems then
  188.  
  189.          Props.X,Props.Y = -1,-1
  190.  
  191. -      elseif ListPos=="Top" then
  192.  
  193. -        Props.Y = -2
  194.  
  195. -      elseif ListPos=="Bottom" then
  196.  
  197. +      elseif ListState.currPos=="Top" then
  198.  
  199. +        Props.Y = 0
  200.  
  201. +      elseif ListState.currPos=="Bottom" then
  202.  
  203.          Props.Y = MaxItems-nLines>0 and MaxItems-nLines+2 or -1
  204.  
  205.        end
  206.  
  207. -      Props.MaxHeight = ListPos=="Max" and 0 or MaxHeight
  208.  
  209. +      Props.MaxHeight = ListState.maxHght and 0 or MaxHeight
  210.  
  211.        -- show list
  212.  
  213.        Props.SelectIndex = pos
  214.  
  215.        local item
Надеюсь, что не продублировал Вашу сегодняшнюю работу.
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: В патч добавлено исправление прокрутки редактора при открытии списка
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

luacheck — статический анализатор для Lua

Post by John Doe »

HaRT wrote: в дополнение к „невылезанию“ вверх
Только вторую указанную мной строку забыли исправить.
HaRT wrote: Надеюсь, что не продублировал Вашу сегодняшнюю работу.
Обошлось )
Разворачивание отдельной кнопкой понравилось.
А пинг-понг по-моему баловство.

P.S.
Этот парень похоже читает наш форум https://github.com/mpeterv/luacheck/com ... a519ef0897
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

luacheck — статический анализатор для Lua

Post by HaRT »

John Doe wrote: вторую указанную мной строку забыли исправить
В каком сценарии это скажется?
John Doe wrote: Обошлось
Уфф! ;)
John Doe wrote: Разворачивание отдельной кнопкой понравилось.
Спасибо.
John Doe wrote: А пинг-понг по-моему баловство.
На вкус и цвет…
John Doe wrote: парень похоже читает наш форум
Прямой связи не увидел. Но хорошо, что читает, т.к. будет в курсе наших особенностей использования Луа.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

luacheck — статический анализатор для Lua

Post by John Doe »

HaRT wrote: В каком сценарии это скажется?
Список может закрыть собой строку, к которой относится предупреждение.
HaRT wrote: Прямой связи не увидел.
В шапке, в инструкции по установке luacheck_cmdline.lua я только вчера описал аналогичный патч , а сегодня он уже и не нужен.
(На самом деле я не думаю что он читает наш форум, скорее совпадение)
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

luacheck — статический анализатор для Lua

Post by HaRT »

John Doe wrote: пинг-понг по-моему баловство
Можно было бы оставить в виде опции…
John Doe wrote: Список может закрыть собой строку, к которой относится предупреждение.
Спасибо, воспроизвёл; патч исправил.
Кстати, там в подобном сценарии ломается отображение Колореровского перекрестья. С этим можно что-то поделать?
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

luacheck — статический анализатор для Lua

Post by John Doe »

HaRT wrote: Кстати, там в подобном сценарии ломается отображение Колореровского перекрестья.
Что значит в подобном сценарии?
У меня по Ctrl-Enter с крестом всё в порядке, а по Shift-Up/Down он не перерисовывается, да.
Решается добавлением flags="EnableOutput"; в соответствующий макрос.
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

luacheck — статический анализатор для Lua

Post by HaRT »

John Doe wrote: Что значит в подобном сценарии?
Если я отправлю список наверх, закрою его, сделаю строку с предупреждением верхней и открою список вновь, то вертикальная черта перекрестья претерпевает излом. Там вообще в зависимости от предшествующих действий можно получить разнообразные .
И flags="EnableOutput"; для макроса на [b]CtrlShiftF7[/b] не помогает. :(
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

luacheck — статический анализатор для Lua

Post by John Doe »

Code: Select all

if AutoPos and not pos then mf.postmacro(Keys,"CtrlEnter") end
заменить на

Code: Select all

if AutoPos and not pos then mf.postmacro(function()mmode(1,0) Keys"CtrlEnter"end) end
P.S.
В следующей версии наверно избавлюсь от макроса в этом месте.
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

luacheck — статический анализатор для Lua

Post by HaRT »

John Doe wrote: заменить
Спасибо!
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

luacheck — статический анализатор для Lua

Post by John Doe »

В шапке v1.1
  • Up/Down теперь сразу позиционируют редактор к месту соответствующего предупреждения.
  • Для максимизации теперь служит отдельная клавиша
  • Косметика: убраны пустые поля, улучшено позиционирование относительно верха/низа.
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

luacheck — статический анализатор для Lua

Post by HaRT »

John Doe wrote: Для максимизации теперь служит отдельная клавиша
А также повторение позиционирования — удобно.
John Doe wrote: улучшено позиционирование относительно верха/низ
Спасибо!
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

luacheck — статический анализатор для Lua

Post by John Doe »

buniak_a_h wrote:Про luacheck: Вы уверены, что он правильно анализирует? Получаю ошибку mutating read-only global variable ... . На самом деле (а) я не понимаю, почему эта переменная read-only;
Неоправданное использование глобальных переменных это потенциальный источник ошибок, поэтому его следует избегать.
В lua если переменная не объявлена предварительно с ключевым словом local, значит она считается глобальной.
Частный случай: переменная по замыслу локальна, но в каком-то месте кода употребляется с опечаткой в имени (например с большой буквы вместо маленькой).
luacheck позволяет легко находить такие ошибки, тогда как "глазами" это сделать проблематичною
buniak_a_h wrote:(б) она в этом месте прекрасно инициализируется; если б этот оператор не работал, вообще ничего не работало бы.
Надо понимать, что анализ luacheck это не ошибки, а всего лишь предупреждения.
В вашем случае это может и не баг, luacheck знать этого не может, но само действие потенциально опасно.
Сделайте переменную локальной, и предупреждений не будет.
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

luacheck — статический анализатор для Lua

Post by HaRT »

Предложение: в меню предупреждений ввести быстрый фильтр по серьёзности. Например, по [b]CtrlH[/b] скрывать/показывать все „второстепенные“ предупреждения (те, которые не помечаются восклицательным знаком).
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

luacheck — статический анализатор для Lua

Post by John Doe »

HaRT wrote: скрывать/показывать все „второстепенные“ предупреждения
Не берусь судить о второстепенности, а пометка восклицательным знаком это больше моя самодеятельность: для себя пометил предупреждения коды которых начинаются с 1 (все они связаны с использованием глобальных переменных).

Не уверен что правильно рубить с плеча и скрывать остальные.
Но какое-то более гибкое решение можно рассмотреть. Обратите внимание на опции, возможно стоит реализовать интерактивную конфигурацию.
В частности, вашему предложению соответствует значении опции only={"1.."}
Post Reply

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