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

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Thu 21 Mar, 2013 16:51

Latest post of the previous page:

А как должен себя в идеале вести макрос при достижении конца/начала списка?
Циклически?

Smitis
Posts: 1563
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 17 times
Been thanked: 32 times
Contact:

Re: Panel.JumpToSelectedFile.lua

Post by Smitis » Thu 21 Mar, 2013 18:03

John Doe wrote:А как должен себя в идеале вести макрос при достижении конца/начала списка?
Циклически?
Я пользуюсь нециклическим. Циклический показался не таким удобным. Как неудобен, например, циклический Search, особенно если файлов много, действуешь на автомате, легко проскочить конец панели и пойти на второй круг.
Разум когда-нибудь победит.

User avatar
SUSim
Posts: 1520
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 5 times
Been thanked: 8 times

Re: Panel.JumpToSelectedFile.lua

Post by SUSim » Thu 21 Mar, 2013 18:15

а я циклическим но со звуком при перескоке (раньше сообщение выводил, но решил что это лишнее - если динькнуло то хорошь), теперь в W8, наверно, пока со звуком не разберусь, откачусь к экрану "продолжить..."
SimSU ··· ·· -- ··· ··-

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Thu 21 Mar, 2013 21:47

Совершенно не могу понять зачем в штатном макросе вычисляется topItem:
Вроде бы достаточно просто panel.RedrawPanel(nil,1,{CurrentItem=pos})

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Fri 22 Mar, 2013 00:37

Вот универсальный вариант, цикличность управляется константой cyclic
  1. local cyclic = true -- set false to disable cyclic jump
  2. local from_start = true -- don't touch, it's just constant
  3. local function JumpToSelectedFile (dir,scope) --from start or from current
  4.   local p = panel.GetPanelInfo(nil, 1)
  5.   --if p.SelectedItemsNumber==0 then return nil end
  6.   dir = dir and dir>=0 and 1 or -1
  7.   local size = p.ItemsNumber
  8.   local to = dir>0 and size or 1
  9.   local from = scope==from_start and (size-to+1) or (p.CurrentItem+dir)
  10.   for pos=from,to,dir do
  11.     local item=panel.GetPanelItem(nil,1,pos)
  12.     if bit64.band(item.Flags,far.Flags.PPIF_SELECTED)~=0 then
  13.       panel.RedrawPanel(nil,1,{CurrentItem=pos,TopPanelItem=p.TopPanelItem})
  14.       return pos
  15.     end
  16.   end            
  17.   if cyclic then mf.beep(); JumpToSelectedFile(dir,from_start) end
  18. end
  19.  
  20. Macro {description="Jump to the next/prev selected file";
  21.   area="Shell"; key="CtrlShiftDown CtrlShiftUp"; flags="Selection"; action = function()
  22. JumpToSelectedFile(akey(1)=="CtrlShiftDown" and 1 or -1)
  23.   end;
  24. }
  25.  
  26. Macro {description="Jump to the first/last selected file"; 
  27.   area="Shell"; key="/[LR]CtrlShift(Home|End|Num[71])/"; flags="Selection"; action = function()
  28. JumpToSelectedFile(akey(1):match("[e7]$") and 1 or -1,from_start)
  29.   end;
  30. }
Attachments
Panel.JumpToSelectedFile.lua.7z
(811 Bytes) Downloaded 201 times

Shmuel
Posts: 5713
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 201 times

Re: Panel.JumpToSelectedFile.lua

Post by Shmuel » Fri 22 Mar, 2013 00:48

John Doe wrote:Совершенно не могу понять зачем в штатном макросе вычисляется topItem:
Вроде бы достаточно просто panel.RedrawPanel(nil,1,{CurrentItem=pos})
Видимо для того, чтобы этот самый topItem не скакал без надобности.

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Fri 22 Mar, 2013 00:55

Да, мне тоже не нравится как оно скачет, но вышеприведённый код почему-то не помогает.

Shmuel
Posts: 5713
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 201 times

Re: Panel.JumpToSelectedFile.lua

Post by Shmuel » Fri 22 Mar, 2013 00:57

Я смотрел это уже давно, вроде всё нормально было.

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

Re: Panel.JumpToSelectedFile.lua

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

Вероятно надо (p.PanelRect.bottom-p.PanelRect.top) множить на число колонок.

Update
А нет, всё проще.
Ничего вычислять не надо, можно просто делать так: panel.RedrawPanel(nil,1,{CurrentItem=pos,TopPanelItem=p.TopPanelItem})

Shmuel
Posts: 5713
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 201 times

Re: Panel.JumpToSelectedFile.lua

Post by Shmuel » Fri 22 Mar, 2013 01:03

Может быть. Я смотрел только в режиме LCtrl-3 (и код не мой).

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Fri 22 Mar, 2013 01:09

Интересно, использование плагинного апи дало в этом макросе какой-то прирост производительности, по сравнению с макро апи...

Shmuel
Posts: 5713
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 201 times

Re: Panel.JumpToSelectedFile.lua

Post by Shmuel » Fri 22 Mar, 2013 01:10

John Doe wrote:Интересно, использование плагинного апи дало в этом макросе какой-то прирост производительности, по сравнению с макро апи...
Скорее всего дело в предпочтениях автора.

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Fri 22 Mar, 2013 01:15

Абсолютные значения конечно ничтожны, интересны относительные.
Подумаю над тем чтобы измерить.

С другой стороны ещё вопрос, стоит ли нагружать макрос в аддонсах плагинным апи, люди пугаются...

Shmuel
Posts: 5713
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 201 times

Re: Panel.JumpToSelectedFile.lua

Post by Shmuel » Fri 22 Mar, 2013 01:17

John Doe wrote:С другой стороны ещё вопрос, стоит ли нагружать макрос в аддонсах плагинным апи, люди пугаются...
А людям зачем внутрь заглядывать? Пусть заглянут в код Фара, ещё не так испугаются.

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

Re: Panel.JumpToSelectedFile.lua

Post by John Doe » Fri 22 Mar, 2013 01:26

Кому-то может и незачем...
Но лично я рассматриваю штатные макросы не столько как ещё один раздел настроек в фаре, а скорее как начальный образец для тех пользователей, которые хотят освоить составление макросов для собственных нужд.

gotar
Posts: 309
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times

Re: Panel.JumpToSelectedFile.lua

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

Про образец для подражания. Почему Вы стремитесь несколько клавиш загнать в один макрос. Например, в обсуждаемом макросе JumpToSelectedFile для каждой клавиши запускается с разными параметрами. Если бы для каждой из клавиш был бы отдельный макрос читабельность бы на мой взгляд увеличилась, а управление макросами упростилось.
Если какая то из используемых клавиш занята, и требовалось бы в использовать другую клавишу, то тоже было бы полезно разделять макросы.

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

Re: Panel.JumpToSelectedFile.lua

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

Насчёт управления макросами полностью согласится не могу, куча отдельных макросов это неудобно.
Но ваши доводы имеют смысл, поэтому 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]

Post Reply

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