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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

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

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

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

Для установки модуля необходимо скачать архив luacheck-master.zip, взять оттуда папку luacheck (из luacheck-master\src\ ), и поместить в %FARPROFILE%\Macros\modules.

А ниже предлагаются утилиты для удобной работы с luacheck в фаре (содержимое вложения распаковать куда-нибудь в %FARPROFILE%\Macros\scripts).
  1. luacheck_editor.lua позволяет проверять lua-код в активном редакторе фара.
    Запуск назначен на комбинацию Ctrl-Shift-F7 (только для *.lua;*.moon).
    Найденные ошибки и предупреждения отображаются в виде списка.
    Управление:
  2. luacheck_cmdline.lua запускает luacheck из командной строки, c выводом отчётов в консоль.
    • Установка:
    • Запускать с помощью префикса luacheck, например: luacheck: *.lua
      Синтаксис можно посмотреть запустив без параметров, а более подробно — в документации.
Update:
С версии 1.3 поддерживается также работа с Moonscript (в редакторе)
Attachments
luacheck_scripts-1.3.3.7z
(6.87 KiB) Downloaded 51 times

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

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

Post by John Doe » Sun 12 Jul, 2015 20:05

Latest post of the previous page:

HaRT wrote: Обнаружилась ошибка
Давно исправил, рассчитываю скоро выложить.
HaRT wrote: нет способа выйти из списка так, чтобы каретка осталась на том месте.
Подумаю как лучше.
HaRT wrote: Интересно, можно ли и это сделать в общем виде…
Подозреваю что можно и в общем, но не уверен что нужно.
В моей рабочей версии luacheck есть максимизация.
В версии из шапки для этого можно закомментировать строку local MaxHeight = 10

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

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

Post by HaRT » Sun 12 Jul, 2015 20:10

John Doe wrote: рассчитываю скоро выложить
[…]
Подумаю как лучше
Спасибо! Ждём-с…
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by HaRT » Mon 13 Jul, 2015 13:09

John Doe wrote: Подозреваю что можно и в общем, но не уверен что нужно.
Было бы удобно, чтобы не завязываться на предусмотрительность остальных авторов полезных плюшек.
John Doe wrote: В моей рабочей версии luacheck есть максимизация.
Я себе сделал пока так:
Code: [Select all] [Expand/Collapse] [Download] (luacheck.lua.diff)
  1. --- luacheck.lua    Sun Jun 21 10:00:37 2015
  2.  
  3. +++ luacheck.lua    Mon Jul 13 14:59:19 2015
  4.  
  5. @@ -1,6 +1,6 @@
  6.  
  7. ---<a href="http://forum.farmanager.com/viewtopic.php?f=15&t=9650" class="postlink">http://forum.farmanager.com/viewtopic.php?f=15&t=9650</a>
  8.  
  9. +--<a href="http://forum.farmanager.com/viewtopic.php?p=130641#p130641" class="postlink">http://forum.farmanager.com/viewtopic.p ... 41#p130641</a>
  10.  
  11.  local luacheck = require "luacheck"
  12.  
  13. -local MaxHeight = 10 --todo maximize, top, bottom
  14.  
  15. +local MaxHeight = 10  -- will maximize/restore by F5, see below
  16.  
  17.  local options = { --<a href="http://luacheck.readthedocs.org/config.html" class="postlink">http://luacheck.readthedocs.org/config.html</a>
  18.  
  19.    new_read_globals={
  20.  
  21.      "Macro","NoMacro","Event","NoEvent","MenuItem","NoMenuItem","CommandLine","NoCommandLine",
  22.  
  23. @@ -92,7 +92,7 @@
  24.  
  25.  local Title = "luacheck"
  26.  
  27.  local Props = {
  28.  
  29.    Title=Title;
  30.  
  31. -  Bottom="Ctrl-Enter, Ctrl-Up/Down";
  32.  
  33. +  Bottom="Ctrl-Enter, Ctrl-Up/Down, F5";
  34.  
  35.    Id=win.Uuid(Id);
  36.  
  37.    MaxHeight=MaxHeight;
  38.  
  39.  }
  40.  
  41. @@ -160,6 +160,9 @@
  42.  
  43.     end},
  44.  
  45.    {BreakKey="C+1 C+2 C+3 C+4 C+5 C+6 C+7 C+8 C+9 C+0",action=function(_,_,bk)
  46.  
  47.       Keys(bk.BreakKey:gsub("C%+","Ctrl"))
  48.  
  49. +   end},
  50.  
  51. +  {BreakKey="F5", action=function()
  52.  
  53. +     Props.MaxHeight = not Props.MaxHeight and MaxHeight or nil  -- toggle Maximized
  54.  
  55.     end},
  56.  
  57.  }
  58.  
  59.  
  60.  
  61. #EOF
