Condensed View

Здесь выкладываются готовые к использованию макросы и скрипты.
Post Reply
buniak_a_h
Posts: 261
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 32 times
Been thanked: 4 times
Contact:

Condensed View

Post by buniak_a_h » Fri 24 Jul, 2015 02:43

В фаре 1.7 был замечательный плугин - Condenced view. Он "скрывал" строки, информация в которых начиналась правее позиции курсора в момент вызова, что очень удобно для разработчиков софта (скрыть вложенные блоки). Я попытался сделать аналог в виде макроса на LUA.
  1. --[[ Буняк А.Х., ©BAX
  2.  
  3. Макрос, переводящий редактор в "сжатый" режим
  4.  
  5. (аналогично плагину Condenced View). Показывает только те строки.
  6.  
  7. у которых первый непробельный символ находится на позиции курсора
  8.  
  9. или левее.
  10.  
  11. --]]
  12.  
  13.  
  14.  
  15. -- +
  16.  
  17. -- Константы
  18.  
  19. -- -
  20.  
  21. local F = far.Flags
  22.  
  23. local color={Flags=bit64.bor(F.FCF_FG_4BIT,F.FCF_BG_4BIT),ForegroundColor=0,BackgroundColor=0x3}
  24.  
  25.  
  26.  
  27. -- +
  28.  
  29. -- Настройки
  30.  
  31. local function Settings()
  32.  
  33. return{
  34.  
  35.   OnKey="AltF4",
  36.  
  37.   OffKey="F10 Esc",
  38.  
  39.   GoKey="Enter",
  40.  
  41.   SetupKey='AltF4'
  42.  
  43. }
  44.  
  45. end
  46.  
  47. local function MergeSettings(Old, New)
  48.  
  49.  if New then
  50.  
  51.   for i,v in pairs(New) do
  52.  
  53.    Old<span style="font-style: italic">=v
  54.  
  55.   end
  56.  
  57.  end
  58.  
  59.  return Old
  60.  
  61. end
  62.  
  63.  
  64.  
  65. local CfgName=(...):match("(.*)%.lua")..'.cfg'
  66.  
  67. local CfgProc=loadfile(CfgName)
  68.  
  69. local S=MergeSettings( Settings(), CfgProc and CfgProc() or nil)
  70.  
  71. -- -
  72.  
  73.  
  74.  
  75. -- Список параметров характеристик редакторов,
  76.  
  77. -- у которых включён Condensed режим
  78.  
  79. local EditorsCondView={}
  80.  
  81.  
  82.  
  83. -- +
  84.  
  85. -- Проверка, активен ли макрос (редактор в сжатом виде).
  86.  
  87. -- -
  88.  
  89. local function IsMacroActive()
  90.  
  91.  local ei=editor.GetInfo()
  92.  
  93.  if not ei then return end;
  94.  
  95.  return EditorsCondView[ei.EditorID]
  96.  
  97. end;
  98.  
  99. --
  100.  
  101. local OnProcess = {}
  102.  
  103. --
  104.  
  105. -- +
  106.  
  107. local function GoToLinePos(EID, ln, cl, tsl, lpc)
  108.  
  109.  editor.SetPosition(EID, ln, -1, cl, tsl , lpc)
  110.  
  111.  editor.Redraw(EID)
  112.  
  113. end
  114.  
  115. -- -
  116.  
  117. -- +
  118.  
  119. -- Установка режима R/O
  120.  
  121. -- -
  122.  
  123. local function SetReadOnly(EID, abRO) -- abRO - True или False
  124.  
  125.  editor.SetParam(EID, F.ESPT_LOCKMODE, abRO)
  126.  
  127. end -- SetReadOnly
  128.  
  129.  
  130.  
  131. local function ProcessEditorInput()
  132.  
  133.  local ei=editor.GetInfo()
  134.  
  135.  if not ei then return end
  136.  
  137.  local EID=ei.EditorID
  138.  
  139.  local jj=ei.CurLine;
  140.  
  141.  local ii
  142.  
  143.  if not EditorsCondView[EID] then
  144.  
  145.   return
  146.  
  147.  end;
  148.  
  149.  if EditorsCondView[EID].Ends then
  150.  
  151.   return
  152.  
  153.  end;
  154.  
  155.  if EditorsCondView[EID].LastColored then
  156.  
  157.   if EditorsCondView[EID].LastColored == jj then
  158.  
  159.    return;
  160.  
  161.   end;
  162.  
  163.   editor.DelColor(EID,EditorsCondView[EID].LastColored, nil)
  164.  
  165.   EditorsCondView[EID].LastColored = nil
  166.  
  167.  end;
  168.  
  169.  ii = EditorsCondView[EID].Lines[jj]
  170.  
  171.  EditorsCondView[EID].LastColored = jj
  172.  
  173.  editor.SetTitle(EID, string.gsub(editor.GetFileName(EID),".*\\(.*)","%1")..string.char(17)..ii)
  174.  
  175.  editor.AddColor(EID, jj, 1, ei.WindowSizeX, 0, color, 200)
  176.  
  177.  editor.Redraw(EID)
  178.  
  179. end; -- ProcessEditorInput
  180.  
  181.  
  182.  
  183. -- +
  184.  
  185. -- Включить сжатый режим
  186.  
  187. -- -
  188.  
  189. local function CondViewOn(ei, EID)
  190.  
  191.  local x0,y0,yTopl, xLeftC = ei.CurTabPos,ei.CurLine,ei.TopScreenLine, ei.LeftPos
  192.  
  193.  local need
  194.  
  195.  local bReadOnly = band(ei.CurState,F.ECSTATE_LOCKED)~=0
  196.  
  197.  local bProcessed=false
  198.  
  199.  if OnProcess[EID] or EditorsCondView[EID] then return false end -- редактор занят или уже овраплен? уйдём
  200.  
  201.  OnProcess[EID] = true -- запомним, что в работе
  202.  
  203.  EditorsCondView[EID] =
  204.  
  205.    {Id=EID, ColPos=x0,LinePos=y0, TopScreenLine=yTopl, LeftPos=xLeftC,
  206.  
  207.     processed=false, ReadOnly0=bReadOnly,
  208.  
  209.     SelectInfo=editor.GetSelection(EID), Lines={},
  210.  
  211.     Bookmarks=editor.GetBookmarks(EID)
  212.  
  213.    }
  214.  
  215.  SetReadOnly(EID, false)
  216.  
  217.  editor.UndoRedo(EID,F.EUR_BEGIN) -- начнём блок отмены
  218.  
  219.  -- Удаление строк {
  220.  
  221.  local y1=y0
  222.  
  223.  -- Заполнение таблицы исходных номеров строк
  224.  
  225.  for i=1,ei.TotalLines do
  226.  
  227.   EditorsCondView[EID].Lines<span style="font-style: italic">=i
  228.  
  229.  end
  230.  
  231.  for i=ei.TotalLines,1,-1 do
  232.  
  233.   editor.ExpandTabs(EID, i)
  234.  
  235.   local sss = editor.GetString(EID,i,1)
  236.  
  237.   if string.match(sss.StringText, "^%s*$") then
  238.  
  239.    need=i<ei.TotalLines
  240.  
  241.   else
  242.  
  243.    need=true
  244.  
  245.    for j =1,x0 do
  246.  
  247.     if string.byte(sss.StringText, j)~=32 then
  248.  
  249.      need=false
  250.  
  251.      break
  252.  
  253.     end
  254.  
  255.    end
  256.  
  257.   end
  258.  
  259.   if need then
  260.  
  261.    editor.DeleteString(EID, i)
  262.  
  263.    table.remove(EditorsCondView[EID].Lines, i)
  264.  
  265.    bProcessed = true
  266.  
  267.    if i < y1 then
  268.  
  269.     y1 = y1 - 1
  270.  
  271.    end
  272.  
  273.   end
  274.  
  275.  end -- for i=ei.TotalLines,1,-1
  276.  
  277.  if bProcessed then
  278.  
  279.   editor.Redraw(EID)
  280.  
  281.   EditorsCondView[EID].processed = true
  282.  
  283.   GoToLinePos(EID, y1, x0, EditorsCondView[EID].TopScreenLine, EditorsCondView[EID].LeftPos)
  284.  
  285.  end
  286.  
  287.  -- Удаление строк }
  288.  
  289.  editor.UndoRedo(EID,F.EUR_END) -- закроем блок отмены
  290.  
  291.  SetReadOnly(EID, true)
  292.  
  293.  editor.SetTitle(EID, editor.GetFileName(EID).." Condenced")
  294.  
  295.  OnProcess[EID] = nil -- процесс обработки окончен
  296.  
  297.  ei = editor.GetInfo(EID)
  298.  
  299.  if ei then
  300.  
  301.   ProcessEditorInput();
  302.  
  303.  end
  304.  
  305.  return true
  306.  
  307. end -- CondViewOn(ei, EID)
  308.  
  309. -- +
  310.  
  311. -- Выключить сжатый режим
  312.  
  313. -- -
  314.  
  315. local function CondViewOff(ei, EID, bNewPos)
  316.  
  317.  --local ei=editor.GetInfo()
  318.  
  319.  --if not ei then return end
  320.  
  321.  --local EID=ei.EditorID
  322.  
  323.  local lnp,clp, tsl, lpc
  324.  
  325.  local ScrPos=ei.CurLine-ei.TopScreenLine
  326.  
  327.  if EditorsCondView[EID].LastColored then
  328.  
  329.   editor.DelColor(EID,EditorsCondView[EID].LastColored, nil)
  330.  
  331.   editor.Redraw(EID)
  332.  
  333.   EditorsCondView[EID].LastColored = nil
  334.  
  335.  end;
  336.  
  337.  EditorsCondView[EID].Ends = true;
  338.  
  339.  if bNewPos and ei then
  340.  
  341.   -- Заношу новый номер строки в EditorsCondView[EID]
  342.  
  343.   EditorsCondView[EID].LinePos = EditorsCondView[EID].Lines[ei.CurLine]
  344.  
  345.  end
  346.  
  347.  if OnProcess[EID] or not EditorsCondView[EID] then -- редактор занят или не овраплен? уйдём
  348.  
  349.   return false
  350.  
  351.  end
  352.  
  353.  OnProcess[EID] = true -- запомним, что в работе
  354.  
  355.  if EditorsCondView[EID].processed then
  356.  
  357.   SetReadOnly(EID, false)
  358.  
  359.   editor.UndoRedo(EID, F.EUR_UNDO)
  360.  
  361.  end
  362.  
  363.  SetReadOnly(EID, EditorsCondView[EID].ReadOnly0)
  364.  
  365.  editor.SetTitle(EID, editor.GetFileName(EID))
  366.  
  367.  
  368.  
  369.  lnp=EditorsCondView[EID].LinePos
  370.  
  371.  clp=EditorsCondView[EID].ColPos
  372.  
  373.  tsl = lnp - ScrPos
  374.  
  375.  lpc = EditorsCondView[EID].LeftPos
  376.  
  377.  
  378.  
  379.  OnProcess[EID] = nil -- процесс обработки окончен
  380.  
  381.  -- Восстановление закладок
  382.  
  383.  for i,v in pairs(EditorsCondView[EID].Bookmarks) do
  384.  
  385.   if v.Line>0 and v.Cursor>0 then
  386.  
  387.    editor.SetPosition(EID, v.Line, -1, v.Cursor, v.Line-v.ScreenLine+1, v.LeftPos)
  388.  
  389.    Keys('RCtrl'..tostring(i-1))
  390.  
  391.   end
  392.  
  393.  end
  394.  
  395.  if EditorsCondView[EID].SelectInfo then
  396.  
  397.   editor.Select(EID, EditorsCondView[EID].SelectInfo.BlockType,
  398.  
  399.                      EditorsCondView[EID].SelectInfo.StartLine,
  400.  
  401.                      EditorsCondView[EID].SelectInfo.StartPos,
  402.  
  403.                      EditorsCondView[EID].SelectInfo.EndPos-EditorsCondView[EID].SelectInfo.StartPos+1,
  404.  
  405.                      EditorsCondView[EID].SelectInfo.EndLine-EditorsCondView[EID].SelectInfo.StartLine+1
  406.  
  407.                )
  408.  
  409.  end
  410.  
  411.  GoToLinePos(EID, lnp, clp, tsl, lpc)
  412.  
  413.  EditorsCondView[EID] = nil
  414.  
  415.  return true
  416.  
  417. end -- CondViewOff
  418.  
  419. -- +
  420.  
  421. -- Процедура обработки событий при сжатом виде (запрет на сохранение)
  422.  
  423. -- -
  424.  
  425.  
  426.  
  427. local function ProcessEditorEvent(EID,event)
  428.  
  429.  local ei=editor.GetInfo(EID)
  430.  
  431.  if not EditorsCondView[EID] then return end
  432.  
  433.  if event==F.EE_CLOSE then -- Приберёмся перед уходом
  434.  
  435.   EditorsCondView[EID] = nil -- уничтожим управляющую структуру
  436.  
  437.  end
  438.  
  439.  if event == F.EE_SAVE then
  440.  
  441.   -- Несмотря на явный запрет F2, ShiftF2 остаётся возможность
  442.  
  443.   -- сохранения файла (например, макрокоманда CtrlS вызывает сохранение)
  444.  
  445.   -- В этом случае просто отменяю сжатый режим.
  446.  
  447.   CondViewOff(ei, EID, false)
  448.  
  449.  end;
  450.  
  451. end -- ProcessEditorEvent
  452.  
  453. -- +
  454.  
  455. -- Процедура сброса всех сжатых режимов
  456.  
  457. -- -
  458.  
  459. local function ExitScript()
  460.  
  461.  local ei, EID
  462.  
  463.  for ii in pairs(EditorsCondView) do
  464.  
  465.   if EditorsCondView[ii] then
  466.  
  467.    EID = ii
  468.  
  469.    ei = editor.GetInfo(ii)
  470.  
  471.    CondViewOff(ei, EID, false)
  472.  
  473.   end
  474.  
  475.  end
  476.  
  477. end -- ExitScript
  478.  
  479.  
  480.  
  481. -- +
  482.  
  483. -- ФУнкция настроек
  484.  
  485. local function CondViewSetting()
  486.  
  487.  local I, ID, y = {}, {}
  488.  
  489.  local SS=nil
  490.  
  491.  local guid = win.Uuid("212f0e54-459c-41f7-ab9c-6473f0bcc338")
  492.  
  493.  table.insert(I, { F.DI_DOUBLEBOX, 1, 1, 60, 15, 0, 0, 0, 0, 'Настройки горячих клавиш для макроса CondView' })
  494.  
  495.  
  496.  
  497.  y=3
  498.  
  499.  table.insert(I, { F.DI_TEXT, 3, y, 0, y, 0, 0, 0, 0, '&1. Включение «сжатого» режима' })
  500.  
  501.  table.insert(I, { F.DI_EDIT, 37, y, 58, y, 0, "", 0, 0, S.OnKey })
  502.  
  503.  ID.OnKey=#I
  504.  
  505.  
  506.  
  507.  y=y+2
  508.  
  509.  table.insert(I, { F.DI_TEXT, 3, y, 0, y, 0, 0, 0, 0, '&2. Выключение «сжатого» режима' })
  510.  
  511.  table.insert(I, { F.DI_EDIT, 37, y, 58, y, 0, "", 0, 0, S.OffKey })
  512.  
  513.  ID.OffKey=#I
  514.  
  515.  y=y+1
  516.  
  517.  table.insert(I, { F.DI_TEXT, 6, y, 0, y, 0, 0, 0, 0, 'с возвратом на прежнюю позицию' })
  518.  
  519.  
  520.  
  521.  y=y+2
  522.  
  523.  table.insert(I, { F.DI_TEXT, 3, y, 0, y, 0, 0, 0, 0, '&3. Выключение «сжатого» режима' })
  524.  
  525.  table.insert(I, { F.DI_EDIT, 37, y, 58, y, 0, "", 0, 0, S.GoKey })
  526.  
  527.  ID.GoKey=#I
  528.  
  529.  y=y+1
  530.  
  531.  table.insert(I, { F.DI_TEXT, 6, y, 0, y, 0, 0, 0, 0, 'с переходом на новую позицию' })
  532.  
  533.  
  534.  
  535.  y=y+2
  536.  
  537.  table.insert(I, { F.DI_TEXT, 3, y, 0, y, 0, 0, 0, 0, '&4. Настройка «горячих» клавиш' })
  538.  
  539.  table.insert(I, { F.DI_EDIT, 37, y, 58, y, 0, "", 0, 0, S.SetupKey })
  540.  
  541.  ID.SetupKey=#I
  542.  
  543.  
  544.  
  545.  y=y+2
  546.  
  547.  table.insert(I, { F.DI_BUTTON, 15, y, 0, y, 0, 0,0, F.DIF_DEFAULTBUTTON,"Сохранить" })
  548.  
  549.  ID.SaveBtn = #I
  550.  
  551.  table.insert(I, { F.DI_BUTTON, 45, y, 0, y, 0, 0,0, 0,"Отмена" })
  552.  
  553.  
  554.  
  555.  local function DlgProc(hDlg, Msg, _, _)
  556.  
  557.   local function __GetDialogData()
  558.  
  559.    SS.OnKey = far.SendDlgMessage(hDlg, "DM_GETTEXT", ID.OnKey, 0)
  560.  
  561.    SS.OffKey  = far.SendDlgMessage(hDlg, "DM_GETTEXT", ID.OffKey, 0)
  562.  
  563.    SS.GoKey = far.SendDlgMessage(hDlg, "DM_GETTEXT", ID.GoKey, 0)
  564.  
  565.    SS.SetupKey  = far.SendDlgMessage(hDlg, "DM_GETTEXT", ID.SetupKey, 0)
  566.  
  567.   end
  568.  
  569.   if not SS then
  570.  
  571.    SS={}
  572.  
  573.    __GetDialogData()
  574.  
  575.   end
  576.  
  577.   local function __tableFind(tbl, itm)
  578.  
  579.    for _,v in pairs(tbl) do
  580.  
  581.     if v==itm then return true end
  582.  
  583.    end
  584.  
  585.    return false
  586.  
  587.   end
  588.  
  589.   if __tableFind({F.DN_BTNCLICK, F.DN_EDITCHANGE}, Msg) then
  590.  
  591.    __GetDialogData()
  592.  
  593.   end
  594.  
  595.  end
  596.  
  597.  local dRes = far.Dialog(guid, -1, -1, 63, 17, nil, I, 0 , DlgProc)
  598.  
  599.  if dRes == ID.SaveBtn then
  600.  
  601.   MergeSettings(S, SS)
  602.  
  603.   local sSet='return {\n'
  604.  
  605.   for i,v in pairs(S) do
  606.  
  607.    sSet = sSet .. i .. '=' .. string.format('%q', v) .. ',\n'
  608.  
  609.   end
  610.  
  611.   sSet = sSet .. '}'
  612.  
  613.   local fCfg=io.open(CfgName, 'w')
  614.  
  615.   fCfg:write(sSet)
  616.  
  617.   fCfg:close()
  618.  
  619.   if far.Message("Новые назначения вступят в силу после перезагрузки макросов\n"..
  620.  
  621.               "Перезагрузить ВСЕ макросы сейчас?", "", ";YesNo", "w") == 1 then
  622.  
  623.    ExitScript()
  624.  
  625.    local msg = Far.GetConfig('Language.Help')=="Russian" and "Перезагрузка макросов" or "Reload macros"
  626.  
  627.    far.Message(msg,"","")
  628.  
  629.    far.MacroLoadAll()
  630.  
  631.    win.Sleep(200)
  632.  
  633.    far.AdvControl("ACTL_REDRAWALL")
  634.  
  635.   end
  636.  
  637.  end
  638.  
  639. end -- CondViewSetting
  640.  
  641. -- -
  642.  
  643. Macro {
  644.  
  645.   description="Condenced View"; area="Editor"; key=S.OnKey or "AltF4";
  646.  
  647.   condition=function()
  648.  
  649.    return not IsMacroActive()
  650.  
  651.   end;
  652.  
  653.   action=
  654.  
  655.   function()
  656.  
  657.    local ei=editor.GetInfo()
  658.  
  659.    if ei == nil then return end
  660.  
  661.    local EID=ei.EditorID
  662.  
  663.    --return EditorsCondView[EID] and CondViewOff(ei, EID, false) or CondViewOn(ei, EID)
  664.  
  665.    return CondViewOn(ei, EID)
  666.  
  667.   end;
  668.  
  669. }
  670.  
  671.  
  672.  
  673. Macro {
  674.  
  675.   description="Condenced View - Escape"; area="Editor"; key=S.OffKey or "Esc F10";
  676.  
  677.   condition=IsMacroActive;
  678.  
  679.   action=
  680.  
  681.   function()
  682.  
  683.    local ei=editor.GetInfo()
  684.  
  685.    if not ei then return end
  686.  
  687.    local EID=ei.EditorID
  688.  
  689.    CondViewOff(ei, EID, false)
  690.  
  691.   end;
  692.  
  693. }
  694.  
  695.  
  696.  
  697. Macro {
  698.  
  699.   description="Condenced View - ignore SaveFile"; area="Editor"; key="F2 ShiftF2";
  700.  
  701.   condition=IsMacroActive;
  702.  
  703.   action=
  704.  
  705.   function()
  706.  
  707.    far.Message('Сохранение файла в режиме\nсжатого просмотра невозможно','Condenced View',';Ok','w')
  708.  
  709.   end;
  710.  
  711. }
  712.  
  713.  
  714.  
  715. Macro {
  716.  
  717.   description="Condenced View - ignore ReadOnly mode off CtrlL)"; area="Editor"; key="CtrlL";
  718.  
  719.   condition=IsMacroActive;
  720.  
  721.   action=
  722.  
  723.   function()
  724.  
  725.   end;
  726.  
  727. }
  728.  
  729.  
  730.  
  731. Macro {
  732.  
  733.   description="Condenced View - GoTo NewPos"; area="Editor"; key=S.GoKey or "Enter";
  734.  
  735.   condition=IsMacroActive;
  736.  
  737.   action=
  738.  
  739.   function()
  740.  
  741.    local ei=editor.GetInfo()
  742.  
  743.    if not ei then return end
  744.  
  745.    local EID=ei.EditorID
  746.  
  747.    CondViewOff(ei, EID, true)
  748.  
  749.   end;
  750.  
  751. }
  752.  
  753.  
  754.  
  755. Macro {
  756.  
  757.   description="Condenced View - Settings"; area="Editor"; key=S.SetupKey;
  758.  
  759.   condition=IsMacroActive;
  760.  
  761.   action=CondViewSetting;
  762.  
  763. }
  764.  
  765. Event {
  766.  
  767.   group="EditorEvent";
  768.  
  769.   condition=
  770.  
  771.     function(id)
  772.  
  773.      return EditorsCondView[id]
  774.  
  775.     end;
  776.  
  777.   action=ProcessEditorEvent;
  778.  
  779. }
  780.  
  781. Event {
  782.  
  783.   group="EditorInput";
  784.  
  785.   condition=IsMacroActive;
  786.  
  787.   action=ProcessEditorInput;
  788.  
  789. }
  790.  
  791. Event {
  792.  
  793.   group="ExitFAR";
  794.  
  795.   condition=
  796.  
  797.     function()
  798.  
  799.      return EditorsCondView and table.maxn(EditorsCondView) > 0
  800.  
  801.     end;
  802.  
  803.   action=ExitScript;
  804.  
  805. }</span></span>

