Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Здесь обсуждается всё, что касается макросов.

Нужно ли некое "правильное" (стандартное) форматирование кода, в частности Луа?

идея хорошая, но еще и форматировать добавляет слишком много работы для писателя, что на практике не реально
0
No votes
идея хорошая, но невозможно прийти к общей устраивающей всех конвенции, все делают по разному
0
No votes
Конечно нужно, я кодер, и часто должен анализировать чужое творчество, мешает лапша из плохо неформатированного кода
4
67%
НЕ нужно, я кодер, и часто должен анализировать чужое творчество, проблемы не возникало
0
No votes
Я не кодер я только учусь, и чей-то криво отформатированный код очень усложняет
1
17%
Я не кодер я только учусь, правила переноса строк и прочие форматирования это наименьшая проблема и интерес
0
No votes
Я кодер, и считаю что автор этого опроса поехавший
0
No votes
Я не кодер, и мне все равно куда уехал автор
0
No votes
Я написал в комментарии свое мнение об этом всем
1
17%
 
Total votes: 6

User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by citRiks »

Правила форматирования кода для читабельности, понятности, т.е. повт. использования.
инструменты, опыт, предложения?
Last edited by citRiks on Fri 29 Jan, 2021 16:42, edited 2 times in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by citRiks »

Для конкретного примера, возьмем исходный код такой:
  1. ----[[*D*]]local le = require"le"
  2.  
  3. local mBaseTools = require"Bax.mBaseTools"
  4.  
  5. local FileFilterTools = require"BAX.FileFilterTools"
  6.  
  7. local DialogTools = require"BAX.DialogTools"
  8.  
  9. local DialogItem = DialogTools.DialogItem
  10.  
  11. local F = far.Flags
  12.  
  13. local Config
  14.  
  15. local Info = package.loaded.regscript or function(...) return ... end
  16.  
  17. local nfo = Info {_filename or ...,
  18.  
  19.   name        = "Save-Rest Context";
  20.  
  21.   description = "Сохранение-восстановление контекста";
  22.  
  23.   version     = "1.1.1"; --http://semver.org/lang/ru/
  24.  
  25.   author      = "BAX";
  26.  
  27.   url         = "https://forum.farmanager.com/viewtopic.php?p=164383#p164383";
  28.  
  29.   id          = "9D5D4FD6-67B7-45FD-B204-F555481FF1FB";
  30.  
  31.   history     = [[
  32.  
  33. 26.01.2021 v1.1.1 - стартовая версия
  34.  
  35. ]];
  36.  
  37.   --parent_id   = "";
  38.  
  39.   --minfarversion = {3,0,0,4744,0};
  40.  
  41.   --files       = "*.cfg;*.ru.lng";
  42.  
  43.   config      = function(nfo,name) Config('FromInfo') end;
  44.  
  45.   --help        = function(nfo,name) end;
  46.  
  47.   --execute     = function(nfo,name) end;
  48.  
  49.  
  50.  
  51.   --disabled    = false;
  52.  
  53.   --options     = {};
  54.  
  55. }
  56.  
  57. if not nfo then return end
  58.  
  59. --local O = nfo.options
  60.  
  61. --------------------------------------------------------------------------------------------------------
  62.  
  63.  local CfgDef = {Path=true; ViewMode=true; SortMode=true; Filters=true; Windows=true}
  64.  
  65.  local function TabMerge(Tab1, Tab2)
  66.  
  67.   local i,v = next(Tab2)
  68.  
  69.   while i do
  70.  
  71.    if Tab1[i] == nil then
  72.  
  73.     Tab1[i] = v
  74.  
  75.    end
  76.  
  77.    i,v = next(Tab2, i)
  78.  
  79.   end
  80.  
  81.   return Tab1
  82.  
  83.  end
  84.  
  85.  local Cfg = TabMerge(mf.mload('BAX', 'SaveContext.Settings') or {}, CfgDef)
  86.  
  87. --------------------------------------------------------------------------------------------------------
  88.  
  89.  
  90.  
  91. local function ClearContextes()
  92.  
  93.   local List = mBaseTools.mList('BAX', [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;.*\]/]], nil, true)
  94.  
  95.   local miList = {}
  96.  
  97.   for _,v in ipairs(List) do
  98.  
  99.    miList[#miList+1] = regex.match(v.Name, [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;(.*)\]/]])
  100.  
  101.   end
  102.  
  103.   if #miList == 0 then
  104.  
  105.    far.Message('Сохранённых контекстов не найдено','',nil,'w')
  106.  
  107.   else
  108.  
  109.    local ForDel = Menu.Show(table.concat(miList, '\n'), 'Отметьте удаляемые контексты\nInc - отметить', 0x8+0x10)
  110.  
  111.    if type(ForDel) == 'string' and ForDel ~= '' then
  112.  
  113.     local aForDel = {}
  114.  
  115.     for w in ForDel:gmatch"([^%c]+)" do
  116.  
  117.      local i = tonumber(w) or 0
  118.  
  119.      if List[i] then aForDel[#aForDel+1] = i end
  120.  
  121.     end
  122.  
  123.     for _,v in ipairs(aForDel) do
  124.  
  125.      mf.mdelete('BAX',List[v].Name)
  126.  
  127.      List[v].Deleted = true
  128.  
  129.     end
  130.  
  131.    end
  132.  
  133.   end
  134.  
  135. end
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143. Config = function(OpenFrom)
  144.  
  145.   local aDlg = {}
  146.  
  147.   local function Add(item) aDlg[#aDlg+1] = DialogItem(item) end
  148.  
  149.   local h,w=9,75
  150.  
  151.   Add{"DI_DOUBLEBOX",0,0,w-1,h-1,Text='Сохранение контекстов - настройка'}
  152.  
  153.   Add{"DI_TEXT", x1=-1, y1=2,Text='Отметьте, что надо восстанавливать'}
  154.  
  155.   Add{"DI_CHECKBOX", y1=3, Text="Папки", Flags='DIF_CENTERGROUP', Checked=Cfg.Path and 1 or 0; Name='Path'}
  156.  
  157.   Add{"DI_CHECKBOX", y1=3, Text="Режимы просмотра", Flags='DIF_CENTERGROUP'; Name='ViewMode'}
  158.  
  159.   Add{"DI_CHECKBOX", y1=3, Text="Сортировки", Flags='DIF_CENTERGROUP'; Name='SortMode'}
  160.  
  161.   Add{"DI_CHECKBOX", y1=3, Text="Фильтры", Flags='DIF_CENTERGROUP'; Name='Filters'}
  162.  
  163.   Add{"DI_CHECKBOX", y1=3, Text="Окна", Flags='DIF_CENTERGROUP'; Name='Windows'}
  164.  
  165.   Add{"DI_BUTTON", x1=3, y1=5, Text='Очистка контекстов', Flags="DIF_BTNNOCLOSE|DIF_CENTERGROUP"; Name='Clear'}
  166.  
  167.   Add{"DI_TEXT",y1=6,Flags="DIF_SEPARATOR"}
  168.  
  169.   Add{"DI_BUTTON", y1=7, Text="Ok", Flags="DIF_DEFAULTBUTTON|DIF_CENTERGROUP"; Name='Ok'}
  170.  
  171.   Add{"DI_BUTTON", y1=7, Text="Ok", Flags="DIF_CENTERGROUP"}
  172.  
  173.   -- Начальная установка
  174.  
  175.   for _,v in ipairs(aDlg) do
  176.  
  177.    if (v[1] == F.DI_CHECKBOX or v[1] == 'DI_CHECKBOX') and v.Name then
  178.  
  179.     v[6] = Cfg[v.Name] and 1 or 0
  180.  
  181.    end
  182.  
  183.   end
  184.  
  185.   local function DlgProc(hDlg, Msg, Param1, Param2)
  186.  
  187.    if Msg == F.DN_BTNCLICK and aDlg[Param1].Name == 'Clear' then
  188.  
  189.     ClearContextes()
  190.  
  191.    end
  192.  
  193.   end
  194.  
  195.   local i = far.Dialog(win.Uuid'EDF1053E-6888-4CA9-B60E-E15D852F37C2', -1,-1, w,h, nil, aDlg, 'FDLG_SMALLDIALOG', DlgProc)
  196.  
  197.   if i > 0 and aDlg[i].Name == 'Ok' then
  198.  
  199.    for _,v in ipairs(aDlg) do
  200.  
  201.     if (v[1] == F.DI_CHECKBOX or v[1] == 'DI_CHECKBOX') and v.Name then
  202.  
  203.      Cfg[v.Name] = v[6] == 1
  204.  
  205.     end
  206.  
  207.    end
  208.  
  209.    mf.msave('BAX', 'SaveContext.Settings', Cfg)
  210.  
  211.   end
  212.  
  213.   if OpenFrom ~= 'FromInfo' then
  214.  
  215.    mf.postmacro(Keys, 'Esc')
  216.  
  217.   end
  218.  
  219. end
  220.  
  221.  
  222.  
  223.  
  224.  
  225. Event {
  226.  
  227.   id = "A459EC76-7B68-46D4-82CC-AB221FAD6791";
  228.  
  229.   group       = "DialogEvent";
  230.  
  231.   description = "Event example";
  232.  
  233. --  filemask    = "*.txt,*.cpp";
  234.  
  235. --  priority    = 50;
  236.  
  237.   condition   = function(Event, Param) return
  238.  
  239.    Dlg.Id == far.Guids.FarAskQuitId and
  240.  
  241.              Event == F.DE_DLGPROCINIT and
  242.  
  243.              Param.Msg == F.DN_ENTERIDLE
  244.  
  245.   end;
  246.  
  247.   action      = function(Event, Param)
  248.  
  249.    local DlgRect = Param.hDlg:send(F.DM_GETDLGRECT)
  250.  
  251.    local DlgB, DlgL, DlgR = DlgRect.Bottom, DlgRect.Left, DlgRect.Right
  252.  
  253.    local sText = ' ^S-сохранить контекст '
  254.  
  255.    far.Text(DlgL + math.floor( (DlgR-DlgL+1-sText:len())/2), DlgB-1, far.AdvControl(far.Flags.ACTL_GETCOLOR, far.Colors.COL_DIALOGBOX), sText  )
  256.  
  257.    far.Text()
  258.  
  259.   end;
  260.  
  261. }
  262.  
  263. ------------- Сохранение контекста -------------------------------
  264.  
  265. Macro{
  266.  
  267.   id="DEBB826F-857D-4B14-9D40-2F2A5AE3B45C";
  268.  
  269.   area="Dialog Shell Info QView";
  270.  
  271.   key="CtrlS";
  272.  
  273.   description="Сохранение контекста";
  274.  
  275.   flags="";
  276.  
  277.   condition=function(key, data) return not Area.Dialog or Dlg.Id == far.Guids.FarAskQuitId end;
  278.  
  279.   action = function(data)
  280.  
  281.    local Name0 = far.InputBox('75FD55F0-6537-4FE2-A7EB-533AB21BE8CB', 'Сохранение контекста', 'Введите имя контекста', 'BAX.SaveContext')
  282.  
  283.    if not Name0 then return end
  284.  
  285.    local aTest = mBaseTools.mList('BAX', [[/(SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;\Q]]..Name0..[[\E( \(\d+\))?\])/]], nil, true)
  286.  
  287.    local Name, Ask = nil, false
  288.  
  289.    if #aTest == 0 then
  290.  
  291.     Name = Name0
  292.  
  293.    else --#(aTest or {}) > 0 then
  294.  
  295.     -- Такой контекст уже есть.
  296.  
  297.     local iChoice = far.Message('Контекст с таким именем уже имеется  базе','Сохранение контекста','Переименовать;Заменить;Отказ','w')
  298.  
  299.     if iChoice == 2 then -- Заменить
  300.  
  301.      for _,v in ipairs(aTest) do
  302.  
  303.       mf.mdelete('BAX', v.Name)
  304.  
  305.      end
  306.  
  307.      Name = Name0
  308.  
  309.     elseif iChoice == 1 then
  310.  
  311.      Ask = true
  312.  
  313.      far.Message("Подбор имени контекста. Ждите\nEsc - прервать", 'Сохранение контекста','')
  314.  
  315.      for i=1,math.huge do
  316.  
  317.       if mf.waitkey(1) == 'Esc' then
  318.  
  319.        Name = nil;
  320.  
  321.        far.AdvControl(F.ACTL_REDRAWALL)
  322.  
  323.        break
  324.  
  325.       end
  326.  
  327.       Name = ('%s (%d)'):format(Name0, i)
  328.  
  329.       aTest = mBaseTools.mList('BAX', [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;\Q]]..Name..[[\E\]/]], nil, true)
  330.  
  331.       if #aTest == 0 then
  332.  
  333.        break
  334.  
  335.       end
  336.  
  337.      end -- for i=1,math.huge
  338.  
  339.     end
  340.  
  341.    end
  342.  
  343.    if Name and Ask and far.Message("Сохранение контекста с именем\n"..Name, "Сохранение контекста", ';YesNo') ~= 1 then Name = nil end
  344.  
  345.    if not Name then return end
  346.  
  347.    -- Формирование таблицы контекста {
  348.  
  349.    local aStatus = {APanel = { Path = panel.GetPanelDirectory(nil, 1);
  350.  
  351.                                Current = APanel.Current;
  352.  
  353.                                Filter = FileFilterTools.FilterToTable('A');
  354.  
  355.                                Info = panel.GetPanelInfo(nil, 1);
  356.  
  357.                                Left = APanel.Left;
  358.  
  359.                              };
  360.  
  361.                     PPanel = { Path = panel.GetPanelDirectory(nil, 0);
  362.  
  363.                                Current = PPanel.Current;
  364.  
  365.                                Filter = FileFilterTools.FilterToTable('P');
  366.  
  367.                                Info = panel.GetPanelInfo(nil, 0);
  368.  
  369.                                Left = PPanel.Left;
  370.  
  371.                              };
  372.  
  373.                     Windows = {};
  374.  
  375.                    }
  376.  
  377.    for i=0,far.AdvControl(F.ACTL_GETWINDOWCOUNT) do
  378.  
  379.     local WInfo = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  380.  
  381.     if WInfo then
  382.  
  383.      aStatus.Windows[WInfo.Pos] = WInfo
  384.  
  385.      if WInfo.Type == F.WTYPE_VIEWER then
  386.  
  387.       WInfo.CodePage = viewer.GetInfo(WInfo.Id).CurMode.CodePage
  388.  
  389.      elseif WInfo.Type == F.WTYPE_EDITOR then
  390.  
  391.       WInfo.CodePage = editor.GetInfo(WInfo.Id).CodePage
  392.  
  393.      end
  394.  
  395.     end
  396.  
  397.    end
  398.  
  399.    -- Формирование таблицы контекста }
  400.  
  401.    mf.msave('BAX','SaveContext['.. mf.date('%Y.%m0.%d %X;') ..Name..']', aStatus)
  402.  
  403.    far.AdvControl(F.ACTL_REDRAWALL)
  404.  
  405.   end; -- action
  406.  
  407. }
  408.  
  409. ------------------------------------------------------------------
  410.  
  411. local Menu_Item_Restore
  412.  
  413. Menu_Item_Restore = {
  414.  
  415.   description = "Восстановление контекста";                        -- string (опциональное поле)
  416.  
  417.   menu   = "Plugins";
  418.  
  419.   area   = "Shell";
  420.  
  421.   guid   = "A435D567-AD64-4DD1-8C61-28CB90358817";
  422.  
  423.   text   = function(menu,area)
  424.  
  425.    local nVers = 0
  426.  
  427.    if type(mBaseTools.Version) == 'string' then
  428.  
  429.     for w in mBaseTools.Version:gmatch"%d+" do
  430.  
  431.      nVers = (nVers * 1000) + w
  432.  
  433.     end
  434.  
  435.    end
  436.  
  437.    if nVers < 001001001 then return end
  438.  
  439.    local List = mBaseTools.mList('BAX', [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;.*\]/]], nil, true)
  440.  
  441.    if next(List) then
  442.  
  443.     Menu_Item_Restore.List = List
  444.  
  445.     return "Восстановление контекста"
  446.  
  447.    end
  448.  
  449.   end;
  450.  
  451.   action = function(OpenFrom,Item)
  452.  
  453.    local function RestOnePan(Pan, whatpan, WhatPan, A_P)
  454.  
  455.     if Cfg.Path then
  456.  
  457.      panel.SetPanelDirectory(nil, whatpan, Pan.Path)
  458.  
  459.      Panel.SetPos(WhatPan, Pan.Current)
  460.  
  461.     end
  462.  
  463.     local PInfo = Pan.Info
  464.  
  465.     --[=[
  466.  
  467.       OwnerGuid:           string
  468.  
  469.       PluginHandle:        userdata, or nil
  470.  
  471.       PanelType:           integer
  472.  
  473.       PanelRect:           table (fields: left, top, right, bottom)
  474.  
  475.       ItemsNumber:         integer
  476.  
  477.       SelectedItemsNumber: integer
  478.  
  479.       CurrentItem:         1-based integer
  480.  
  481.       TopPanelItem:        1-based integer
  482.  
  483.     --ViewMode:            integer
  484.  
  485.     --SortMode:            integer
  486.  
  487.       Flags:               flags
  488.  
  489.       PluginObject:        non-false Lua value
  490.  
  491.     --]=]
  492.  
  493.     if Cfg.ViewMode then
  494.  
  495.      panel.SetViewMode(nil, whatpan, PInfo.ViewMode)  -- Режим просмотра
  496.  
  497.     end
  498.  
  499.     if Cfg.SortMode then
  500.  
  501.      panel.SetSortMode(nil, whatpan, PInfo.SortMode)  -- Режим сортировки
  502.  
  503.      panel.SetSortOrder(nil, whatpan, band(PInfo.Flags, F.PFLAGS_REVERSESORTORDER) == F.PFLAGS_REVERSESORTORDER) -- реверсивная сортировка
  504.  
  505.      panel.SetDirectoriesFirst(nil, whatpan, band(PInfo.Flags, F.PFLAGS_DIRECTORIESFIRST) == F.PFLAGS_DIRECTORIESFIRST) -- директории сначала
  506.  
  507.     end
  508.  
  509.     if Cfg.Filters then
  510.  
  511.      FileFilterTools.TableToFilters(Pan.Filter, A_P)
  512.  
  513.     end
  514.  
  515.    end -- RestOnePan
  516.  
  517.    --local sChoice = Menu.Show(table.concat(Menu_Item_Restore.List, '\n'), 'Выберите контекст', 0x20+0x100+0x200)
  518.  
  519.    local miList = {}
  520.  
  521.    for _,v in ipairs(Menu_Item_Restore.List) do
  522.  
  523.     miList[#miList+1] = regex.match(v.Name, [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;(.*)\]/]])
  524.  
  525.    end
  526.  
  527.    local iChoice = Menu.Show(table.concat(miList, '\n'), 'Выберите контекст', 0x8+0x100)
  528.  
  529.    if iChoice > 0 then
  530.  
  531.     local aContext = mf.mload('BAX', Menu_Item_Restore.List[iChoice].Name)
  532.  
  533.     if aContext then
  534.  
  535.      -- 1. Делаю активной ту же панель (левую-правую), что и при сохранении
  536.  
  537.      if Cfg.Path or Cfg.ViewMode or Cfg.SortMode or Cfg.Filters then
  538.  
  539.       if APanel.Left ~= aContext.APanel.Left then panel.SetActivePanel(nil, 0) end
  540.  
  541.       RestOnePan(aContext.APanel, 1, 0, 'A')
  542.  
  543.       RestOnePan(aContext.PPanel, 0, 1, 'P')
  544.  
  545.      end
  546.  
  547.      if Cfg.Windows then
  548.  
  549.       for _,v in ipairs(aContext.Windows) do
  550.  
  551.        if v.Type == F.WTYPE_VIEWER then
  552.  
  553.         viewer.Viewer(v.Name,    nil,  nil,nil, nil,nil, bor(F.VF_IMMEDIATERETURN, F.VF_NONMODAL), v.CodePage )
  554.  
  555.         --            FileName, Title, X1, Y1,  X2, Y2,  Flags,                                    CodePage
  556.  
  557.        elseif v.Type == F.WTYPE_EDITOR then
  558.  
  559.         editor.Editor(v.Name,   nil,  nil, nil, nil, nil, bor(F.EF_IMMEDIATERETURN,F.EF_NONMODAL, F.EF_OPENMODE_BREAKIFOPEN),
  560.  
  561.         --            FileName, Title, X1, Y1,  X2,  Y2,   Flags,
  562.  
  563.                       nil,     nil,     v.CodePage)
  564.  
  565.         --         StartLine, StartChar, CodePage
  566.  
  567.        end
  568.  
  569.       end -- for _,v in ipairs(aContext.Windows)
  570.  
  571.       -- Переключение на панели (Shell)
  572.  
  573.       do
  574.  
  575.        local n = far.AdvControl(F.ACTL_GETWINDOWCOUNT)
  576.  
  577.        local wi
  578.  
  579.        for i=1,n do
  580.  
  581.         wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  582.  
  583.         if wi.Type == F.WTYPE_PANELS then
  584.  
  585.          far.AdvControl(F.ACTL_SETCURRENTWINDOW, wi.Pos)
  586.  
  587.          far.AdvControl(F.ACTL_COMMIT);
  588.  
  589.          far.AdvControl(F.ACTL_REDRAWALL);
  590.  
  591.          break
  592.  
  593.         end
  594.  
  595.        end
  596.  
  597.       end
  598.  
  599.      end -- if Cfg.Windows
  600.  
  601.     end
  602.  
  603.    end
  604.  
  605.   end;-- action
  606.  
  607. } -- Menu_Item_Restore
  608.  
  609. MenuItem(Menu_Item_Restore)
  610.  
  611. -------------------------------------------------------------------------
  612.  
  613. MenuItem{
  614.  
  615.   description = "Очистка сохранённых контекстов";
  616.  
  617.   menu   = "Config";
  618.  
  619.   area = 'Shell';
  620.  
  621.   guid   = "9526981C-FACA-44E4-BBC9-7B0BDC1E4B7C";
  622.  
  623.   text   = "BAX - Сохранение контекстов";
  624.  
  625.   action = function(OpenFrom,Item)
  626.  
  627.    Config()
  628.  
  629.   end; -- action
  630.  
  631. }
  632.  
  633. -------------------------------------------------------------------------
