Panel.JumpToSelectedFile.lua — прыжки по выделенным файлам

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe »

Latest post of the previous page:

Кому-то может и незачем...
Но лично я рассматриваю штатные макросы не столько как ещё один раздел настроек в фаре, а скорее как начальный образец для тех пользователей, которые хотят освоить составление макросов для собственных нужд.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Re: Panel.JumpToSelectedFile.lua

Post by gotar »

Про образец для подражания. Почему Вы стремитесь несколько клавиш загнать в один макрос. Например, в обсуждаемом макросе JumpToSelectedFile для каждой клавиши запускается с разными параметрами. Если бы для каждой из клавиш был бы отдельный макрос читабельность бы на мой взгляд увеличилась, а управление макросами упростилось.
Если какая то из используемых клавиш занята, и требовалось бы в использовать другую клавишу, то тоже было бы полезно разделять макросы.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by John Doe »

Насчёт управления макросами полностью согласится не могу, куча отдельных макросов это неудобно.
Но ваши доводы имеют смысл, поэтому akey(1)=="CtrlShiftDown" стоит записать как akey(1):match("Down$"), таким образом макрос не придётся править даже если вы решите использовать другие модификаторы.

А насчёт читабельности - полностью справедливое замечание.
Вот это вот точно не образец для подражания akey(1):match("[e7]$") and 1 or -1

Я некоторое время назад предлагал решить эту проблему таким образом:
0002310: Передавать макросу полный разбор регэкспа - клавиши

Когда это будет реализовано, то макрос станет менее громоздким, как-то так:
  1. Macro {description="Jump to the first/last selected file";
  2.  
  3.   area="Shell"; key="/[LR]CtrlShift(Home|Num7)|(End|Num1)/"; flags="Selection";
  4.  
  5.   action = function(key)
  6.  
  7.     local dir = key[1] and 1 or -1
  8.  
  9.     JumpToSelectedFile(dir,from_start)
  10.  
  11.   end;
  12.  
  13. }
Здесь key[1] обозначает группу (1), совпавшую в регэкспе key="/[LR]CtrlShift(Home|Num7)|(End|Num1)/"
key() может быть функцией, а может быть таблицей - параметром action/condition.

P.S.
Но пока это пожелание не реализовано, пожалуй стоит разделить эти макросы, ради читабельности.
Last edited by John Doe on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: [codebox=lua file=untitled.lua], [c]
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Re: Panel.JumpToSelectedFile.lua

Post by gotar »

куча отдельных макросов это неудобно
Да, согласен это неудобно, если в нескольких макросах дублируется один и тот же код. Если же макрос состоит только из вызова функции( что на мой взгляд правильно) размножение макросов облегчает их чтение и модификацию.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by John Doe »

User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by John Doe »

Та же функция, но на основе макро api

Code: Select all

local cyclic = true -- set false to disable cyclic jump
local from_start = true -- don't touch, it's just constant
local is_selected = 8   --
local function JumpToSelectedFile (dir,scope) --from start or from current
  --if not APanel.Selected then return nil end
  dir = dir and dir>=0 and 1 or -1
  local size = APanel.ItemCount
  local to = dir>0 and size or 1
  local from = scope==from_start and (size-to+1) or (APanel.CurPos+dir)
  for pos=from,to,dir do
    if Panel.Item(0,pos,is_selected) then
      Panel.SetPosIdx(0,pos)
      return pos
    end
  end            
  if cyclic then --[[mf.beep();]] JumpToSelectedFile(dir,from_start) end
end
Сравнил время выполнения.
10 000 раз, в папке с 38 файлов, 1 помечен.
plugin api - 3 сек
macro api - 9 сек


Update
Чёрт, всё неожиданно наоборот:
plugin api - 9 сек
macro api - 3 сек

Обсудить проблему предлагаю здесь: http://forum.farmanager.com/viewtopic.php?f=15&t=7822
User avatar
Alexey Samlyukov
Posts: 1765
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 7 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by Alexey Samlyukov »

пользуйте плагин товарищи, а не макрос )
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by John Doe »

Да, интересно было бы сравнить нативный плагин с Lua-плагином.
Но как бы там ни было, разницу между 0,0003 и 0,0009 заметить невозможно: макрос выполняется однократно.