«Горячие» клавиши:
  • Включение «сжатого» режима AltF4
    Выключение «сжатого» режима с возвратом на прежнюю позицию F10 Esc
    Выключение «сжатого» режима с переходом на новую позицию Enter
    Настройка «горячих» клавиш AltF4

Shmuel
Posts: 5048
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

Реализация CondView

Post by Shmuel » Fri 24 Jul, 2015 03:11

buniak_a_h wrote:В фаре 1.7 был замечательный плугин - CondView. Он "скрывал" строки, информация в которых начиналась правее позиции курсора в момент вызова, что очень удобно для разработчиков софта (скрыть вложенные блоки). Я попытался сделать аналог в виде макроса на LUA. Некоторые вещи я не смог использовать (в частности, вместо Editor.SetPosition пришлось писать клавиатурную последовательность). Но в общем и целом макрос работает. Сам макрос можно скачать по ссылке. Если кто-нить из знатоков сможет проверить-исправить-улучшить и закачать на PlugRing - я думаю, многим это покажется удобным...
editor.SetPosition работает, но не перерисовывает редактор. Если нужна немедленная перерисовка, нужно вызвать editor.Redraw.

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

Реализация CondView

Post by John Doe » Fri 24 Jul, 2015 08:36

buniak_a_h wrote: Сам макрос можно скачать по ссылке
Если действительно нужны отзывы, то лучше выложить прямо здесь, в первом сообщении прямым текстом, в теге