A на мой вгляд так например, тот же код, но выглядит значительно лучше:
  1. ----[[*D*]]local le = require"le"
  2.  
  3. local mBaseTools = require "Bax.mBaseTools"
  4.  
  5. local FileFilterTools = require "BAX.FileFilterTools"
  6.  
  7. local DialogTools = require "BAX.DialogTools"
  8.  
  9. local DialogItem = DialogTools.DialogItem
  10.  
  11. local F = far.Flags
  12.  
  13. local Config
  14.  
  15. local Info = package.loaded.regscript or function(...) return ... end
  16.  
  17. local nfo = Info {
  18.  
  19.     _filename or ...,
  20.  
  21.     name    = "Save-Rest Context",
  22.  
  23.     description = "Сохранение-восстановление контекста",
  24.  
  25.     -- http://semver.org/lang/ru/
  26.  
  27.     version = "1.1.1",
  28.  
  29.     author  = "BAX",
  30.  
  31.     url = "https://forum.farmanager.com/viewtopic.php?p=164383#p164383",
  32.  
  33.     id  = "9D5D4FD6-67B7-45FD-B204-F555481FF1FB",
  34.  
  35.     history = [[
  36.  
  37. 26.01.2021 v1.1.1 - стартовая версия
  38.  
  39. ]],
  40.  
  41. --  parent_id   = "";
  42.  
  43. --  minfarversion   = {3,0,0,4744,0};
  44.  
  45. --  files       = "*.cfg;*.ru.lng";
  46.  
  47.     config      = function(nfo, name) Config('FromInfo') end
  48.  
  49. --  help        = function(nfo,name) end;
  50.  
  51. --  execute     = function(nfo,name) end;
  52.  
  53. --  disabled    = false;
  54.  
  55. --  options     = {};
  56.  
  57. }
  58.  
  59. if not nfo then return end
  60.  
  61. --[[
  62.  
  63. local O = nfo.options --]]
  64.  
  65.  
  66.  
  67. local CfgDef = {Path = true, ViewMode = true, SortMode = true, Filters = true, Windows = true}
  68.  
  69.  
  70.  
  71. local function TabMerge(Tab1, Tab2)
  72.  
  73.     local i, v = next(Tab2)
  74.  
  75.     while i
  76.  
  77.     do  if Tab1[i] == nil then Tab1[i] = v end
  78.  
  79.         i, v = next(Tab2, i)
  80.  
  81.     end
  82.  
  83.     return Tab1
  84.  
  85. end
  86.  
  87.  
  88.  
  89. local Cfg = TabMerge(mf.mload('BAX', 'SaveContext.Settings') or {}, CfgDef)
  90.  
  91.  
  92.  
  93.  
  94.  
  95. local function ClearContextes()
  96.  
  97.     local List = mBaseTools.mList('BAX', [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;.*\]/]], nil, true)
  98.  
  99.     local miList = {}
  100.  
  101.     for _, v in ipairs(List)
  102.  
  103.     do  miList[#miList + 1] = regex.match(v.Name, [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;(.*)\]/]])
  104.  
  105.     end
  106.  
  107.     if  #miList == 0
  108.  
  109.     then    far.Message('Сохранённых контекстов не найдено', '', nil, 'w')
  110.  
  111.     else
  112.  
  113.         local ForDel = Menu.Show(
  114.  
  115.             table.concat(miList, '\n'),
  116.  
  117.             'Отметьте удаляемые контексты\nInc - отметить', 0x8 + 0x10
  118.  
  119.                 )
  120.  
  121.         if  type(ForDel) == 'string' and ForDel ~= ''
  122.  
  123.         then    local aForDel = {}
  124.  
  125.             for w in ForDel:gmatch "([^%c]+)"
  126.  
  127.             do  local i = tonumber(w) or 0
  128.  
  129.                 if List[i] then aForDel[#aForDel + 1] = i end
  130.  
  131.             end
  132.  
  133.             for _, v in ipairs(aForDel)
  134.  
  135.             do  mf.mdelete('BAX', List[v].Name)
  136.  
  137.                 List[v].Deleted = true
  138.  
  139.             end
  140.  
  141.         end
  142.  
  143.     end
  144.  
  145. end
  146.  
  147.  
  148.  
  149. Config = function(OpenFrom)
  150.  
  151.     local aDlg = {}
  152.  
  153.     local function Add(item) aDlg[#aDlg + 1] = DialogItem(item) end
  154.  
  155.     local h, w = 9, 75
  156.  
  157.     Add {"DI_DOUBLEBOX", 0, 0, w - 1, h - 1, Text = 'Сохранение контекстов - настройка'}
  158.  
  159.     Add {"DI_TEXT", x1 = -1, y1 = 2, Text = 'Отметьте, что надо восстанавливать'}
  160.  
  161.     Add {
  162.  
  163.         "DI_CHECKBOX",
  164.  
  165.         y1 = 3,
  166.  
  167.         Text = "Папки",
  168.  
  169.         Flags = 'DIF_CENTERGROUP',
  170.  
  171.         Checked = Cfg.Path and 1 or 0,
  172.  
  173.         Name = 'Path'
  174.  
  175.     }
  176.  
  177.     Add {"DI_CHECKBOX", y1 = 3, Text = "Режимы просмотра", Flags = 'DIF_CENTERGROUP', Name = 'ViewMode'}
  178.  
  179.     Add {"DI_CHECKBOX", y1 = 3, Text = "Сортировки", Flags = 'DIF_CENTERGROUP', Name = 'SortMode'}
  180.  
  181.     Add {"DI_CHECKBOX", y1 = 3, Text = "Фильтры", Flags = 'DIF_CENTERGROUP', Name = 'Filters'}
  182.  
  183.     Add {"DI_CHECKBOX", y1 = 3, Text = "Окна", Flags = 'DIF_CENTERGROUP', Name = 'Windows'}
  184.  
  185.     Add {
  186.  
  187.         "DI_BUTTON",
  188.  
  189.         x1 = 3,
  190.  
  191.         y1 = 5,
  192.  
  193.         Text = 'Очистка контекстов',
  194.  
  195.         Flags = "DIF_BTNNOCLOSE|DIF_CENTERGROUP",
  196.  
  197.         Name = 'Clear'
  198.  
  199.     }
  200.  
  201.     Add {"DI_TEXT", y1 = 6, Flags = "DIF_SEPARATOR"}
  202.  
  203.     Add {"DI_BUTTON", y1 = 7, Text = "Ok", Flags = "DIF_DEFAULTBUTTON|DIF_CENTERGROUP", Name = 'Ok'}
  204.  
  205.     Add {"DI_BUTTON", y1 = 7, Text = "Ok", Flags = "DIF_CENTERGROUP"}
  206.  
  207.     -- Начальная установка
  208.  
  209.     for _, v in ipairs(aDlg)
  210.  
  211.     do  if (v[1] == F.DI_CHECKBOX or v[1] == 'DI_CHECKBOX') and v.Name then v[6] = Cfg[v.Name] and 1 or 0 end
  212.  
  213.     end
  214.  
  215.  
  216.  
  217.     local function DlgProc(hDlg, Msg, Param1, Param2)
  218.  
  219.         if Msg == F.DN_BTNCLICK and aDlg[Param1].Name == 'Clear' then ClearContextes() end
  220.  
  221.     end
  222.  
  223.  
  224.  
  225.     local i = far.Dialog(win.Uuid 'EDF1053E-6888-4CA9-B60E-E15D852F37C2', -1, -1, w, h, nil, aDlg, 'FDLG_SMALLDIALOG', DlgProc)
  226.  
  227.     if  i > 0 and aDlg[i].Name == 'Ok'
  228.  
  229.     then    for _, v in ipairs(aDlg)
  230.  
  231.         do  if (v[1] == F.DI_CHECKBOX or v[1] == 'DI_CHECKBOX') and v.Name then Cfg[v.Name] = v[6] == 1 end
  232.  
  233.         end
  234.  
  235.         mf.msave('BAX', 'SaveContext.Settings', Cfg)
  236.  
  237.     end
  238.  
  239.     if OpenFrom ~= 'FromInfo' then mf.postmacro(Keys, 'Esc') end
  240.  
  241. end
  242.  
  243.  
  244.  
  245. Event { description = "Event example",
  246.  
  247.     id = "A459EC76-7B68-46D4-82CC-AB221FAD6791",
  248.  
  249.     group   = "DialogEvent",
  250.  
  251. --  filemask    = "*.txt,*.cpp";
  252.  
  253. --  priority    = 50;
  254.  
  255.     condition = function(Event, Param)
  256.  
  257.         return Dlg.Id == far.Guids.FarAskQuitId and Event == F.DE_DLGPROCINIT and Param.Msg == F.DN_ENTERIDLE
  258.  
  259.     end,
  260.  
  261.     action = function(Event, Param)
  262.  
  263.         local DlgRect = Param.hDlg:send(F.DM_GETDLGRECT)
  264.  
  265.         local DlgB, DlgL, DlgR = DlgRect.Bottom, DlgRect.Left, DlgRect.Right
  266.  
  267.         local sText = ' ^S-сохранить контекст '
  268.  
  269.         far.Text(
  270.  
  271.             DlgL + math.floor((DlgR - DlgL + 1 - sText:len()) / 2), DlgB - 1,
  272.  
  273.             far.AdvControl(far.Flags.ACTL_GETCOLOR, far.Colors.COL_DIALOGBOX), sText
  274.  
  275.                 )
  276.  
  277.         far.Text()
  278.  
  279.     end
  280.  
  281. }
  282.  
  283.  
  284.  
  285. ------------- Сохранение контекста -------------------------------
  286.  
  287.  
  288.  
  289. Macro {
  290.  
  291.     id = "DEBB826F-857D-4B14-9D40-2F2A5AE3B45C",
  292.  
  293.     area = "Dialog Shell Info QView",
  294.  
  295.     key = "CtrlS",
  296.  
  297.     description = "Сохранение контекста",
  298.  
  299.     flags = "",
  300.  
  301.     condition = function(key, data) return not Area.Dialog or Dlg.Id == far.Guids.FarAskQuitId end,
  302.  
  303.     action = function(data)
  304.  
  305.         local Name0 = far.InputBox(
  306.  
  307.             '75FD55F0-6537-4FE2-A7EB-533AB21BE8CB', 'Сохранение контекста',
  308.  
  309.                     'Введите имя контекста', 'BAX.SaveContext'
  310.  
  311.                         )
  312.  
  313.         if not Name0 then return end
  314.  
  315.         local aTest = mBaseTools.mList('BAX',
  316.  
  317.             [[/(SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;\Q]]..
  318.  
  319.             Name0..[[\E( \(\d+\))?\])/]], nil, true
  320.  
  321.                 )
  322.  
  323.         local Name, Ask = nil, false
  324.  
  325.         if  #aTest == 0
  326.  
  327.         then    Name = Name0
  328.  
  329.         -- #(aTest or {}) > 0 then
  330.  
  331.         else
  332.  
  333.             -- Такой контекст уже есть.
  334.  
  335.             local iChoice = far.Message(
  336.  
  337.                 'Контекст с таким именем уже имеется  базе',
  338.  
  339.                         'Сохранение контекста', 'Переименовать;Заменить;Отказ',
  340.  
  341.                         'w')
  342.  
  343.             -- Заменить
  344.  
  345.             if  iChoice == 2
  346.  
  347.             then    for _, v in ipairs(aTest) do mf.mdelete('BAX', v.Name) end
  348.  
  349.                 Name = Name0
  350.  
  351.             elseif  iChoice == 1
  352.  
  353.             then    Ask = true
  354.  
  355.                 far.Message("Подбор имени контекста. Ждите\nEsc - прервать", 'Сохранение контекста', '')
  356.  
  357.                 for i = 1, math.huge
  358.  
  359.                 do  if  mf.waitkey(1) == 'Esc'
  360.  
  361.                     then    Name = nil;
  362.  
  363.                         far.AdvControl(F.ACTL_REDRAWALL)
  364.  
  365.                         break
  366.  
  367.                     end
  368.  
  369.                     Name = ('%s (%d)'):format(Name0, i)
  370.  
  371.                     aTest = mBaseTools.mList('BAX', [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;\Q]]..Name..[[\E\]/]], nil, true)
  372.  
  373.                     if #aTest == 0 then break end
  374.  
  375.                 end -- for i=1,math.huge
  376.  
  377.             end
  378.  
  379.         end
  380.  
  381.         if Name and Ask and far.Message("Сохранение контекста с именем\n"..Name, "Сохранение контекста", ';YesNo') ~= 1 then Name = nil end
  382.  
  383.         if not Name then return end
  384.  
  385.         -- Формирование таблицы контекста {
  386.  
  387.         local aStatus = {
  388.  
  389.             APanel = {
  390.  
  391.                 Path = panel.GetPanelDirectory(nil, 1),
  392.  
  393.                 Current = APanel.Current,
  394.  
  395.                 Filter = FileFilterTools.FilterToTable('A'),
  396.  
  397.                 Info = panel.GetPanelInfo(nil, 1),
  398.  
  399.                 Left = APanel.Left
  400.  
  401.             },
  402.  
  403.             PPanel = {
  404.  
  405.                 Path = panel.GetPanelDirectory(nil, 0),
  406.  
  407.                 Current = PPanel.Current,
  408.  
  409.                 Filter = FileFilterTools.FilterToTable('P'),
  410.  
  411.                 Info = panel.GetPanelInfo(nil, 0),
  412.  
  413.                 Left = PPanel.Left
  414.  
  415.             },
  416.  
  417.             Windows = {}
  418.  
  419.         }
  420.  
  421.         for i = 0, far.AdvControl(F.ACTL_GETWINDOWCOUNT)
  422.  
  423.         do  local WInfo = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  424.  
  425.             if  WInfo
  426.  
  427.             then    aStatus.Windows[WInfo.Pos] = WInfo
  428.  
  429.                 if  WInfo.Type == F.WTYPE_VIEWER
  430.  
  431.                 then    WInfo.CodePage = viewer.GetInfo(WInfo.Id).CurMode.CodePage
  432.  
  433.                 elseif  WInfo.Type == F.WTYPE_EDITOR
  434.  
  435.                 then    WInfo.CodePage = editor.GetInfo(WInfo.Id).CodePage
  436.  
  437.                 end
  438.  
  439.             end
  440.  
  441.         end
  442.  
  443.         -- Формирование таблицы контекста }
  444.  
  445.         mf.msave('BAX', 'SaveContext['..mf.date('%Y.%m0.%d %X;')..Name..']', aStatus)
  446.  
  447.         far.AdvControl(F.ACTL_REDRAWALL)
  448.  
  449.     end -- action
  450.  
  451. }
  452.  
  453.  
  454.  
  455.  
  456.  
  457. local Menu_Item_Restore
  458.  
  459. Menu_Item_Restore = {
  460.  
  461.     -- string (опциональное поле)
  462.  
  463.     description = "Восстановление контекста",
  464.  
  465.     menu = "Plugins",
  466.  
  467.     area = "Shell",
  468.  
  469.     guid = "A435D567-AD64-4DD1-8C61-28CB90358817",
  470.  
  471.     text = function(menu, area)
  472.  
  473.         local nVers = 0
  474.  
  475.         if  type(mBaseTools.Version) == 'string'
  476.  
  477.         then    for w in mBaseTools.Version:gmatch "%d+" do nVers = (nVers * 1000) + w end
  478.  
  479.         end
  480.  
  481.         if nVers < 001001001 then return end
  482.  
  483.         local List = mBaseTools.mList('BAX', [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;.*\]/]], nil, true)
  484.  
  485.         if  next(List)
  486.  
  487.         then    Menu_Item_Restore.List = List
  488.  
  489.             return "Восстановление контекста"
  490.  
  491.         end
  492.  
  493.     end,
  494.  
  495.     action = function(OpenFrom, Item)
  496.  
  497.  
  498.  
  499.         local function RestOnePan(Pan, whatpan, WhatPan, A_P)
  500.  
  501.             if  Cfg.Path
  502.  
  503.             then    panel.SetPanelDirectory(nil, whatpan, Pan.Path)
  504.  
  505.                 Panel.SetPos(WhatPan, Pan.Current)
  506.  
  507.             end
  508.  
  509.             local PInfo = Pan.Info
  510.  
  511.             --[=[
  512.  
  513.       OwnerGuid:           string
  514.  
  515.       PluginHandle:        userdata, or nil
  516.  
  517.       PanelType:           integer
  518.  
  519.       PanelRect:           table (fields: left, top, right, bottom)
  520.  
  521.       ItemsNumber:         integer
  522.  
  523.       SelectedItemsNumber: integer
  524.  
  525.       CurrentItem:         1-based integer
  526.  
  527.       TopPanelItem:        1-based integer
  528.  
  529.     --ViewMode:            integer
  530.  
  531.     --SortMode:            integer
  532.  
  533.       Flags:               flags
  534.  
  535.       PluginObject:        non-false Lua value
  536.  
  537.     --]=]
  538.  
  539.             if  Cfg.ViewMode
  540.  
  541.             -- Режим просмотра
  542.  
  543.             then    panel.SetViewMode(nil, whatpan, PInfo.ViewMode)
  544.  
  545.             end
  546.  
  547.             if  Cfg.SortMode
  548.  
  549.             -- Режим сортировки
  550.  
  551.             then    panel.SetSortMode(nil, whatpan, PInfo.SortMode)
  552.  
  553.                 -- реверсивная сортировка
  554.  
  555.                 panel.SetSortOrder(nil, whatpan, band(PInfo.Flags, F.PFLAGS_REVERSESORTORDER) == F.PFLAGS_REVERSESORTORDER)
  556.  
  557.                 -- директории сначала
  558.  
  559.                 panel.SetDirectoriesFirst(nil, whatpan, band(PInfo.Flags, F.PFLAGS_DIRECTORIESFIRST) == F.PFLAGS_DIRECTORIESFIRST)
  560.  
  561.             end
  562.  
  563.             if Cfg.Filters then FileFilterTools.TableToFilters(Pan.Filter, A_P) end
  564.  
  565.         end -- RestOnePan
  566.  
  567.     --  local sChoice = Menu.Show(table.concat(Menu_Item_Restore.List, '\n'), 'Выберите контекст', 0x20+0x100+0x200)
  568.  
  569.         local miList = {}
  570.  
  571.         for _, v in ipairs(Menu_Item_Restore.List)
  572.  
  573.         do  miList[#miList + 1] = regex.match(v.Name, [[/SaveContext\[\d\d\d\d\.\d\d\.\d\d\s\d\d.\d\d.\d\d;(.*)\]/]])
  574.  
  575.         end
  576.  
  577.         local iChoice = Menu.Show(table.concat(miList, '\n'), 'Выберите контекст', 0x8 + 0x100)
  578.  
  579.         if  iChoice > 0
  580.  
  581.         then    local aContext = mf.mload('BAX', Menu_Item_Restore.List[iChoice].Name)
  582.  
  583.             if  aContext
  584.  
  585.             -- 1. Делаю активной ту же панель (левую-правую), что и при сохранении
  586.  
  587.             then
  588.  
  589.                 if  Cfg.Path or Cfg.ViewMode or Cfg.SortMode or Cfg.Filters
  590.  
  591.                 then    if APanel.Left ~= aContext.APanel.Left then panel.SetActivePanel(nil, 0) end
  592.  
  593.                     RestOnePan(aContext.APanel, 1, 0, 'A')
  594.  
  595.                     RestOnePan(aContext.PPanel, 0, 1, 'P')
  596.  
  597.                 end
  598.  
  599.                 if  Cfg.Windows
  600.  
  601.                 then    for _, v in ipairs(aContext.Windows)
  602.  
  603.                     do  if  v.Type == F.WTYPE_VIEWER
  604.  
  605.                         then    viewer.Viewer(v.Name, nil, nil, nil, nil, nil, bor(F.VF_IMMEDIATERETURN, F.VF_NONMODAL), v.CodePage)
  606.  
  607.                             --  FileName, Title, X1, Y1, X2, Y2,    Flags,                  CodePage
  608.  
  609.                         elseif  v.Type == F.WTYPE_EDITOR
  610.  
  611.                         then    editor.Editor(v.Name, nil, nil, nil, nil, nil,
  612.  
  613.                                 -- FileName, Title, X1, Y1,  X2,  Y2,   Flags,
  614.  
  615.                                 bor(F.EF_IMMEDIATERETURN, F.EF_NONMODAL, F.EF_OPENMODE_BREAKIFOPEN),
  616.  
  617.                                 nil, nil, v.CodePage)
  618.  
  619.                             --  StartLine, StartChar, CodePage
  620.  
  621.                         end
  622.  
  623.                     end -- for _,v in ipairs(aContext.Windows)
  624.  
  625.                     -- Переключение на панели (Shell)
  626.  
  627.                     do
  628.  
  629.                         local n = far.AdvControl(F.ACTL_GETWINDOWCOUNT)
  630.  
  631.                         local wi
  632.  
  633.                         for i = 1, n
  634.  
  635.                         do  wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  636.  
  637.                             if  wi.Type == F.WTYPE_PANELS
  638.  
  639.                             then    far.AdvControl(F.ACTL_SETCURRENTWINDOW, wi.Pos)
  640.  
  641.                                 far.AdvControl(F.ACTL_COMMIT);
  642.  
  643.                                 far.AdvControl(F.ACTL_REDRAWALL);
  644.  
  645.                                 break
  646.  
  647.                             end
  648.  
  649.                         end
  650.  
  651.                     end
  652.  
  653.                 end -- if Cfg.Windows
  654.  
  655.             end
  656.  
  657.         end
  658.  
  659.     end -- action
  660.  
  661. -- Menu_Item_Restore
  662.  
  663. }
  664.  
  665.  
  666.  
  667. MenuItem(Menu_Item_Restore)
  668.  
  669.  
  670.  
  671.  
  672.  
  673. MenuItem {
  674.  
  675.     description = "Очистка сохранённых контекстов",
  676.  
  677.     menu = "Config",
  678.  
  679.     area = 'Shell',
  680.  
  681.     guid = "9526981C-FACA-44E4-BBC9-7B0BDC1E4B7C",
  682.  
  683.     text = "BAX - Сохранение контекстов",
  684.  
  685.     -- action
  686.  
  687.     action = function(OpenFrom, Item) Config() end
  688.  
  689. }
  690.  
  691.  
  692.  
  693. -- @@@@@
