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

Здесь обсуждается всё, что касается макросов.
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 »

Latest post of the previous page:

Макросы из Энциклопедии, со страницы примеров:
  1. Macro { description=[[
  2.  
  3. Переход в меню выбора дисков на противоположной панели
  4.  
  5. включение видимости панели в которой будет происходить смена диска, если её не было]];
  6.  
  7.   area="Disks"; key="Tab";
  8.  
  9.   action=function()
  10.  
  11.     Keys("Esc")
  12.  
  13.     if not PPanel.Visible then
  14.  
  15.       Keys("CtrlP")
  16.  
  17.     end
  18.  
  19.     Keys("Tab F9 Enter End Enter")
  20.  
  21.   end;
  22.  
  23. }
  24.  
  25.  
  26.  
  27. Macro { description="выделить/(снять выделение) слово(а) под курсором";
  28.  
  29.   area="Editor"; key="RAlt";
  30.  
  31.   action=function()
  32.  
  33.     Keys("RCtrl9 CtrlRight CtrlLeft")
  34.  
  35.     if not Object.Selected then
  36.  
  37.       Keys("CtrlShiftRight")
  38.  
  39.     else
  40.  
  41.       Keys("CtrlU")
  42.  
  43.     end
  44.  
  45.     Keys("Ctrl9")
  46.  
  47.   end;
  48.  
  49. }
  50.  
  51.  
  52.  
  53. Macro { description="создание папки с именем==текущей дате";
  54.  
  55.   area="Shell"; key="CtrlShiftF7"; flags="NoPluginPanels";
  56.  
  57.   action=function()
  58.  
  59.     local folder = mf.date("%d.%m0.%Y");
  60.  
  61.     if 0==Panel.FExist(0,folder) then
  62.  
  63.       Keys("F7 CtrlY")
  64.  
  65.       mf.print(folder)
  66.  
  67.       Keys("Enter")
  68.  
  69.     end
  70.  
  71.   end;
  72.  
  73. }
  74.  
  75.  
  76.  
  77.  
  78.  
  79. -- искать тот же файл на другой панели что и на активной
  80.  
  81. Macro { description="искать тот же файл на другой панели что и на активной";
  82.  
  83.   area="Shell"; key="CtrlAltLeft CtrlAltRight";
  84.  
  85.   action=function()
  86.  
  87.     if (not APanel.Bof or APanel.Root) and PPanel.Visible then
  88.  
  89.       if 0~=Panel.SetPos(1,APanel.Current) then
  90.  
  91.         Keys("Tab")
  92.  
  93.       end
  94.  
  95.     end
  96.  
  97.   end;
  98.  
  99. }
  100.  
  101.  
  102.  
  103. local N = 30
  104.  
  105. Macro { description="Выделение следующих нижних 30 файлов";
  106.  
  107.   area="Shell"; key="CtrlDown";
  108.  
  109.   action=function()
  110.  
  111.     for i=1,N do
  112.  
  113.       local eof = APanel.Eof
  114.  
  115.       Keys("Ins")
  116.  
  117.       if eof then break end
  118.  
  119.     end
  120.  
  121.   end;
  122.  
  123. }
  124.  
  125.  
  126.  
  127. Macro { description="Выделение следующих верхних 30 файлов";
  128.  
  129.   area="Shell"; key="CtrlUp";
  130.  
  131.   action=function()
  132.  
  133.     if APanel.Bof then return end
  134.  
  135.     Keys("Up")
  136.  
  137.     if APanel.Bof then
  138.  
  139.       if not APanel.Root then
  140.  
  141.         Keys("Down")
  142.  
  143.       end
  144.  
  145.       return
  146.  
  147.     end
  148.  
  149.  
  150.  
  151.     Keys("Down")
  152.  
  153.     local eof = APanel.Eof
  154.  
  155.     Keys("Ins")
  156.  
  157.     if not eof then Keys("Up") end
  158.  
  159.  
  160.  
  161.     for i=2,N do
  162.  
  163.       Keys("Up Ins Up")
  164.  
  165.       if APanel.Bof then
  166.  
  167.         if not APanel.Root then
  168.  
  169.           Keys("Down")
  170.  
  171.         end
  172.  
  173.         return
  174.  
  175.       end
  176.  
  177.     end
  178.  
  179.     Keys("Up")
  180.  
  181.   end;
  182.  
  183. }
  184.  
  185.  
  186.  
  187. Macro { description="сграбить весь экран в текстовый файл far-screen.out";
  188.  
  189.   area="Dialog"; key="AltP";
  190.  
  191.   action=function()
  192.  
  193.     mf.clip(5)
  194.  
  195.     Keys("AltIns CtrlHome ShiftEnd ShiftPgDn Enter")
  196.  
  197.     Keys("Esc")
  198.  
  199.     if not Area.Shell then Keys("Esc") end
  200.  
  201.     if Area.Shell and not APanel.Plugin then Keys("ShiftF4 CtrlY")
  202.  
  203.     mf.print("far-screen.out")
  204.  
  205.     Keys("Enter ShiftIns Enter Enter F2 Esc") end
  206.  
  207.   end;
  208.  
  209. }
  210.  
  211.  
  212.  
  213. -- удаление файла/папки по клавише Del
  214.  
  215. -- если стояли на элементе .. то пытаемся удалить вышестоящую папку
  216.  
  217. -- если не в конце ком строки то удаляем символы в ней
  218.  
  219. Macro { description="удаление файла/папки по клавише Del";
  220.  
  221.   area="Shell"; key="Del";
  222.  
  223.   action=function()
  224.  
  225.     if not CmdLine.Eof then
  226.  
  227.       Keys("Del")
  228.  
  229.     else
  230.  
  231.       if not APanel.Selected and APanel.Bof and (not APanel.Root or APanel.Plugin) then
  232.  
  233.         Keys("CtrlPgUp")
  234.  
  235.       end
  236.  
  237.       Keys("F8")
  238.  
  239.     end
  240.  
  241.   end;
  242.  
  243. }
  244.  
  245.  
  246.  
  247. -- перед вызовом быстрого просмотра сделать пассивную панель
  248.  
  249. -- максимально большего размера.
  250.  
  251. -- для обратной операции восстановить панели.
  252.  
  253. Macro { description="QView: максимизировать панель";
  254.  
  255.   area="Shell"; key="CtrlQ";
  256.  
  257.   action=function()
  258.  
  259.     Keys("Tab")
  260.  
  261.     if Area.QView then
  262.  
  263.       Keys("Tab Ctrl2 Tab CtrlClear")
  264.  
  265.     else
  266.  
  267.       Keys("Tab Ctrl6 Tab")
  268.  
  269.       local key = APanel.Left and "CtrlRight" or "CtrlLeft"
  270.  
  271.       Keys(("%i*%s"):format(APanel.Width,key))
  272.  
  273.     end
  274.  
  275.     Keys("Tab CtrlQ")
  276.  
  277.   end;
  278.  
  279. }
  280.  
  281.  
  282.  
  283.  
  284.  
  285. local FSPLIT_EXT = 8
  286.  
  287. local FSPLIT_NAME = 4
  288.  
  289. local ACTIVEPANEL = 0
  290.  
  291. local PANELITEM_SELECTED = 8
  292.  
  293. -- При непустой командной строке макрос не вызывается чтобы можно пользоваться первоначальной
  294.  
  295. -- функцией сочетания CtrlShiftIns - Поместить помеченные имена в Буфер Обмена
  296.  
  297. Macro { description="Пометить вместе с htm-файлом и парную ему папку";
  298.  
  299.   area="Shell"; key="CtrlShiftIns"; flags="EmptyCommandLine";
  300.  
  301.   action=function()
  302.  
  303.     local Current=APanel.Current;
  304.  
  305.     local Ext = Current:sub(-6)
  306.  
  307.     local Name
  308.  
  309.     if Ext=="_files" then
  310.  
  311.       Name = Current:sub(1,-6)
  312.  
  313.     else
  314.  
  315.       Ext = mf.fsplit(Current,FSPLIT_EXT);
  316.  
  317.       Name = mf.fsplit(Current,FSPLIT_NAME);
  318.  
  319.     end
  320.  
  321.  
  322.  
  323.     if Ext==".htm" or Ext==".html" then
  324.  
  325.       Panel.SetPos(ACTIVEPANEL,Name..".files")
  326.  
  327.       Panel.SetPos(ACTIVEPANEL,Name.."_files")
  328.  
  329.     elseif Ext==".files" or Ext=="_files" then
  330.  
  331.       Panel.SetPos(ACTIVEPANEL,Name..".htm")
  332.  
  333.       Panel.SetPos(ACTIVEPANEL,Name..".html")
  334.  
  335.     end
  336.  
  337.     if APanel.Current~=Current then
  338.  
  339.       local function Select()
  340.  
  341.         if not Panel.Item(ACTIVEPANEL,0,PANELITEM_SELECTED) then Keys("Ins") end
  342.  
  343.       end
  344.  
  345.       Select()
  346.  
  347.       Panel.SetPos(ACTIVEPANEL,Current)
  348.  
  349.       Select()
  350.  
  351.     end
  352.  
  353.   end;
  354.  
  355. }
  356.  
  357.  
  358.  
  359. -- Скроллинг текста по горизонтали:
  360.  
  361. Macro { description="ScrollLock: Скроллинг текста по горизонтали";
  362.  
  363.   area="Editor"; key="Left Right";
  364.  
  365.   condition=function() return band(1,mf.flock(2,-1))~=0 end;
  366.  
  367.   action=function()
  368.  
  369.     local dir = mf.akey(1,1)=="Right" and 1 or -1
  370.  
  371.     Editor.Pos(1,5,Editor.Pos(0,5)+dir)
  372.  
  373.   end;
  374.  
  375. }
