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

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

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

Postby 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 38 times

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

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

Postby John Doe » Sun 12 Jul, 2015 20:05

Latest post of the previous page:

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

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

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

Postby HaRT » Sun 12 Jul, 2015 20:10

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

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

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

Postby HaRT » Mon 13 Jul, 2015 13:09

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

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

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

Postby John Doe » Mon 13 Jul, 2015 13:29

HaRT wrote:Source of the post Было бы удобно, чтобы не завязываться на предусмотрительность остальных авторов полезных плюшек.
Речь о потенциальных плюшках? Или есть реальные примеры?

HaRT wrote:Source of the post Я себе сделал пока так:
Верной дорогой идёте.

HaRT wrote:Source of the post Немного огорчают только пустые 2-3 строки над/под меню.
А как иначе?
Значит все элементы и так поместились.

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

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

Postby HaRT » Mon 13 Jul, 2015 13:39

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

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

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

Postby HaRT » Mon 13 Jul, 2015 14:05

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

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: 11042
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

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

Postby John Doe » Mon 13 Jul, 2015 14:50

HaRT wrote:Source of the post Я там код улучшил чуток
Если что, то помимо максимизации будут также режимы вверху/внизу.

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

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

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

Postby HaRT » Mon 13 Jul, 2015 16:24

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

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

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

Postby John Doe » Mon 13 Jul, 2015 23:16

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

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

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

Postby HaRT » Tue 14 Jul, 2015 12:30

John Doe wrote:Source of the post Обновление
Спасибо.
Мелкая некрасивость: при верхнем положении списка его верхняя рамка оказывается за пределами окна.
Пожелание: хотелось бы разделить положение (верх/центр/низ) и размер (стандартный/развёрнутый). Т.е. чтобы N1, N4, N7 и N5 управляли положением (так же, как сейчас, но без изменения размера), а F5 — разворачивал/восстанавливал (без изменения точки привязки списка). Кстати, при переключении по N5, мне кажется, было бы интуитивнее, если бы положение изменялось по схеме „пинг-понг“ (низ—центр—верх—центр—низ—…), а не по схеме „кольцо“ (низ—центр—верх—низ—…).
Last edited by HaRT on Tue 14 Jul, 2015 12:37, edited 1 time in total.
Reason: Добавлено пожелание про «пинг-понг»
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Postby John Doe » Tue 14 Jul, 2015 12:44

HaRT wrote:Source of the post Мелкая некрасивость:
Так и задумано, чтобы список занимал меньше места.
Лучше было бы убрать внешние поля, но вначале надо переделать меню на диалог, до чего руки пока не дошли.

HaRT wrote:Source of the post Пожелание
Обоснуйте, исходя из практики использования.

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

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

Postby HaRT » Tue 14 Jul, 2015 12:58

John Doe wrote:Source of the post учше было бы убрать внешние поля
Так я не про поля, а про саму рамку. В результате, если нет полосы прокрутки, визуально складывается впечатление, будто часть списка не видна, — очень сбивает с толку.
John Doe wrote:Source of the post Обоснуйте
Просто привычки работы с оконными интерфейсами таковы, что окно либо перемещается без изменения размера, либо изменяется в размере без изменения точки привязки (в случае операций Развернуть/Восстановить она несколько условна). В данной реализации этот инвариант не соблюдается, в результате чего нарушается принцип Наименьшего удивления.

HaRT wrote:Source of the post Кстати, при переключении по N5, мне кажется, было бы интуитивнее, если бы положение изменялось по схеме „пинг-понг“ (низ—центр—верх—центр—низ—…), а не по схеме „кольцо“ (низ—центр—верх—низ—…).
А об этом что скажете?
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Postby John Doe » Tue 14 Jul, 2015 13:11

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

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

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

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

Postby HaRT » Tue 14 Jul, 2015 13:19

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

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

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

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

Postby 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: 11042
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

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

Postby John Doe » Tue 14 Jul, 2015 13:44

HaRT wrote:Source of the post Просто меня дико сбивает то, что происходит при переключении.
Устроит ли отдельная кнопка, максимизирующая в центральном положении?
Повторное нажатие может возвращать назад (надо переделывать), или уменьшать в центральном же положении (это проще).

HaRT wrote:Source of the post А как Вам идея про «пинг-понг»?
Не уверен в интуитивности, т.к. если текущее положение "центр", то непонятно куда переместиться список.

Пришлось пожертвовать кусочком ещё одной строки
Вот и я с этим столкнулся )

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

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