Хмм, Codebox не делает табы по 8, что разрушает идею показать.
Последний код рассчитан на табы по 8, а не 4
Можно посмотреть так "улучшенное форматиорвание", но без подсветки кода:


Особо отмечу что я написал себе инструмент для авто-форматирования,
и последний ("улучшенный") код получен этим инструментом автоматически.

если этот способ форматирования получит общественный и достаточно массовый интерес, то оформлю и опубликую.
Last edited by citRiks on Fri 29 Jan, 2021 16:36, edited 3 times in total.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by DrKnS »

citRiks wrote: Fri 29 Jan, 2021 16:01 Codebox не делает табы по 8, что разрушает идею показать.
Последний код рассчитан на табы по 8, а не 4
Если ваше форматирование ломается от изменения размера табуляции, то это неправильное форматирование.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by citRiks »

DrKnS wrote: Fri 29 Jan, 2021 16:13 Если ваше форматирование ломается от изменения размера табуляции, то это неправильное форматирование.
Про использование табов - это действительно спорно
Но все же, с точки зрения как читабельности, так и самого процесса,
они дают больше на мой вгляд чем с пробелами,
при написании если пробелы то у меня больше возни получается,
а табы делают линейность и ровность которая легче поддается осмыслению и себе,
и я так предполагаю что и другим людям, разве нет?
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by HaRT »