Приведены к актуальному состоянию (используя только апи макросов).

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

P.S.
Макрос призванный проиллюстрировать использование eval сейчас абсолютно не актуален.
Полагаю он не нужен там вообще, но если угодно то так (без eval)
Last edited by John Doe on Mon 20 Nov, 2017 19:24, edited 2 times in total.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

John Doe, осталось сделать ещё один шаг и приложить не просто список макросов, а обновлённый файл macro\examples.html.
Если бы ещё с подсветкой синтаксиса Lua, то было бы вообще хорошо.
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 »

Shmuel, это очень легко, но задачу я поставил несколько шире: обновить раздел макросов полностью.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Это замечательно, но часто бывает, что человек ставит перед собой грандиозную задачу, и оканчивается это ничем. Тогда как продвижение небольшими шагами даёт сразу видимый результат.
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 »

Выложу промежуточный результат в соответствующей теме
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 »

  • Макрос, выделяющий 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;
    }
    
    Или же упускаю замысел?
  • Возможно, у кого-то будут и другие идеи по представленным примерам
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 »

P.S.
И ещё вопрос о дублировании.
Например макрос о создании папки с именем-датой сейчас в Энциклопедии в 3х местах, с вариациями.
Самый функциональный в описании панельных функций.

То ли убрать дубль из примеров.
То ли наоборот, переместить макросы из разных разделов в примеры.
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 »