Немного огорчают только пустые 2-3 строки над/под меню.
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Вычеркнуто неактуальное; улучшен код.
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by John Doe » Mon 13 Jul, 2015 13:29

HaRT wrote: Было бы удобно, чтобы не завязываться на предусмотрительность остальных авторов полезных плюшек.
Речь о потенциальных плюшках? Или есть реальные примеры?
HaRT wrote: Я себе сделал пока так:
Верной дорогой идёте.
HaRT wrote: Немного огорчают только пустые 2-3 строки над/под меню.
А как иначе?
Значит все элементы и так поместились.

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

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

Post by HaRT » Mon 13 Jul, 2015 13:39

John Doe wrote: есть реальные примеры?
Пока больше нет. Как встречу — напишу.
John Doe wrote: Верной дорогой идёте
Я там код улучшил чуток — заменил if-then-else-end на (not-)and-or.
John Doe wrote: все элементы и так поместились
:facepalm:
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by HaRT » Mon 13 Jul, 2015 14:05

HaRT wrote: выйти из списка так, чтобы каретка осталась на том месте
Раз пошла такая пьянка, сделал себе и это, притом в лоб:

Code: Select all

  Bottom="Ctrl-/Shift-/Enter, Ctrl-Up/Down, F5";
…
  {BreakKey="S+RETURN", action=function()
     return "break"  -- do not change selection or position
   end},
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by John Doe » Mon 13 Jul, 2015 14:50

HaRT wrote: Я там код улучшил чуток
Если что, то помимо максимизации будут также режимы вверху/внизу.
HaRT wrote: Раз пошла такая пьянка, сделал себе и это, притом в лоб:
А F10 делает не то, что вам надо?
В идеале требуемое поведение должно быть без всяких дополнительных шорткатов (в рабочей версии попытался сделать именно так).

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

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

Post by HaRT » Mon 13 Jul, 2015 16:24

John Doe wrote: F10 делает не то, что вам надо?
Хм, про [b]F10[/b]-то я и забыл… То.
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by John Doe » Mon 13 Jul, 2015 23:16

Обновление.
  • Скрипт адаптирован к последним изменениям в модуле (его тоже надо перекачать).
  • Список по умолчанию прижимается к нижней части окна фара.
    Расположение можно менять, см. справку по F1.
  • Новые шорткаты для перехода к следующему/предыдущему предупреждению.
  • Имя файла скрипта изменилось, и добавилась утилита luacheck_cmdline.lua
Детали в шапке.

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

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

Post by HaRT » Tue 14 Jul, 2015 12:30

John Doe wrote: Обновление
Спасибо.
Мелкая некрасивость: при верхнем положении списка его верхняя рамка оказывается за пределами окна.
Пожелание: хотелось бы разделить положение (верх/центр/низ) и размер (стандартный/развёрнутый). Т.е. чтобы N1, N4, N7 и N5 управляли положением (так же, как сейчас, но без изменения размера), а F5 — разворачивал/восстанавливал (без изменения точки привязки списка). Кстати, при переключении по N5, мне кажется, было бы интуитивнее, если бы положение изменялось по схеме „пинг-понг“ (низ—центр—верх—центр—низ—…), а не по схеме „кольцо“ (низ—центр—верх—низ—…).
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Добавлено пожелание про «пинг-понг»
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by John Doe » Tue 14 Jul, 2015 12:44

