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

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Fri 22 Mar, 2013 11:49

Latest post of the previous page:

Насчёт управления макросами полностью согласится не могу, куча отдельных макросов это неудобно.
Но ваши доводы имеют смысл, поэтому 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.   area="Shell"; key="/[LR]CtrlShift(Home|Num7)|(End|Num1)/"; flags="Selection";
  3.   action = function(key)
  4.     local dir = key[1] and 1 or -1
  5.     JumpToSelectedFile(dir,from_start)
  6.   end;
  7. }
Здесь 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: 316
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times

Re: Panel.JumpToSelectedFile.lua

Post by gotar » Fri 22 Mar, 2013 17:54

куча отдельных макросов это неудобно
Да, согласен это неудобно, если в нескольких макросах дублируется один и тот же код. Если же макрос состоит только из вызова функции( что на мой взгляд правильно) размножение макросов облегчает их чтение и модификацию.

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Fri 22 Mar, 2013 18:02


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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Sat 23 Mar, 2013 10:26

Та же функция, но на основе макро 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: 1760
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 4 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by Alexey Samlyukov » Sat 23 Mar, 2013 10:34

пользуйте плагин товарищи, а не макрос )

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Sat 23 Mar, 2013 11:17

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

Другое дело макросы на события, там надо быть поаккуратнее.

Smitis
Posts: 1593
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 35 times

Re: Panel.JumpToSelectedFile.lua

Post by Smitis » Sat 23 Mar, 2013 12:27

А зачем такие сложности для перехода к первому/последнему выделеному?
Panel.SetPosIdx(0,1,1) - к первому
Panel.SetPosIdx(0,APanel.SelCount,1) - к последнему
Это, конечно, не plugin api, но зато коротко и понятно.
Разум когда-нибудь победит.

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Sat 23 Mar, 2013 12:31

Вообще-то для перехода к первому/последнему в функции предусмотрена всего лишь 1 строка
local from = scope==from_start and (size-to+1) or (APanel.CurPos+dir)

Smitis
Posts: 1593
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 35 times

Re: Panel.JumpToSelectedFile.lua

Post by Smitis » Sat 23 Mar, 2013 13:25

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: 12457
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 189 times

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Sat 23 Mar, 2013 13:44

Забавно, но алгоритм "переусложнённой" функции соответствует тому, что вы сами предложили ранее: 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 раза.

Smitis
Posts: 1593
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 35 times

Re: Panel.JumpToSelectedFile.lua

Post by Smitis » Sat 23 Mar, 2013 14:12

Моя функция не делала Home и End. В этом нет необходимости, так как данные операции достаточно просто реализуются другим способом.
А красивое решение было у Тигрёнка - вообще без цикла. Если бы я не привык использовать CtrlM, то воспользовался бы этим вариантом.
Разум когда-нибудь победит.

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Sat 23 Mar, 2013 14:17

Проще чем

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: 12457
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 189 times

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Sat 23 Mar, 2013 14:38

Smitis wrote:А красивое решение было у Тигрёнка - вообще без цикла. Если бы я не привык использовать CtrlM, то воспользовался бы этим вариантом.
Я понял бы ещё если вы имели ввиду первое (нерабочее но лаконичное) решение, но категорически не согласен воспринимать вот это красивым.
Куча вызовов функций, некоторые из которых вложенные, а некоторые имеют по 4 параметра...
Не заглядывая в Писание вряд ли вообще возможно понять их назначение.

Smitis
Posts: 1593
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 35 times

Re: Panel.JumpToSelectedFile.lua

Post by Smitis » Sat 23 Mar, 2013 14:52

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

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Sat 23 Mar, 2013 15:07

Smitis wrote:функция ... делает home и end в цикле, хотя для них цикл не нужен.
Что значит "не нужен"? Без цикла никак.
В вашем случае его скрывает одна функция, в моём другая.
Smitis wrote:Ну да, на plugin api всё было прозрачно и понятно
Вообще-то да :-)
Но были и недостатки:
1. Лишний громоздкий кусок кода
2. Избыточное число параметров (4), и, поскольку значения инициализировались в каждом из 4х макросов отдельно - дублирование части кода в 4х местах.

P.S.
Мой вариант макроса в этом плане лучше, плюс добавлена возможность убрать цикличность.
Рекурсии там кстати возникнуть не может, максимум 1 вложенный вызов.

Smitis
Posts: 1593
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 35 times

Re: Panel.JumpToSelectedFile.lua

Post by Smitis » Sat 23 Mar, 2013 15:52

Ладно, идейные споры до добра не доведут.
Но выложу свой вариант (на macro api), может кому-то пригодится.
Разум когда-нибудь победит.

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Sat 23 Mar, 2013 16:00

Всё что после if not selected_cycle then return end можно заменить на вызов Home/End

Post Reply

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