Вот ещё странность:

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;
}
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post 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:42P.S.
И ещё вопрос о дублировании.
Например макрос о создании папки с именем-датой сейчас в Энциклопедии в 3х местах, с вариациями.
Самый функциональный в описании панельных функций.

То ли убрать дубль из примеров.
То ли наоборот, переместить макросы из разных разделов в примеры.
По моему субъективному опыту, дублирование нередко бывает полезным. Нежелательны лишь неработающие примеры.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

John Doe wrote: Mon 20 Nov, 2017 19:22Зачем имея APanel.Current (и используя его!!), в другом месте добывать то же значение из диалога копирования?
возможно, макрос начинался писаться тогда, когда APanel.Current не было. я думаю, большинство других странностей тоже объясняется историческими причинами.
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 »

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;
}
Переход только между меню, активная панель не меняется, видимость панелей не трогается.

Какой вариант лучше?
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

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

При этом, поскольку это примеры для новичков в составлении макросов, было бы предпочтительнее привести комментарии м.б. даже ко всем строкам кода. А к строке local left = Drv.ShowPos==1 — в особенности.
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 »

sToLp wrote: Mon 27 Nov, 2017 22:58однозначно лучше
Почему?
sToLp wrote: Mon 27 Nov, 2017 22:58было бы предпочтительнее привести комментарии
Вы можете поучаствовать, если есть желание.
sToLp wrote: Mon 27 Nov, 2017 22:58м.б. даже ко всем строкам кода.
Ко всем точно не надо, но улучшить читаемость можно, используя "говорящие" константы вместо числовых значений.
Last edited by John Doe on Tue 28 Nov, 2017 08:50, edited 1 time in total.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

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

