Page 4 of 6

Улучшение макросов из поставки фара

Posted: Mon 25 May, 2015 16:29
by DrKnS

Latest post of the previous page:

Чтобы фар не обрабатывал команду, например.
Также мне смутно помнится, что какие-то хистори-плагины трактуют это как "не помещать в историю".

Улучшение макросов из поставки фара

Posted: Mon 25 May, 2015 17:40
by HaRT
DrKnS, лично мне такие сценарии нужны очень редко, поэтому и не проблема временно отключить или панели, или макросы.

Улучшение макросов из поставки фара

Posted: Tue 26 May, 2015 07:04
by John Doe
DrKnS wrote: Разве что в виде нового макроса.
При желании можно было бы и в одном объединить.
DrKnS wrote: Также мне смутно помнится, что какие-то хистори-плагины трактуют это как "не помещать в историю".
Это для того чтобы не засорять историю командами ассоциаций и т.п., а не для ручного запуска.
Также мне смутно помнится что в какой-то момент фар начал обрезать эти пробелы, и соответственно фича отвалилась.

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 14:52
by John Doe
Макросы из Энциклопедии, со страницы примеров:
  1. Macro { description=[[
  2. Переход в меню выбора дисков на противоположной панели
  3. включение видимости панели в которой будет происходить смена диска, если её не было]];
  4.   area="Disks"; key="Tab";
  5.   action=function()
  6.     Keys("Esc")
  7.     if not PPanel.Visible then
  8.       Keys("CtrlP")
  9.     end
  10.     Keys("Tab F9 Enter End Enter")
  11.   end;
  12. }
  13.  
  14. Macro { description="выделить/(снять выделение) слово(а) под курсором";
  15.   area="Editor"; key="RAlt";
  16.   action=function()
  17.     Keys("RCtrl9 CtrlRight CtrlLeft")
  18.     if not Object.Selected then
  19.       Keys("CtrlShiftRight")
  20.     else
  21.       Keys("CtrlU")
  22.     end
  23.     Keys("Ctrl9")
  24.   end;
  25. }
  26.  
  27. Macro { description="создание папки с именем==текущей дате";
  28.   area="Shell"; key="CtrlShiftF7"; flags="NoPluginPanels";
  29.   action=function()
  30.     local folder = mf.date("%d.%m0.%Y");
  31.     if 0==Panel.FExist(0,folder) then
  32.       Keys("F7 CtrlY")
  33.       mf.print(folder)
  34.       Keys("Enter")
  35.     end
  36.   end;
  37. }
  38.  
  39.  
  40. -- искать тот же файл на другой панели что и на активной
  41. Macro { description="искать тот же файл на другой панели что и на активной";
  42.   area="Shell"; key="CtrlAltLeft CtrlAltRight";
  43.   action=function()
  44.     if (not APanel.Bof or APanel.Root) and PPanel.Visible then
  45.       if 0~=Panel.SetPos(1,APanel.Current) then
  46.         Keys("Tab")
  47.       end
  48.     end
  49.   end;
  50. }
  51.  
  52. local N = 30
  53. Macro { description="Выделение следующих нижних 30 файлов";
  54.   area="Shell"; key="CtrlDown";
  55.   action=function()
  56.     for i=1,N do
  57.       local eof = APanel.Eof
  58.       Keys("Ins")
  59.       if eof then break end
  60.     end
  61.   end;
  62. }
  63.  
  64. Macro { description="Выделение следующих верхних 30 файлов";
  65.   area="Shell"; key="CtrlUp";
  66.   action=function()
  67.     if APanel.Bof then return end
  68.     Keys("Up")
  69.     if APanel.Bof then
  70.       if not APanel.Root then
  71.         Keys("Down")
  72.       end
  73.       return
  74.     end
  75.  
  76.     Keys("Down")
  77.     local eof = APanel.Eof
  78.     Keys("Ins")
  79.     if not eof then Keys("Up") end
  80.  
  81.     for i=2,N do
  82.       Keys("Up Ins Up")
  83.       if APanel.Bof then
  84.         if not APanel.Root then
  85.           Keys("Down")
  86.         end
  87.         return
  88.       end
  89.     end
  90.     Keys("Up")
  91.   end;
  92. }
  93.  
  94. Macro { description="сграбить весь экран в текстовый файл far-screen.out";
  95.   area="Dialog"; key="AltP";
  96.   action=function()
  97.     mf.clip(5)
  98.     Keys("AltIns CtrlHome ShiftEnd ShiftPgDn Enter")
  99.     Keys("Esc")
  100.     if not Area.Shell then Keys("Esc") end
  101.     if Area.Shell and not APanel.Plugin then Keys("ShiftF4 CtrlY")
  102.     mf.print("far-screen.out")
  103.     Keys("Enter ShiftIns Enter Enter F2 Esc") end
  104.   end;
  105. }
  106.  
  107. -- удаление файла/папки по клавише Del
  108. -- если стояли на элементе .. то пытаемся удалить вышестоящую папку
  109. -- если не в конце ком строки то удаляем символы в ней
  110. Macro { description="удаление файла/папки по клавише Del";
  111.   area="Shell"; key="Del";
  112.   action=function()
  113.     if not CmdLine.Eof then
  114.       Keys("Del")
  115.     else
  116.       if not APanel.Selected and APanel.Bof and (not APanel.Root or APanel.Plugin) then
  117.         Keys("CtrlPgUp")
  118.       end
  119.       Keys("F8")
  120.     end
  121.   end;
  122. }
  123.  
  124. -- перед вызовом быстрого просмотра сделать пассивную панель
  125. -- максимально большего размера.
  126. -- для обратной операции восстановить панели.
  127. Macro { description="QView: максимизировать панель";
  128.   area="Shell"; key="CtrlQ";
  129.   action=function()
  130.     Keys("Tab")
  131.     if Area.QView then
  132.       Keys("Tab Ctrl2 Tab CtrlClear")
  133.     else
  134.       Keys("Tab Ctrl6 Tab")
  135.       local key = APanel.Left and "CtrlRight" or "CtrlLeft"
  136.       Keys(("%i*%s"):format(APanel.Width,key))
  137.     end
  138.     Keys("Tab CtrlQ")
  139.   end;
  140. }
  141.  
  142.  
  143. local FSPLIT_EXT = 8
  144. local FSPLIT_NAME = 4
  145. local ACTIVEPANEL = 0
  146. local PANELITEM_SELECTED = 8
  147. -- При непустой командной строке макрос не вызывается чтобы можно пользоваться первоначальной
  148. -- функцией сочетания CtrlShiftIns - Поместить помеченные имена в Буфер Обмена
  149. Macro { description="Пометить вместе с htm-файлом и парную ему папку";
  150.   area="Shell"; key="CtrlShiftIns"; flags="EmptyCommandLine";
  151.   action=function()
  152.     local Current=APanel.Current;
  153.     local Ext = Current:sub(-6)
  154.     local Name
  155.     if Ext=="_files" then
  156.       Name = Current:sub(1,-6)
  157.     else
  158.       Ext = mf.fsplit(Current,FSPLIT_EXT);
  159.       Name = mf.fsplit(Current,FSPLIT_NAME);
  160.     end
  161.  
  162.     if Ext==".htm" or Ext==".html" then
  163.       Panel.SetPos(ACTIVEPANEL,Name..".files")
  164.       Panel.SetPos(ACTIVEPANEL,Name.."_files")
  165.     elseif Ext==".files" or Ext=="_files" then
  166.       Panel.SetPos(ACTIVEPANEL,Name..".htm")
  167.       Panel.SetPos(ACTIVEPANEL,Name..".html")
  168.     end
  169.     if APanel.Current~=Current then
  170.       local function Select()
  171.         if not Panel.Item(ACTIVEPANEL,0,PANELITEM_SELECTED) then Keys("Ins") end
  172.       end
  173.       Select()
  174.       Panel.SetPos(ACTIVEPANEL,Current)
  175.       Select()
  176.     end
  177.   end;
  178. }
  179.  
  180. -- Скроллинг текста по горизонтали:
  181. Macro { description="ScrollLock: Скроллинг текста по горизонтали";
  182.   area="Editor"; key="Left Right";
  183.   condition=function() return band(1,mf.flock(2,-1))~=0 end;
  184.   action=function()
  185.     local dir = mf.akey(1,1)=="Right" and 1 or -1
  186.     Editor.Pos(1,5,Editor.Pos(0,5)+dir)
  187.   end;
  188. }
