Работа со стековыми закладками в редакторе (BM.Add и др.)

Здесь обсуждается всё, что касается макросов.
User avatar
Tim Sobolev
Posts: 705
Joined: Fri 01 Apr, 2005 14:46
Location: Украина
Has thanked: 1 time
Been thanked: 2 times

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by Tim Sobolev »

Latest post of the previous page:

John Doe wrote:В Писании сейчас соответствующий раздел называется "Стековые закладки".
И соответствующие функции API тоже несут на себе отметку "стековости".
Может пора сейчас всё подряд переименовать в "динамические" (или "сессионные")?
Да я как бы совсем не против, а очень даже за :)

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

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by John Doe »

Tim Sobolev wrote:Да я как бы совсем не против, а очень даже за :)
Внесёте предложения по конкретным именам?

User avatar
Tim Sobolev
Posts: 705
Joined: Fri 01 Apr, 2005 14:46
Location: Украина
Has thanked: 1 time
Been thanked: 2 times

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by Tim Sobolev »

John Doe wrote:Внесёте предложения по конкретным именам?
Тут даже не знаю. что ответить. "Сессионными" их назвать можно только для текущей их реализации, не факт что они не будут сохранятся в будущем. "Динамическими" их назвать можно, но мне как бы вариант "мульти" тоже нравится 8) .

User avatar
Tim Sobolev
Posts: 705
Joined: Fri 01 Apr, 2005 14:46
Location: Украина
Has thanked: 1 time
Been thanked: 2 times

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by Tim Sobolev »

Ну так как, переименовывать будем или так и оставим? Если будем, то во что? :D

User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 4 times

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by Skirda »

внутри кода Far - как угодно
в писании - как правильно.
макро BM.XXX - не вижу смысла переименовывать.
We are the Borg. You will be assimilated.
So Say We All!

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

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by John Doe »

Речь об API, так ведь?
Надо заменить STACK на SESSION или DYNAMIC или MULTI или ЧТОНИБУДЬ.

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

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by John Doe »

В Энциклопедии:
http://api.farmanager.com/ru/macro/macrocmd/prop_func/editor.html#bm.pop wrote:E=bm.pop() Восстановить параметры из последней закладки и удалить её.


Update
Pop сработает, если уйти с позиции закладки.
Не знаю зачем так, и в документации не описано.

Имхо баг.

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

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by John Doe »

Функция BM.Get совсем не работает.
  1. Macro {
  2.   area="Editor"; key="F4";
  3.   action=function()
  4.     far.Show (
  5.       BM.Push(),
  6.       BM.Get(0,1),
  7.       BM.Get(0,2),
  8.       BM.Get(0,3),
  9.       BM.Get(0,4)
  10.     )
  11.   end;
  12. }
Всегда получаем 1,1,1,1,-1

Update
Исправлено в 4007

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

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by John Doe »

BM.Back wrote:E=bm.back()
Перейти на предыдущую закладку.
Если непосредственно перед ней была вызвана bm.add - добавить перед переходом закладку с текущими параметрами.
Чёрная магия какая-то.
Перечитал тему. Попытался осмыслить примеры. Сломал мозг.

Кто может объяснить зачем это и как использовать?

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

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by John Doe »

Ряд функций в случае успеха возвращает 1, при неудаче 0.
Возьмём к примеру Pop,Goto,Prev,Next,Back.
В документации не указано, когда возвращается 0.
Можно было бы ожидать, что ошибкой считается неверный индекс.

Однако (сюрприз) ошибкой считается ситуация когда текущая позиция редактора совпадает с закладкой.
Это в общем проблем не доставляет, за исключением команды Pop (подробнее).

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