Другое дело макросы на события, там надо быть поаккуратнее.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Panel.JumpToSelectedFile.lua

Post by Smitis »

А зачем такие сложности для перехода к первому/последнему выделеному?
Panel.SetPosIdx(0,1,1) - к первому
Panel.SetPosIdx(0,APanel.SelCount,1) - к последнему
Это, конечно, не plugin api, но зато коротко и понятно.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by John Doe »

Вообще-то для перехода к первому/последнему в функции предусмотрена всего лишь 1 строка
local from = scope==from_start and (size-to+1) or (APanel.CurPos+dir)
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Panel.JumpToSelectedFile.lua

Post by Smitis »

John Doe wrote:Вообще-то для перехода к первому/последнему в функции предусмотрена всего лишь 1 строка
local from = scope==from_start and (size-to+1) or (APanel.CurPos+dir)
Я к тому, что совершенно не обязательно пихать всё в одну универсальную переусложнённую функцию.
Да ещё потом тестировать её на производительность ;)

Code: Select all

Macro { -- Пеместиться к первому выделеному
	description="Select: Goto first";
	area="Shell Search";
	key="AltHome";
	action=function()
		Panel.SetPosIdx(0,1,1)
	end;
}
Macro { -- Пеместиться к последнему выделеному
	description="Select: Goto last";
	area="Shell Search";
	key="AltEnd";
	action=function()
		Panel.SetPosIdx(0,APanel.SelCount,1)
	end;
}
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by John Doe »

Забавно, но алгоритм "переусложнённой" функции соответствует тому, что вы сами предложили ранее: http://forum.farmanager.com/viewtopic.p ... 39#p103239

И зачем рассматривать эти 2 макроса в отрыве от остальных двух?

Что касается Panel.SetPosIdx, то вы же понимаете, что внутри тот же цикл.
С таким же успехом, мы можем переместить JumpToSelectedFile из файла с макросами в api.lua (или модуль), и будет та же красота, что у вас.

P.S.
Ну а другой логичный шаг - переопределить Panel.SetPosIdx так, чтобы она охватывала наш случай полностью.
(я подумал об этом в первую очередь, но интерфейс получается слишком перегруженный, по крайней мере я не смог найти красивого решения)

P.P.S.
К вопросу производительности: при использовании конструкции Panel.SetPosIdx(0,Panel.SetPosIdx(0,0,1)+1,1) тот же цикл выполняется 2 раза.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Panel.JumpToSelectedFile.lua

Post by Smitis »

Моя функция не делала Home и End. В этом нет необходимости, так как данные операции достаточно просто реализуются другим способом.
А красивое решение было у Тигрёнка - вообще без цикла. Если бы я не привык использовать CtrlM, то воспользовался бы этим вариантом.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by John Doe »

Проще чем

Code: Select all

  for pos=from,to,dir do
    if Panel.Item(0,pos,is_selected) then
      Panel.SetPosIdx(0,pos)
      return pos
    end
  end            
?
Потому что остальная часть функции - инициализация значений.
У вас она тоже присутствует, но "снаружи", в вызывающих макросах.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by John Doe »

Smitis wrote:А красивое решение было у Тигрёнка - вообще без цикла. Если бы я не привык использовать CtrlM, то воспользовался бы этим вариантом.
Я понял бы ещё если вы имели ввиду первое (нерабочее но лаконичное) решение, но категорически не согласен воспринимать вот это красивым.
Куча вызовов функций, некоторые из которых вложенные, а некоторые имеют по 4 параметра...
Не заглядывая в Писание вряд ли вообще возможно понять их назначение.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Panel.JumpToSelectedFile.lua

Post by Smitis »

Под переусложнением я имею ввиду, то, твоя функция (можно я без выканья?) делает home и end в цикле, хотя для них цикл не нужен. Пусть даже цикл выполнит всего одну итерацию. Отсюда и усложнения с иницилизацией параметров.
Куча вызовов функций, некоторые из которых вложенные, а некоторые имеют по 4 параметра, и без Писания вряд ли возможно сходу понять их назначение.
Ну да, на plugin api всё было прозрачно и понятно ;)
И рекурсивный вызов это здорово. И излишний параметр scope ;)
Разум когда-нибудь победит.
Post Reply

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