HaRT wrote: Мелкая некрасивость:
Так и задумано, чтобы список занимал меньше места.
Лучше было бы убрать внешние поля, но вначале надо переделать меню на диалог, до чего руки пока не дошли.
HaRT wrote: Пожелание
Обоснуйте, исходя из практики использования.

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

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

Post by HaRT » Tue 14 Jul, 2015 12:58

John Doe wrote: учше было бы убрать внешние поля
Так я не про поля, а про саму рамку. В результате, если нет полосы прокрутки, визуально складывается впечатление, будто часть списка не видна, — очень сбивает с толку.
John Doe wrote: Обоснуйте
Просто привычки работы с оконными интерфейсами таковы, что окно либо перемещается без изменения размера, либо изменяется в размере без изменения точки привязки (в случае операций Развернуть/Восстановить она несколько условна). В данной реализации этот инвариант не соблюдается, в результате чего нарушается принцип Наименьшего удивления.
HaRT wrote: Кстати, при переключении по N5, мне кажется, было бы интуитивнее, если бы положение изменялось по схеме „пинг-понг“ (низ—центр—верх—центр—низ—…), а не по схеме „кольцо“ (низ—центр—верх—низ—…).
А об этом что скажете?
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by John Doe » Tue 14 Jul, 2015 13:11

HaRT wrote: очень сбивает с толку.
За положение меню отвечает строка Props.Y = -2, за коррекцию TopScreenLine a = a+nLines+1.
(Я трогать это пока не планирую)

По максимизации: действительно ли вам нужны верх/низ максимизированными?

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

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

Post by HaRT » Tue 14 Jul, 2015 13:19

John Doe wrote: Я трогать это пока не планирую
Спасибо, поправлю для себя локально.
John Doe wrote: действительно ли вам нужны верх/низ максимизированными?
Пока не уверен.
Просто меня дико сбивает то, что происходит при переключении.

А как Вам идея про «пинг-понг»?
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by HaRT » Tue 14 Jul, 2015 13:36

John Doe wrote:За положение меню отвечает строка Props.Y = -2
Хотел было использовать -1, но тут небольшой облом:
Far.Menu wrote:X,Y
Координаты верхнего левого угла меню.
Чтобы назначить их автоматически, приравняйте их -1.
В результате меню оказывается снова в центре. Пришлось пожертвовать кусочком ещё одной строки и остановиться на значении 0.
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by John Doe » Tue 14 Jul, 2015 13:44

HaRT wrote: Просто меня дико сбивает то, что происходит при переключении.
Устроит ли отдельная кнопка, максимизирующая в центральном положении?
Повторное нажатие может возвращать назад (надо переделывать), или уменьшать в центральном же положении (это проще).
HaRT wrote: А как Вам идея про «пинг-понг»?
Не уверен в интуитивности, т.к. если текущее положение "центр", то непонятно куда переместиться список.
Пришлось пожертвовать кусочком ещё одной строки
Вот и я с этим столкнулся )

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

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

Post by HaRT » Tue 14 Jul, 2015 17:23

John Doe, я в порядке тренировки (в дополнение к „невылезанию“ вверх) реализовал себе «пинг-понг» и отдельное разворачивание/восстановление по F5 — развёрнутый список позиционируется в центре, при восстановлении возвращается в ранее заданную позицию:
Code: [Select all] [Expand/Collapse] [Download] (luacheck_editor.lua.diff)
  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

Post Reply

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

Who is online

Users browsing this forum: No registered users and 3 guests