citRiks wrote: Fri 29 Jan, 2021 16:25разве нет?
Нет
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by citRiks »

HaRT, DrKnS,
спасибо всем ответившим :)
и особое спасибо тем кто потрудился дать ответы состоящий из более чем одного слова
Если не трудно, ты выберите свой вариант ответа в голосовании, я его специально сделал с разными вариантами,
чтобы люди не переутомлялись от писанины.

Далее, вопрос поставлен не про (не-)использование табов, а более общий,
следует ли быть стандарту, нужно ли соблюдать форматирование,
и какие для этого инструменты?
Лично для меня вопрос решен, в том числе и с инструментами,
но это не личный вопрос а предложение к обсуждению и пониманию

PS
я даже еще пару вариантов добавил
Last edited by citRiks on Fri 29 Jan, 2021 16:46, edited 2 times in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by John Doe »

citRiks wrote: Fri 29 Jan, 2021 16:25 Про использование табов - это действительно спорно
Может это и спорно, но я тоже не понимаю как правильное использование табуляции может ломать форматирование.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by citRiks »

John Doe wrote: Fri 29 Jan, 2021 17:52 Может это и спорно, но я тоже не понимаю как правильное использование табуляции может ломать форматирование.
Ну насколько я понимаю, обычно говорят что "ты не можешь рассчитывать что на другом компе/среде/человеке будет тот же размер таба, а следовательно перекосит".
В не-редакторах, команд-лайн консоли например, размер таба может быть удивительный, или отоброжаться непонятным кружочком,
примера с кружочком под рукой не оказалось, поэтому более простой например:
lua:far.Show("aaa \n aaagggg"),