Code: Select all

, или аналогичном.

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

Реализация CondView

Post by John Doe » Fri 24 Jul, 2015 10:49

buniak_a_h wrote: В фаре 1.7 был замечательный плугин - CondView.
Кстати что за плагин?
Видимо речь о Condenced view?

buniak_a_h
Posts: 261
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 32 times
Been thanked: 4 times
Contact:

Реализация CondView

Post by buniak_a_h » Fri 24 Jul, 2015 13:03

John Doe wrote:
buniak_a_h wrote: В фаре 1.7 был замечательный плугин - CondView.
Кстати что за плагин?
Видимо речь о Condenced view?
Да, этот плугин. На юникодной версии не работает, Некоторые перешли на 64-разрядную Windows - пришлось переходить на Far3. Очень не хватало этого плугина...
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

buniak_a_h
Posts: 261
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 32 times
Been thanked: 4 times
Contact:

Реализация CondView

Post by buniak_a_h » Fri 24 Jul, 2015 13:04

John Doe wrote:
buniak_a_h wrote: Сам макрос можно скачать по ссылке
Если действительно нужны отзывы, то лучше выложить прямо здесь, в первом сообщении прямым текстом, в теге

Code: Select all

, или аналогичном.[/quote]
Извините, 180 строк кода... Неужто такие макросы сюда пропускают?
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