Приведены к актуальному состоянию (используя только апи макросов).

Если вдруг кому-то не всё равно, то проверьте.

P.S.
Макрос призванный проиллюстрировать использование eval сейчас абсолютно не актуален.
Полагаю он не нужен там вообще, но если угодно то так (без eval)

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 15:40
by Shmuel
John Doe, осталось сделать ещё один шаг и приложить не просто список макросов, а обновлённый файл macro\examples.html.
Если бы ещё с подсветкой синтаксиса Lua, то было бы вообще хорошо.

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 16:14
by John Doe
Shmuel, это очень легко, но задачу я поставил несколько шире: обновить раздел макросов полностью.

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 16:20
by Shmuel
Это замечательно, но часто бывает, что человек ставит перед собой грандиозную задачу, и оканчивается это ничем. Тогда как продвижение небольшими шагами даёт сразу видимый результат.

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 17:05
by John Doe
Выложу промежуточный результат в соответствующей теме

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 18:34
by John Doe
  • Макрос, выделяющий 30 следующих/предыдущих файлов очень "хитрый", поскольку был составлен в те времена, когда ещё не было
    Panel.Select.
    Сейчас в этой хитрости смысла никакого нет.

    Вопросы к заинтересованным, как поступить:
    - переписать с использованием Panel.Select
    - переписать, но оставить и старый вариант, для иллюстрации разных приёмов работы.
  • Также вопрос по этому макросу:

    Code: Select all

    <macro
      area="Editor"
      key="RAlt"
      flags="DisableOutput"
      description="выделить/(снять выделение) слово(а) под курсором"><text>
    RCtrl9 CtrlRight CtrlLeft
    $If (!Selected)
      CtrlShiftRight
    $Else
      CtrlU
    $End
    Ctrl9
    </text></macro>
    Я не очень понимаю как он должен был работать.
    Подозреваю, что он рассчитан на постоянные блоки, но даже если так, то он всё равно странно составлен.

    Нормально, если я его заменю на этот:

    Code: Select all

    Macro { description="выделить/(снять выделение) слово(а) под курсором";
      area="Editor"; key="RAlt";
      action=function()
        Keys(Object.Selected and "CtrlU" or "SelWord")
      end;
    }
    
    Или же упускаю замысел?
  • Возможно, у кого-то будут и другие идеи по представленным примерам

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 18:42
by John Doe
P.S.
И ещё вопрос о дублировании.
Например макрос о создании папки с именем-датой сейчас в Энциклопедии в 3х местах, с вариациями.
Самый функциональный в описании панельных функций.