Postby 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. +++ luacheck_editor.lua Tue Jul 14 19:25:43 2015
  3. @@ -3,7 +3,7 @@
  4.  
  5.  -- list options
  6.  local MaxHeight = 10
  7. -local ListPos = "Bottom" --Top,Bottom,Max or nil
  8. +local InitListPos = "Bottom" --Top,Bottom,Center
  9.  local AutoPos = true
  10.  local ConvertToAnsi = true
  11.  
  12. @@ -140,6 +140,32 @@
  13.    return newBreakKeysArr
  14.  end
  15.  
  16. +local function maximizable(list)
  17. +  return list.nItems>list.nLines and list.nLines<list.MaxItems
  18. +end
  19. +local ListState = {
  20. +  currPos = InitListPos;
  21. +  prevPos = nil;
  22. +  maxHght = false;
  23. +  jump = function( self, to )
  24. +      assert( self.currPos ~= self.prevPos )
  25. +      if to == nil then  -- ping-pong
  26. +        local opposite = { ["Top"] = "Bottom", ["Bottom"] = "Top" }
  27. +        to = ( self.currPos == "Center" ) and opposite[ self.prevPos ] or "Center"
  28. +      end
  29. +      if to ~= self.currPos then
  30. +        self.prevPos = self.currPos
  31. +      end
  32. +      self.currPos = to
  33. +      assert( self.currPos ~= self.prevPos )
  34. +    end;
  35. +  zoom = function( self, list )
  36. +      if maximizable(list) then
  37. +        self.maxHght = not self.maxHght
  38. +      end
  39. +    end;
  40. +}
  41. +
  42.  local function setPos(info) editor.SetPosition(nil,info); editor.Redraw() end
  43.  local function scrollEditor(dir)
  44.    local ei = editor.GetInfo()
  45. @@ -169,9 +195,9 @@
  46.      local ei = editor.GetInfo()
  47.      local y = w.line-ei.TopScreenLine --calculated screen line of warning
  48.      local a,b = 0,ei.WindowSizeY      --valid screen lines (a..b)
  49. -    if ListPos=="Top" then
  50. -      a = a+nLines+1
  51. -    elseif ListPos=="Bottom" then
  52. +    if ListState.currPos=="Top" then
  53. +      a = a+nLines+3
  54. +    elseif ListState.currPos=="Bottom" then
  55.        b = b-nLines-3
  56.      end
  57.      TopScreenLine = (y<a or force_top) and math.max(w.line-a,1)
  58. @@ -187,9 +213,6 @@
  59.      setPos(bak_pos)
  60.    end
  61.  end
  62. -local function maximizable(list)
  63. -  return list.nItems>list.nLines and list.nLines<list.MaxItems
  64. -end
  65.  local bKeys = expandBreakKeys {
  66.    {BreakKey="C+UP    C+NUMPAD8",action=function()  scrollEditor(-1) end},
  67.    {BreakKey="C+DOWN  C+NUMPAD2",action=function()  scrollEditor(1) end},
  68. @@ -203,15 +226,11 @@
  69.    {BreakKey="C+PRIOR C+NUMPAD9",action=function(w,list)
  70.       if w.prev_line then gotoWarning({line=w.prev_line,column=w.prev_column,name=w.name},list.nLines) end
  71.     end},
  72. -  {BreakKey="C+HOME NUMPAD7",   action=function()  ListPos = "Top" end},
  73. -  {BreakKey="C+END  NUMPAD1",   action=function()  ListPos = "Bottom" end},
  74. -  {BreakKey="NUMPAD4",          action=function(_,list)
  75. -     ListPos = not ListPos and (maximizable(list) and "Max" or ListPos)
  76. -   end},
  77. -  {BreakKey="F5 CLEAR",         action=function(_,list)
  78. -     local next = {["Top"]="Bottom",["Bottom"]=false,[false]=maximizable(list) and "Max" or "Top",["Max"]="Top"}
  79. -     ListPos = next[ListPos]
  80. -   end},
  81. +  {BreakKey="C+HOME NUMPAD7", action=function() ListState:jump( "Top"    ) end},
  82. +  {BreakKey="C+END  NUMPAD1", action=function() ListState:jump( "Bottom" ) end},
  83. +  {BreakKey="       NUMPAD4", action=function() ListState:jump( "Center" ) end},
  84. +  {BreakKey="         CLEAR", action=function() ListState:jump(--[[auto]]) end},
  85. +  {BreakKey="F5"            , action=function(_,list) ListState:zoom(list) end},
  86.    {BreakKey="ADD",              action=function() editor.AddSessionBookmark() end},
  87.    {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},
  88.    {BreakKey="F1",               action=showHelp},
  89. @@ -265,14 +284,14 @@
  90.        Props.X = maxlen<xSize-4 and (xSize-maxlen)/2-2 or -1
  91.        local nItems = #Items
  92.        local nLines = math.min(nItems,MaxHeight,MaxItems)
  93. -      if not ListPos or ListPos=="Max" or nLines==MaxItems then
  94. +      if ListState.currPos=="Center" or ListState.maxHght or nLines==MaxItems then
  95.          Props.X,Props.Y = -1,-1
  96. -      elseif ListPos=="Top" then
  97. -        Props.Y = -2
  98. -      elseif ListPos=="Bottom" then
  99. +      elseif ListState.currPos=="Top" then
  100. +        Props.Y = 0
  101. +      elseif ListState.currPos=="Bottom" then
  102.          Props.Y = MaxItems-nLines>0 and MaxItems-nLines+2 or -1
  103.        end
  104. -      Props.MaxHeight = ListPos=="Max" and 0 or MaxHeight
  105. +      Props.MaxHeight = ListState.maxHght and 0 or MaxHeight
  106.        -- show list
  107.        Props.SelectIndex = pos
  108.        local item
Надеюсь, что не продублировал Вашу сегодняшнюю работу.
Last edited by HaRT on Tue 14 Jul, 2015 21:12, edited 1 time in total.
Reason: В патч добавлено исправление прокрутки редактора при открытии списка
Фар есть инструмент, а не нянька. © 2009 DrKnS


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

Who is online

Users browsing this forum: No registered users and 4 guests