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

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

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

Post by Tim Sobolev »

Latest post of the previous page:

John Doe wrote:В Писании сейчас соответствующий раздел называется "Стековые закладки".
И соответствующие функции API тоже несут на себе отметку "стековости".
Может пора сейчас всё подряд переименовать в "динамические" (или "сессионные")?
Да я как бы совсем не против, а очень даже за :)
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Tim Sobolev wrote:Да я как бы совсем не против, а очень даже за :)
Внесёте предложения по конкретным именам?
User avatar
Tim Sobolev
Posts: 729
Joined: Fri 01 Apr, 2005 14:46
Location: Украина
Has thanked: 1 time
Been thanked: 7 times

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

Post by Tim Sobolev »

John Doe wrote:Внесёте предложения по конкретным именам?
Тут даже не знаю. что ответить. "Сессионными" их назвать можно только для текущей их реализации, не факт что они не будут сохранятся в будущем. "Динамическими" их назвать можно, но мне как бы вариант "мульти" тоже нравится 8) .
User avatar
Tim Sobolev
Posts: 729
Joined: Fri 01 Apr, 2005 14:46
Location: Украина
Has thanked: 1 time
Been thanked: 7 times

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

Post by Tim Sobolev »

Ну так как, переименовывать будем или так и оставим? Если будем, то во что? :D
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 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: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Речь об API, так ведь?
Надо заменить STACK на SESSION или DYNAMIC или MULTI или ЧТОНИБУДЬ.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

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

Update
Исправлено в 4007
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

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

Кто может объяснить зачем это и как использовать?
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

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