Альтернативный же макрос включит погашенную панель только в том случае, когда пользователь выберет для данной панели действие, предусмотренное в меню дисков (сменить текущий диск, открыть панель плагина, выполнить помещённый в меню макрос). И это, по-моему, гораздо более дружественное поведение по отношению к пользователю.
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 »

John Doe wrote: Tue 28 Nov, 2017 08:33Ко всем точно не надо, но улучшить читаемость можно, используя "говорящие" константы вместо числовых значений.

Code: Select all

	local APANEL = 0
	local CUR_ITEM = 0
	local MOD_TIME = 17
	local SELECT = 1
	local IDX = 1
	Macro { description="выделить все файлы/папки новее текущего";
	  area="Shell"; key="CtrlShiftAdd";
	  action=function()
	    local d = Panel.Item(APANEL,CUR_ITEM,MOD_TIME)
	    for i=1,APanel.ItemCount do
	      if Panel.Item(APANEL,i,MOD_TIME)>d then
	        Panel.Select(APANEL,SELECT,IDX,i)
	      end
	    end
	  end;
	}

Code: Select all

	local APANEL = 0
	local FILENAME,ATTRIB,SIZE,SELECTED = 0,2,6,8
	local DIRECTORY = 0x00000010
	local function isFolder(panel,idx)
	  return band(DIRECTORY,Panel.Item(panel,idx,ATTRIB))==DIRECTORY
	end
	local PUT,ADD = 1,2
	Macro { description="поместить в Clipboard список отмеченных файлов в формате CSV (имя и размер)";
	  area="Shell"; key="CtrlShiftIns";
	  action=function()
	    mf.clip(PUT,"Name;Size\r\n")
	    for i=1,APanel.ItemCount do
	      if not isFolder(APANEL,i) and Panel.Item(APANEL,i,SELECTED) then
	        mf.clip(ADD,Panel.Item(APANEL,i,FILENAME)..";"..Panel.Item(APANEL,i,SIZE).."\r\n")
	      end
	    end
	  end;
	}
Last edited by John Doe on Tue 28 Nov, 2017 19:38, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

John Doe wrote: Tue 28 Nov, 2017 17:15Если перейти в панели QView (т.е. она будет на активной панели), и нажать CtrlQ, то панель станет файловой, но макрообласть не изменится!!
линейка функциональных клавиш тоже не изменится. и возможно что-то ещё. пишите на мантис.
Last edited by zg on Tue 28 Nov, 2017 19:39, edited 1 time in total.
Post Reply

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