Re: Работа со стековыми закладками в редакторе (BM.Add и др.

Post by John Doe »

John Doe wrote:
BM.Back wrote:E=bm.back()
Перейти на предыдущую закладку.
Если непосредственно перед ней была вызвана bm.add - добавить перед переходом закладку с текущими параметрами.
Чёрная магия какая-то.
Перечитал тему. Попытался осмыслить примеры. Сломал мозг.

Кто может объяснить зачем это и как использовать?
Видимо знает только Tim Sobolev.
Значит, ещё один вопрос: можно ли это поведение изменить на более простое: если "текущая закладка" последняя, и не совпадает с "текущими параметрами", то добавить перед переходом закладку с текущими параметрами?


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

Работа со стековыми закладками в редакторе (BM.Add и др.)

Post by John Doe »

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

Шорткат Действие При удержании
LCtrl-F3 push: Добавить закладку с текущими параметрами add : Добавить закладку с текущими параметрами и обрезать "хвост" (все закладки с индексом больше текущего)
LCtrl-F4 pop: Восстановить параметры из последней закладки и удалить её goto top: Перейти на последнюю закладку
LCtrl-F5 next: Перейти на следующую закладку goto current: Перейти на текущую закладку
LCtrl-F6 prev: Перейти на предыдущую закладку back: Перейти на предыдущую закладку.
Если непосредственно перед ней была вызвана add - добавить перед переходом закладку с текущими параметрами
LCtrl-F8 del: Удалить текущую закладку clear: Очистить все закладки

Для функций не приводящих к видимым действиям на экран выводится кратковременное сообщение.

Исходный код:
  1. local function MsgPopup(msg,title,flags,delay)
  2.   if flags and flags:find("w") then
  3.     mf.beep()
  4.     delay = delay or 1000
  5.   end
  6.   local s = far.SaveScreen()
  7.   far.Message(msg,title or nfo.name,"",flags)
  8.   far.Text()
  9.   win.Sleep(delay or 300); far.RestoreScreen(s)
  10. end
  11.  
  12. local GET_TOP = 0
  13. Macro { description="[Bookmarks] push cur. position to bookmarks";
  14.   area="Editor"; key="LCtrlF3";
  15.   action=function()
  16.     assert(BM.Push()~=0)
  17.     MsgPopup("Pushed")
  18.   end;
  19. }
  20. Macro { description="[Bookmarks] add cur. position to bookmarks and cut 'tail'";
  21.   area="Editor"; key="LCtrlF3:Hold";
  22.   action=function()
  23.     assert(BM.Add()~=0)
  24.     MsgPopup("Added")
  25.   end;
  26. }
  27. Macro { description="[Bookmarks] pop bookmark";
  28.   area="Editor"; key="LCtrlF4";
  29.   action=function()
  30.     local idxTop = BM.Stat(GET_TOP)
  31.     if idxTop==0 then
  32.       MsgPopup("Pop: no bookmarks")
  33.     elseif BM.Pop()==0 then
  34.       MsgPopup("Pop: already on position")
  35.       BM.Del(idxTop)
  36.     end
  37.   end;
  38. }
  39. Macro { description="[Bookmarks] goto top bookmark";
  40.   area="Editor"; key="LCtrlF4:Hold";
  41.   action=function()
  42.     local idxTop = BM.Stat(GET_TOP)
  43.     if idxTop==0 then
  44.       MsgPopup("Goto top: no bookmarks")
  45.     elseif BM.Goto(idxTop)==0 then
  46.       MsgPopup("Goto top: already on position")
  47.     end
  48.   end;
  49. }
  50. Macro { description="[Bookmarks] goto current bookmark";
  51.   area="Editor"; key="LCtrlF5:Hold";
  52.   action=function()
  53.     if BM.Stat(GET_TOP)==0 then
  54.       MsgPopup("Goto current: no bookmarks")
  55.     elseif BM.Goto()==0 then
  56.       MsgPopup("Goto current: already on position")
  57.     end
  58.   end;
  59. }
  60. Macro { description="[Bookmarks] next bookmark";
  61.   area="Editor"; key="LCtrlF5";
  62.   action=function()
  63.     if BM.Stat(GET_TOP)==0 then
  64.       MsgPopup("Next: no bookmarks")
  65.     elseif BM.Next()==0 then
  66.       MsgPopup("Next: already on position")
  67.     end
  68.   end;
  69. }
  70. Macro { description="[Bookmarks] prev bookmark";
  71.   area="Editor"; key="LCtrlF6";
  72.   action=function()
  73.     if BM.Stat(GET_TOP)==0 then
  74.       MsgPopup("Prev: no bookmarks")
  75.     elseif BM.Prev()==0 then
  76.       MsgPopup("Prev: already on position")
  77.     end
  78.   end;
  79. }
  80. Macro { description="[Bookmarks] back (push just added and goto prev)";
  81.   area="Editor"; key="LCtrlF6:Hold";
  82.   action=function()
  83.     local idxTop = BM.Stat(GET_TOP)
  84.     if idxTop==0 then
  85.       MsgPopup("Back: no bookmarks")
  86.     elseif BM.Back()~=1 then
  87.       MsgPopup("Back: already on position")
  88.     elseif idxTop<BM.Stat(GET_TOP) then
  89.       MsgPopup("Back: pushed")
  90.     end
  91.   end;
  92. }
  93. Macro { description="[Bookmarks] del current bookmark";
  94.   area="Editor"; key="LCtrlF8";
  95.   action=function()
  96.     if BM.Del()==0 then
  97.       MsgPopup("Del: no bookmarks")
  98.     else
  99.       MsgPopup("Deleted")
  100.     end
  101.   end;
  102. }
  103. Macro { description="[Bookmarks] clear bookmarks";
  104.   area="Editor"; key="LCtrlF8:Hold";
  105.   action=function()
  106.     assert(BM.Clear()~=0)
  107.     MsgPopup("Cleared")
  108.   end;
  109. }
  110. --]]
Примечание:
Хотя в Энциклопедии не документированно, в процессе составления макросов обнаружено (и использовано), что функции возвращают значения, позволяющие определить, привело ли действие к изменению позиции редактора.

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

Работа со стековыми закладками в редакторе (BM.Add и др.)

Post by John Doe »

P.S.
Этот набор макросов отражает всё многообразие встроенных функций, но никак не определяет сценарии работы с ними.
И глядя на список функций совсем не очевидно, что же изначально задумывал автор (в особенности смущает функция back).

Post Reply

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