buniak_a_h
Posts: 261
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 32 times
Been thanked: 4 times
Contact:

Реализация CondView

Post by buniak_a_h » Fri 24 Jul, 2015 13:20

Shmuel, Может, объясните такую странность: конструкция

Code: Select all

 editor.SetTitle(editor.FileName.."?") 
(editor со строчной буквы) вызывает ошибку (что-то вроде "требуется число, а задается строка), а конструкция

Code: Select all

Editor.SetTitle(Editor.FileName.."?")
(Editor - с прописной) работает нормально. При этом в конструкции

Code: Select all

editor.UndoRedo(...)
(editor - строчными) работает нормально. В документации обе конструкции описаны начинающимися со строчной буквы. Есть какое-нибудь правило, когда надо писать с прописной, а когда - со строчной?
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

Реализация CondView

Post by John Doe » Fri 24 Jul, 2015 13:35

buniak_a_h wrote: Извините, 180 строк кода... Неужто такие макросы сюда пропускают?
Конечно.
Если большой, то можно вложением, или использовать тег [Codebox]
buniak_a_h wrote: Может, объясните такую странность: конструкция
Это 2 разные функции, параметры отличаются, описаны в разных мануалах:
luafar_manual.chm
macroapi_manual.ru.chm
И настоятельно рекомендую изучить шапки тем, прилепленных в этом подфоруме.

Shmuel
Posts: 5048
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

Реализация CondView

Post by Shmuel » Fri 24 Jul, 2015 14:07

buniak_a_h wrote: Shmuel, Может, объясните такую странность:
Читайте документацию, тогда такие вопросы и возникать не будут.
В LuaFAR API все имена библиотек начинаются со строчных букв, а в Macro API - с прописных.

buniak_a_h
Posts: 261
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 32 times
Been thanked: 4 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Fri 24 Jul, 2015 14:27

Shmuel, осталось только выяснить, какой API я использую, когда вызываю функции из макроса... Потому что эти API описаны в разных документах, и какой интерфейс надо использовать - я не понял. На самом деле вопрос закрыт.
На самом деле мне жаль, что настоящие гуру не занялись таким нужным плугином. В макросе некоторые вещи я не смог реализовать.
Last edited by buniak_a_h on Sun 26 Jul, 2015 03:29, edited 1 time in total.
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

Shmuel
Posts: 5048
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

Реализация CondView

Post by Shmuel » Fri 24 Jul, 2015 14:37

buniak_a_h wrote: какой интерфейс надо использовать - я не понял
В макросах вы можете использовать оба интерфейса в любой пропорции.

buniak_a_h
Posts: 261
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 32 times
Been thanked: 4 times
Contact:

Реализация CondView

Post by buniak_a_h » Fri 24 Jul, 2015 14:56

Shmuel wrote:
buniak_a_h wrote: какой интерфейс надо использовать - я не понял
В макросах вы можете использовать оба интерфейса в любой пропорции.
Да это я уже понял. Просто не понял, что (1) для полноты картины надо читать оба мануала; (2) не заметил сразу, что в мануалах разные регистры; (3) не знал вообще, что LUA - регистрозависимый язык (извините, избалован паскалем :oops: ).
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

Реализация CondView

Post by John Doe » Fri 24 Jul, 2015 15:20

buniak_a_h wrote: В макросе некоторые вещи я не смог реализовать.
Спрашивайте, подскажем.

buniak_a_h
Posts: 261
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 32 times
Been thanked: 4 times
Contact:

Реализация CondView

Post by buniak_a_h » Fri 24 Jul, 2015 15:36

John Doe!
Из всего, что хотелось бы видеть в реализации, остались 4 вещи:
  1. 1. В статусной строке (сверху) отображать не номер сжатой строки, а исходный номер. Таблица соответствия {сходный<->сжатый} имеется.
    2. При включенном сжатом режиме отмечать цветом всю текущую строку
    3. Не устанавливать признак изменения файла (в начале работы макроса я просто удаляю строки, которые не должны быть видны).
    4. Запрещать сохранение сжатого файла.
Насколько я понимаю, пп.1,2 и 4 можно реализовать через подписку на события. И хотя я предусмотрел блокировку повторного вызова обработчика события, но судя по всему, он всё равно вызывается. Во всяком случае, возникает переполнение стэка.
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

Реализация CondView

Post by John Doe » Fri 24 Jul, 2015 15:46

buniak_a_h wrote: В статусной строке (сверху) отображать не номер сжатой строки, а исходный номер.
Есть апи для изменения статусной строки, но только левой части, где отображается имя файла.
Не исключаю, что можно "рисовать" что-то и в правой части вручную (far.Text), но мне кажется игра не стоит свеч.
buniak_a_h wrote: При включенном сжатом режиме отмечать цветом всю текущую строку
Есть апи раскраски, есть примеры несложных скриптов на форуме, см. например "Cross" в подфоруме полезных скриптов.
buniak_a_h wrote: Не устанавливать признак изменения файла
Вряд ли это возможно...
buniak_a_h wrote: Во всяком случае, возникает переполнение стэка.
Покажите код, посмотрим что не так.
Но для начала оформите первый пост темы.

P.S.
Находить ошибки в коде неплохо помогает luacheck.

buniak_a_h
Posts: 261
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 32 times
Been thanked: 4 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Fri 24 Jul, 2015 17:19

John Doe wrote: Есть апи для изменения статусной строки, но только левой части, где отображается имя файла
Я это и имел в виду. Сейчас я вывожу вместо имени файла «<Имя_файла> Condenced». Туда же после двоеточия можно было бы писать номер исходной строки. Проблема в том, как отследить перемещение по файлу.
John Doe wrote: Есть апи раскраски
Это я тоже уже видел. Проблема та же: как обнаружить перемещение по файлу, чтобы отменить раскраску предыдущей строки и раскрасить нынешнюю.
John Doe wrote: buniak_a_h писал(а):
Источник цитаты Не устанавливать признак изменения файла
Вряд ли это возможно...
Возможно, есть способ не удалять строки, а просто делать их как-то невидимыми... Это решило бы многие проблемы.
John Doe wrote: Покажите код,
В тексте макроса закомментировано Event {...} и подписка.
И главное
John Doe wrote: для начала оформите первый пост темы
Я никогда не имел дело с форумами. Что значить "оформить первый пост"? Закачать в него исходный текст макроса? Все почти 200 строк? "Добавить файл" - не пускают (неверно расширение). Где хоть прочитать, какие можно, какие нельзя?
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

Post Reply

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

Who is online

Users browsing this forum: No registered users and 2 guests