Однако (сюрприз) ошибкой считается ситуация когда текущая позиция редактора совпадает с закладкой.
Это в общем проблем не доставляет, за исключением команды Pop (подробнее).
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Работа со стековыми закладками в редакторе (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.  
  3.   if flags and flags:find("w") then
  4.  
  5.     mf.beep()
  6.  
  7.     delay = delay or 1000
  8.  
  9.   end
  10.  
  11.   local s = far.SaveScreen()
  12.  
  13.   far.Message(msg,title or nfo.name,"",flags)
  14.  
  15.   far.Text()
  16.  
  17.   win.Sleep(delay or 300); far.RestoreScreen(s)
  18.  
  19. end
  20.  
  21.  
  22.  
  23. local GET_TOP = 0
  24.  
  25. Macro { description="[Bookmarks] push cur. position to bookmarks";
  26.  
  27.   area="Editor"; key="LCtrlF3";
  28.  
  29.   action=function()
  30.  
  31.     assert(BM.Push()~=0)
  32.  
  33.     MsgPopup("Pushed")
  34.  
  35.   end;
  36.  
  37. }
  38.  
  39. Macro { description="[Bookmarks] add cur. position to bookmarks and cut 'tail'";
  40.  
  41.   area="Editor"; key="LCtrlF3:Hold";
  42.  
  43.   action=function()
  44.  
  45.     assert(BM.Add()~=0)
  46.  
  47.     MsgPopup("Added")
  48.  
  49.   end;
  50.  
  51. }
  52.  
  53. Macro { description="[Bookmarks] pop bookmark";
  54.  
  55.   area="Editor"; key="LCtrlF4";
  56.  
  57.   action=function()
  58.  
  59.     local idxTop = BM.Stat(GET_TOP)
  60.  
  61.     if idxTop==0 then
  62.  
  63.       MsgPopup("Pop: no bookmarks")
  64.  
  65.     elseif BM.Pop()==0 then
  66.  
  67.       MsgPopup("Pop: already on position")
  68.  
  69.       BM.Del(idxTop)
  70.  
  71.     end
  72.  
  73.   end;
  74.  
  75. }
  76.  
  77. Macro { description="[Bookmarks] goto top bookmark";
  78.  
  79.   area="Editor"; key="LCtrlF4:Hold";
  80.  
  81.   action=function()
  82.  
  83.     local idxTop = BM.Stat(GET_TOP)
  84.  
  85.     if idxTop==0 then
  86.  
  87.       MsgPopup("Goto top: no bookmarks")
  88.  
  89.     elseif BM.Goto(idxTop)==0 then
  90.  
  91.       MsgPopup("Goto top: already on position")
  92.  
  93.     end
  94.  
  95.   end;
  96.  
  97. }
  98.  
  99. Macro { description="[Bookmarks] goto current bookmark";
  100.  
  101.   area="Editor"; key="LCtrlF5:Hold";
  102.  
  103.   action=function()
  104.  
  105.     if BM.Stat(GET_TOP)==0 then
  106.  
  107.       MsgPopup("Goto current: no bookmarks")
  108.  
  109.     elseif BM.Goto()==0 then
  110.  
  111.       MsgPopup("Goto current: already on position")
  112.  
  113.     end
  114.  
  115.   end;
  116.  
  117. }
  118.  
  119. Macro { description="[Bookmarks] next bookmark";
  120.  
  121.   area="Editor"; key="LCtrlF5";
  122.  
  123.   action=function()
  124.  
  125.     if BM.Stat(GET_TOP)==0 then
  126.  
  127.       MsgPopup("Next: no bookmarks")
  128.  
  129.     elseif BM.Next()==0 then
  130.  
  131.       MsgPopup("Next: already on position")
  132.  
  133.     end
  134.  
  135.   end;
  136.  
  137. }
  138.  
  139. Macro { description="[Bookmarks] prev bookmark";
  140.  
  141.   area="Editor"; key="LCtrlF6";
  142.  
  143.   action=function()
  144.  
  145.     if BM.Stat(GET_TOP)==0 then
  146.  
  147.       MsgPopup("Prev: no bookmarks")
  148.  
  149.     elseif BM.Prev()==0 then
  150.  
  151.       MsgPopup("Prev: already on position")
  152.  
  153.     end
  154.  
  155.   end;
  156.  
  157. }
  158.  
  159. Macro { description="[Bookmarks] back (push just added and goto prev)";
  160.  
  161.   area="Editor"; key="LCtrlF6:Hold";
  162.  
  163.   action=function()
  164.  
  165.     local idxTop = BM.Stat(GET_TOP)
  166.  
  167.     if idxTop==0 then
  168.  
  169.       MsgPopup("Back: no bookmarks")
  170.  
  171.     elseif BM.Back()~=1 then
  172.  
  173.       MsgPopup("Back: already on position")
  174.  
  175.     elseif idxTop<BM.Stat(GET_TOP) then
  176.  
  177.       MsgPopup("Back: pushed")
  178.  
  179.     end
  180.  
  181.   end;
  182.  
  183. }
  184.  
  185. Macro { description="[Bookmarks] del current bookmark";
  186.  
  187.   area="Editor"; key="LCtrlF8";
  188.  
  189.   action=function()
  190.  
  191.     if BM.Del()==0 then
  192.  
  193.       MsgPopup("Del: no bookmarks")
  194.  
  195.     else
  196.  
  197.       MsgPopup("Deleted")
  198.  
  199.     end
  200.  
  201.   end;
  202.  
  203. }
  204.  
  205. Macro { description="[Bookmarks] clear bookmarks";
  206.  
  207.   area="Editor"; key="LCtrlF8:Hold";
  208.  
  209.   action=function()
  210.  
  211.     assert(BM.Clear()~=0)
  212.  
  213.     MsgPopup("Cleared")
  214.  
  215.   end;
  216.  
  217. }
  218.  
  219. --]]
Примечание:
Хотя в Энциклопедии не документированно, в процессе составления макросов обнаружено (и использовано), что функции возвращают значения, позволяющие определить, привело ли действие к изменению позиции редактора.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

P.S.
Этот набор макросов отражает всё многообразие встроенных функций, но никак не определяет сценарии работы с ними.
И глядя на список функций совсем не очевидно, что же изначально задумывал автор (в особенности смущает функция back).
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

Я/мы (+@Херокс) проделали неплохую работу в этом направлении,
за основу взят скрипт @ShmuelZ (Scite-like bookmarks),
но почти полностью переработан и существенно дополнен

Пока нет времени делать публикации, если кто-то заинтересован - вышлю в личном порядке

У нас есть некоторые вопросы, (наприемр как лучше сделать persistence)
но лучше пока прочитаю и посмотрю что в этом варианте реализации от @JD,
может там будет ответ.

Букмарки это очень хорошая и недооценная вещь в ФАРе,
но в искоробочном варианте мало-юзабельна

И опять же надо какие-то такие полезные вещи включать в стандартную поставку,
а то мы работаем, есть много хорошего, но про это знает 20 человек от силы ..
Post Reply

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