но собсно, если речь именно о редактировании в редакторе на благо форматирования, то от ТАБа пользы много
Last edited by citRiks on Fri 29 Jan, 2021 18:01, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by John Doe »

citRiks wrote: Fri 29 Jan, 2021 18:00"ты не можешь рассчитывать что на другом компе/среде/человеке будет тот же размер таба, а следовательно перекосит".
Пример есть?
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by citRiks »

John Doe wrote: Fri 29 Jan, 2021 18:57 Пример есть?
Не уверен что я понял вопрос, так как примеры собсна везде.
Например в ГиХабе, я задал чтобы табы были по 8.
Но в компараторе коммитов, все равно он делает по 4.

хмм, сейчас посмотрел, вроде тоже 8 как надо

Ну чтобы далеко не ходить, в ФАРе дефолтный ТАБ 8, в Еклипсе 4, в ВизаулСтудия тоже 4.
Соответственно, если открывать в разных этих редакторах, то будет выглядеть по-разному
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by John Doe »

citRiks wrote: Fri 29 Jan, 2021 19:17 то будет выглядеть по-разному
Очевидно.
Но разве это то же самое, что "ломается форматирование".
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by Shmuel »

Вроде никто не упомянул об автоматических форматтерах, они есть для разных языков, в том числе для Lua.
Сам не пользуюсь, но кому интересно, может без особого труда их найти в Интернете.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by Дмитрий Журко »

