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

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

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

Post by John Doe » Mon 23 Jun, 2014 15:02

Latest post of the previous page:

Ok.
На четырёх приведённых выше примерах, где вы считаете целесообразным ввести какую-то общую функцию?

User avatar
zg
zero-gravity
Posts: 5549
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 87 times
Contact:

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

Post by zg » Mon 23 Jun, 2014 15:27

насколько я понимаю, единственная претензия к сливанию макросов была:
tstr wrote:Вы поаккуратнее с изменениями в поставке - такой способ (вызов ф-ции на многие клавиши) не срабатывает в автоматическом добавлении описания и шорткатов в помощь.
сейчас всё добавляется, судя по всему замечание просто устарело.
что касается конкретных примеров:
1. дело вкуса. по мне так лучше вообще:

Code: Select all

Macro
  description:"Scroll text in internal viewer"
  area:"Viewer"
  key:"CtrlUp CtrlDown"
  action:->Keys(akey(1):match(".%l+$"))
2. описание в первом варианте исправить на что-то типа "Change current drive". что в макробровсере, что в хелпе, что при просто просмотре — сами кнопки уже есть, зачем их дублировать?
3. не очень понимаю, зачем вообще второй вариант?
макрос ходения по папкам: вот тут можно выделить в отдельную функцию, ради красоты в хелпе. хотя

Code: Select all

CtrlShiftPgUp CtrlShiftPgDn  Jump to the previous/next folder on the same level
тоже вполне приемлимо.

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

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

Post by John Doe » Mon 23 Jun, 2014 17:55

zg wrote:насколько я понимаю, единственная претензия к сливанию макросов была:
[...]
Поискал, претензия была в другой теме: Panel.JumpToSelectedFile.lua
zg wrote:3. не очень понимаю, зачем вообще второй вариант?
Второй вариант это исходный.
Вопрос в том, стоит ли в этом случае 2 макроса объединять в один?
Минус объединения в том, что добавляется condition.

User avatar
zg
zero-gravity
Posts: 5549
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 87 times
Contact:

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

Post by zg » Mon 23 Jun, 2014 18:14

John Doe wrote:Поискал, претензия была в другой теме: Panel.JumpToSelectedFile.lua
ни о чём.

siberia-man
Posts: 94
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

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

Post by siberia-man » Sat 28 Jun, 2014 23:34

https://github.com/FarGroup/FarManager/ ... w.PgDn.lua

Первоначальный макрос требует лишнего нажатия клавиши при достижении конца файла. Добавил область действия в описание.
  1. Macro {
  2.     area = "Viewer";
  3.     key = "PgDn";
  4.     description = "Viewer: PgDn at the end of file works as in Far Manager 1.70 beta 4 and earlier";
  5.     action = function()
  6.         Keys("PgDn");
  7.         if Object.Eof then
  8.             Keys('End')
  9.         end
  10.     end;
  11. }

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

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

Post by John Doe » Sun 29 Jun, 2014 09:49

Описание надо понятнее. Кто там уже помнит поведение 1.65

siberia-man
Posts: 94
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

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

Post by siberia-man » Sun 29 Jun, 2014 11:57

John Doe wrote:Описание надо понятнее. Кто там уже помнит поведение 1.65
И то верно. Код исправил, а описание оставил оригинальное. Исправляемся.
  1. -- Modification of the original script taken from:
  2. -- https://code.google.com/p/farmanager/source/browse/trunk/addons/Macros/View.PgDn.lua
  3.  
  4. --[[
  5.  
  6. "Умная" прокрутка с помощью PgDn. При прокрутке клавишей PgDn по
  7. достижении конца файла на экране отображаются все последние строки файла в
  8. соответствии с текущей высотой окна Far Manager.
  9.  
  10. ]]
  11.  
  12. Macro {
  13.     area = "Viewer";
  14.     key = "PgDn";
  15.     description = "Viewer: Smart scrolling using PgDn";
  16.     action = function()
  17.         Keys("PgDn");
  18.         if Object.Eof then
  19.             Keys('End')
  20.         end
  21.     end;
  22. }

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

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

Post by John Doe » Sun 29 Jun, 2014 13:23

Исправление совершенно правильное, но описание понятнее не стало.
Может PgDn: never go beyond the end of file (like in FAR 1.70 beta 4 and earlier)?
Или PgDn: never scroll beyond EOF (like in FAR 1.70 beta 4 and earlier)

P.S.
Порылся в WhatsNew.Rus.txt беты 5 и нескольких соседних версий, и ни слова не нашёл об этом изменении.

User avatar
zg
zero-gravity
Posts: 5549
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 87 times
Contact:

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

Post by zg » Sun 29 Jun, 2014 14:36

John Doe wrote:Порылся в WhatsNew.Rus.txt беты 5 и нескольких соседних версий, и ни слова не нашёл об этом изменении.
значит не попало в список изменений.

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

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

Post by John Doe » Fri 22 May, 2015 07:36

https://github.com/FarGroup/FarManager/ ... Select.lua

Условие можно упростить (и лучше вынести в condition):

Code: Select all

Macro {
  description="Panel: Use Space to select files";
  area="Shell"; key="Space";
  condition=function() return CmdLine.Empty and APanel.Visible end;
  action=function()
    Keys"Ins"
  end;
}

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

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

Post by John Doe » Mon 25 May, 2015 11:07

Сюда же можно добавить 2 идеи отсюда: http://forum.farmanager.com/viewtopic.p ... 235#p69235
1. Выделять не сдвигая курсор к следующему элементу.
2. Вместо CmdLine.Empty проверять что курсор в начале строки.

Code: Select all

Macro {
  description="Panel: Use Space to select files";
  area="Shell"; key="Space";
  condition=function() return CmdLine.Bof and APanel.Visible end;
  action=function()
    Panel.Select(0,2,1)
  end;
}

User avatar
DrKnS
Posts: 5283
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 206 times

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

Post by DrKnS » Mon 25 May, 2015 16:23

John Doe wrote:1. Выделять не сдвигая курсор к следующему элементу.
Разве что в виде нового макроса.
2. Вместо CmdLine.Empty проверять что курсор в начале строки.
И как пробел в начале вводить?

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

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

Post by HaRT » Mon 25 May, 2015 16:25

DrKnS wrote: как пробел в начале вводить?
Зачем?
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
DrKnS
Posts: 5283
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 206 times

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

Post by DrKnS » Mon 25 May, 2015 16:29

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

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

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

Post by HaRT » Mon 25 May, 2015 17:40

DrKnS, лично мне такие сценарии нужны очень редко, поэтому и не проблема временно отключить или панели, или макросы.
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by John Doe » Tue 26 May, 2015 07:04

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

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

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

Post by John Doe » Mon 20 Nov, 2017 14:52

Макросы из Энциклопедии, со страницы примеров:
  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)
Last edited by John Doe on Mon 20 Nov, 2017 19:24, edited 2 times in total.

Post Reply

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