То ли убрать дубль из примеров.
То ли наоборот, переместить макросы из разных разделов в примеры.

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 19:22
by John Doe
Вот ещё странность:

Code: Select all

<!--
искать тот же файл на другой панели что и на активной
F5 ShiftEnter CtrlIns - применено чтобы получить имя файла вне зависимости
пусто/непусто в cmdline и сколько выделено на панели файлов
-->
<macro
  area="Shell"
  key="CtrlAltLeft"
  flags="DisableOutput"
  description="искать тот же файл на другой панели что и на активной"><text>
<![CDATA[
clip(5)
$If (((Bof && APanel.Root) || !Bof) && PPanel.Visible)
  $If (fexist(PPanel.Path+@"\\"+APanel.Current) == 1)
    F5 ShiftEnter
    CtrlIns Esc Tab Home
    Alt< ShiftIns Esc
  $End
$End
]]></text></macro>

Зачем имея APanel.Current (и используя его!!), в другом месте добывать то же значение из диалога копирования?
Если я ничего не упускаю, то это сейчас надо записать так:

Code: Select all

Macro { description="искать тот же файл на другой панели что и на активной";
  area="Shell"; key="CtrlAltLeft CtrlAltRight";
  action=function()
    if (not APanel.Bof or APanel.Root) and PPanel.Visible then
      if 0~=Panel.SetPos(1,APanel.Current) then
        Keys("Tab")
      end
    end
  end;
}

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 19:32
by sToLp
John Doe wrote:
Mon 20 Nov, 2017 18:34
- переписать, но оставить и старый вариант, для иллюстрации разных приёмов работы.
На мой взгляд, так было бы полезнее.
John Doe wrote:
Mon 20 Nov, 2017 18:34
Нормально, если я его заменю на этот:

Code: Select all

Macro { description="выделить/(снять выделение) слово(а) под курсором";
  area="Editor"; key="RAlt";
  action=function()
    Keys(Object.Selected and "CtrlU" or "SelWord")
  end;
}
Этот работает. Вот и пусть будет примером, имхо.
John Doe wrote:
Mon 20 Nov, 2017 18:42
P.S.
И ещё вопрос о дублировании.
Например макрос о создании папки с именем-датой сейчас в Энциклопедии в 3х местах, с вариациями.
Самый функциональный в описании панельных функций.

То ли убрать дубль из примеров.
То ли наоборот, переместить макросы из разных разделов в примеры.
По моему субъективному опыту, дублирование нередко бывает полезным. Нежелательны лишь неработающие примеры.

Улучшение макросов из поставки фара

Posted: Mon 20 Nov, 2017 19:41
by zg
John Doe wrote:
Mon 20 Nov, 2017 19:22
Зачем имея APanel.Current (и используя его!!), в другом месте добывать то же значение из диалога копирования?
возможно, макрос начинался писаться тогда, когда APanel.Current не было. я думаю, большинство других странностей тоже объясняется историческими причинами.

Улучшение макросов из поставки фара

Posted: Mon 27 Nov, 2017 21:38
by John Doe
https://farmanagerlegacy.github.io/macr ... mples.html

Альтернативный вариант первого макроса:

Code: Select all

Macro { description="Переход в меню выбора дисков на противоположной панели";
  area="Disks"; key="Tab";
  action=function()
    local left = Drv.ShowPos==1
    Keys("Esc F9")
    if left==APanel.Left then
      Keys("Tab")
    end
    Keys("Enter End Enter")
  end;
}
Переход только между меню, активная панель не меняется, видимость панелей не трогается.

Какой вариант лучше?

Улучшение макросов из поставки фара

Posted: Mon 27 Nov, 2017 22:58
by sToLp
John Doe wrote:
Mon 27 Nov, 2017 21:38
Какой вариант лучше?
На мой взгляд, альтернативный вариант однозначно лучше.

При этом, поскольку это примеры для новичков в составлении макросов, было бы предпочтительнее привести комментарии м.б. даже ко всем строкам кода. А к строке local left = Drv.ShowPos==1 — в особенности.

Улучшение макросов из поставки фара

Posted: Tue 28 Nov, 2017 08:33
by John Doe
sToLp wrote:
Mon 27 Nov, 2017 22:58
однозначно лучше
Почему?
sToLp wrote:
Mon 27 Nov, 2017 22:58
было бы предпочтительнее привести комментарии
Вы можете поучаствовать, если есть желание.
sToLp wrote:
Mon 27 Nov, 2017 22:58
м.б. даже ко всем строкам кода.
Ко всем точно не надо, но улучшить читаемость можно, используя "говорящие" константы вместо числовых значений.