Думаю, надо обсуждать пожелания, которые разделяются несколькими писателями. Задачи у кодеров разные, для них подходит несколько разный стиль.

Я за обсуждение и за образцы кода. И вот, кстати, Addons и farapi.lua могли бы стать образцами... но не совсем стали. Я имею в виду Addons.

За пару недель, что погружался, я много кода почитал. Не всегда хочу писать так же.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by citRiks »

Shmuel wrote: Fri 29 Jan, 2021 20:11 Вроде никто не упомянул об автоматических форматтерах, они есть для разных языков, в том числе для Lua.
Сам не пользуюсь, но кому интересно, может без особого труда их найти в Интернете.
я вроде про это аж в заголовке написал слово "инструменты" и далее по тексту несколько раз :)
надеялся что будет понятно что не про плоскогубцы и молотки речь, но увы..
A найти можно много чего, но вопрос был не совсем про это
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Правила форматирования кода для читабельности, понятности, т.е. повт. использования. Инструменты, опыт, предложения?

Post by citRiks »

John Doe wrote: Fri 29 Jan, 2021 20:04 Но разве это то же самое, что "ломается форматирование".
может и не то же, но похоже на то :)
в моем понимании, если "начинает выглядеть по другому", то это и есть "поломка формата".
на всякий случай уточню, что под "форматированием" я имею ввиду сугубо текст (а не раскраску например)
Post Reply

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