Работа со стековыми закладками в редакторе (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:

Code: Select all

  Добавка к BM.stat(I) - для I=1 возвращается индекс текущей закладки (-1 если закладок нет)
Может лучше сделать по аналогии с прочими макроэлементами: BM.ItemCount и BM.CurPos?
И в случае ошибки: почему не 0?
Ну тут в случае не обнаружения в макросах надо возвращать 0 (увеличивать текущее на 1)
John Doe wrote: Не многовато ли? Ведь реально обойтись всего одной.
BM.last (как BM.goto(BM.stat())) и, особенно, BM.first (как BM.goto(1)) в принципе можно убрать, раз они так уже мешают, но добавлены они исключительно ради удобства. У BM.prev есть спец.роль (см. уточнения к BM.add), BM.next заменять смысла нету.
John Doe wrote: Аналогично, наличие BM.add/push и BM.del/pop тоже несколько избыточно
BM.push/BM.pop делают следующее: в независимости от состояния других закладок, создаётся ещё одна в текущей позиции редактора/выполняется переход к последней (позже всех созданной) из закладок (если перед этим вызывался BM.push -- то к созданной им) и происходит удаление этой закладки.
John Doe wrote: Кстати, а BM.del удаляет только одну закладку, или весь хвост?
Ясно же написано, что при аргументе 0 или отсутствии оного удаляется текущая закладка.
John Doe wrote:И правильно ли вообще обзывать вершину стека "хвостом" и "концом"?
Ну можешь предложить свой вариант наименование, суть я вроде описал :)
John Doe wrote:
Создание закладки в текущей позиции редактора происходит ТОЛЬКО при вызове BM.prev и ТОЛЬКО для
Если же нужно просто запомнить и восстановить позицию в редакторе, то тут идеально подходят BM.push / BM.pop
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

Вот эти "игры" с с bm.prev и bm.next находясь в конце очереди (после bm.add) очень сбивают с толку:
Создали закладку (bm.add) - это понятно!,
но чтобы перейти на нее надо перейти на следующую (bm.next) - на какую следующую, у меня всего одна закладка?,
а если не переходить на следующую, а перейти на предыдущую то закладок станет 2, или останется 1 - ...
Раньше я думал что такие сложности были задуманы для того чтобы сэкономить одну команду - типа bm.pos - установить положение в редакторе на текущую позицию навигации, но сейчас добавляется множество полудублирующих команд и такие сложности мне непонятны.

я бы сделал так:
минимальный функционал

Code: Select all

bm.count() - возвращает количество закладок.
bm.curpos() - возвращает индекс текущей закладки.
bm.append() - добавляем закладку в конец, при этом curpos=count;
bm.goto([Idx]) - установить редактор в соответствии с закладкой с индексом Idx, если Idx не указано или равно 0, то Idx=curpos;, если Idx больше count то Idx=count;, при этом curpos=Idx;
bm.del([Idx]) - удаляем закладку с индексом Idx, если Idx не указан или равен 0, то Idx=curpos; , при этом $if ((curpos>i)||(curpos=count)) curpos=curpos-1; $end
расширенный функционал

Code: Select all

bm.trunc([Idx]) - отрезаем хвост, это эквивалентно $if (Idx=0) i=bm.curpos()+1 $else i=Idx+1 $end $while (i!=bm.count()) bm.del(i) $end
bm.clear() - чистим все закладки, это эквивалентно $while (bm.count()!=0) bm.del(1) $end
bm.add() - добавить текущие параметры закладки и обрезать хвост, это эквивалентно bm.trunc(0); bm.append()
bm.previos() - перейти на предыдущую закладку, это эквивалентно bm.goto(bm.curpos()-1)
bm.next() - перейти на следующую закладку, это эквивалентно bm.goto(bm.curpos()+1)
bm.first() - перейти на первую закладку, это эквивалентно bm.goto(1);
bm.last() - перейти на последнюю закладку, это эквивалентно bm.goto(bm.count())
bm.pop() - положить в стек закладку, это эквивалентно bm.append()
bm.push() - забрать из стека закладку с переходом эквивалентно bm.goto(bm.count()) bm.del(bm.count())
супер расширенный функционал

Code: Select all

bm.set(Idx) - устанавливаем curpos в значение Idx без перехода в редакторе, при этом если Idx меньше 1, то curpos=1;, если Idx больше count, то curpos=count;
bm.insert(Idx) - вставляем закладку в позицию с индексом Idx, закладки с индексами выше Idx сдвигаются на 1, при этом $if ((curpos>i)) curpos=curpos+1 $end
bm.test() - возвращает индекс закладки соответствующей текущему положению в редакторе, если такой закладки нет 0
bm.prev() - изначальный функционал почти эквивалентно i=bm.test() $if ((i!=bm.curpos)&&(bm.curpos==bm.count))  bm.add() bm.previos() $else bm.previos() $end
SimSU ··· ·· -- ··· ··-
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

Если немного расширить функции минимального функционала:
вместо bm.count() сделать
bm.count([Cnt]) и при заданном Cnt обрезать размер до Cnt, а при незаданном просто возвращать, то функции bm.trunc и bm.clear отпадут

вместо bm.curpos() сделать
bm.curpos([Idx]) и при заданном Idx устанавливать Curpos в позицию Idx не трогая редактора, а при не заданном просто возвращать индекс, то отпадет функция bm.set(Idx)

вместо bm.append() сделать
bm.append([Idx]) и при заданном Idx добавлять закладку в указанную позицию, а при незаданном в конец, то отпадет функция bm.insert(Idx)

и добавив в минимальный функционал функцию bm.test() из супер расширенно функционала

получим ИМХО полный набор работы с закладками

А по большому счету всё это можно реализовать ПРОСТО макросами :) класс BM не нужен.
SimSU ··· ·· -- ··· ··-
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 »

Skirda wrote:
John Doe wrote:Слишком большое разнообразие функций, и слишком много неописанных тонкостей.
А если все тонкости описать, то сложновато получается, всему этому нестройному хозяйству сильно недостаёт интуитивности.
предлагай - что удалить, что добавить (благо, как я понял, bm.xxx() не сильно юзается - можно и пошалить :-))
Проблема в том, что закладки с одной стороны немного стековые, а с другой - вовсе нет.
Это по меньшей мере неконцептуально. Казалось бы "да пусть будет, каждый будет пользоваться чем ему надо". Но прежде чем понять "что же надо" придётся вникнуть в эту массу фунций, выделить их общности и различия.
Имхо неоправданно это. Простота наше всё.

Я считаю что надо определиться с тем являются ли закладки стеком или нет, после чего убрать всё лишнее.
Если убирать жалко, значит надо чётко разделить закладки на 2 типа.

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: У BM.prev есть спец.роль (см. уточнения к BM.add).
Я так понимаю эту особую роль можно заменить двумя обычными командами, применение которых абсолютно прозрачно и не требует примечаний в Писании.
И даже если преположить что BM.prev таки нужен, его всё равно можно реализовать с помощью BM.goto(BM_Prev) (где BM_Prev константа, со значением, к примеру, -2).
Tim Sobolev wrote:
John Doe wrote:И правильно ли вообще обзывать вершину стека "хвостом" и "концом"?
Ну можешь предложить свой вариант наименование, суть я вроде описал :)
В данном случае я только лишь усомнился, с точки зрения здравого смысла. Если есть какая-то общепринятая практика именования - значит стоит её придерживаться.
(Какова практика мне неизвестно)
John Doe wrote:

Code: Select all

  Примечание для BM.add() и BM.prev()

  Если была выполнена операция BM.add() и после неё BM.prev(), произойдёт
  следующее:

  а) Если текущая позиция в редакторе соответствует позиции, сохранённой в
  BM.add(), то произойдёт переход на предшествующую, созданной BM.add(),
  закладку.
Ну а если были множественные перемещения, и позиция совпадает совершенно случайно?
Имхо этот пункт снижает предсказуемость закладок, не давая ничего взамен.
Tim Sobolev wrote:Создание закладки в текущей позиции редактора происходит ТОЛЬКО при вызове BM.prev и ТОЛЬКО для случая когда перед этим была вызвана BM.add, мы не стоим в позиции редактора, которая была при вызове BM.add и не производилось других, изменяющих состояние стековых закладок, операций. Такой функционал заложен изначально (ради него, по сути, эти закладки и добавлялись) и только для пары BM.add/BM.prev с целью простой и быстрой навигации, например при переходе на определение функции из колорера.
В результате мы незначительно экономим на явном вызове 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 »

Да что все прицепились к слову "стековые"? По сути лишь BM.push и BM.pop "чисто" стековые функции. И вообще, название "стековые" прилепили только чтобы как-то отличать от обычных, в реализации это обычный двунаправленный список, со своей спецификой: отсутствует вставка, вместо неё происходит откидывание "хвоста". Выкидывать функционал навигации по списку никто не собирается. Если название не соответствует выполняемым функциям, значит надо менять название, например на "динамические".

Насчёт вникания в функционал. Базовый функционал дают BM.push, BM.pop, BM.clear и BM.stat. Расширенный - BM.add, BM.del, BM.prev, BM.next, BM.goto и BM.get. Кому надо -- разберётся. Кому не надо -- пусть пользуется стандартными и самопальными макросами.
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:И даже если преположить что BM.prev таки нужен, его всё равно можно реализовать с помощью BM.goto(BM_Prev)
А зачем лишний раз всё усложнять? А проэмулировать работу BM.prev макросами довольно накладно по коду. И дублировать весь этот код в каждом новом макросе неохота.
John Doe wrote:В результате мы незначительно экономим на явном вызове BM.Add, но зато существенно запутываем описание.
Вызов как раз не явный, а ситуативный. И изначально эти закладки разрабатывались именно под такое поведение.

PS. BM.add, BM.prev и BM.next разрабатывались исключительно для поддержки навигации в редакторе. Поэтому они столь специфичны. Кому нужно простое сохранение и возврат к позиции в редакторе, должен использовать BM.push и BM.pop, а нужна ещё и выборочная навигация и удаление -- вместе с BM.goto, BM.del.
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

Если за основу взять именно стек, то для базового функционала хватит: BM.push, BM.рop ну может быть еще BM.clear, (зачем BM.state? кстати всетаки лучше BM.count).
этого хватит для большинства случаев
SimSU ··· ·· -- ··· ··-
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:Да что все прицепились к слову "стековые"? ... Если название не соответствует выполняемым функциям, значит надо менять название, например на "динамические".
Не к названию. Одна и таже сущность и стек и не стек. Выгоды ноль, описание путанное.
Я не знаю конечно, может это обычная практика в серьёзных языках программирования, но зачем усложнять примитивный макроязык?
Tim Sobolev wrote:А проэмулировать работу BM.prev макросами довольно накладно по коду. И дублировать весь этот код в каждом новом макросе неохота.
Накладно что именно? Вести счёт закладкам?
Tim Sobolev wrote:
John Doe wrote:В результате мы незначительно экономим на явном вызове BM.Add, но зато существенно запутываем описание.
Вызов как раз не явный, а ситуативный. И изначально эти закладки разрабатывались именно под такое поведение.
Изначально может и так, но мы же стремимся к лучшему.
Что даёт нам эта ситуативность, помимо уменьшения предсказуемости?
Tim Sobolev wrote:BM.add, BM.prev и BM.next разрабатывались исключительно для поддержки навигации в редакторе.
Давайте на конкретных примерах.

P.S.
Я не возражаю, пусть add/next, но тогда давайте упростим, и выбросим все лишние свойства стека.
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 »

SUSim 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:
Tim Sobolev wrote:BM.add, BM.prev и BM.next разрабатывались исключительно для поддержки навигации в редакторе.
Давайте на конкретных примерах.
Конкретно на ShiftSpace у меня висит переход к определению функции в Colorer: BM.Add() F11 O 8
на ShiftBS висит BM.Prev()
На CtrlShiftBS висит BM.Next()
Т.о. я могу посмотреть что делает функция, её подфункция и т.д., попрыгать туда-обратно столько, сколько мне нужно
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

А я и не предлагаю урезать по этому выбрал бы полноценный список и при этом для сохранения минимума функций и философию макросов FAR то:
BM.count([Cnt])
BM.curpos([Idx])
BM.append([Idx])
BM.goto([Idx])
BM.del([Idx])

Заметьте, я специально не повторяю существующие названия, чтобы не портить существующий функционал...
Данный функционал легко расширяется как в стек так и в существующий двунаправленный список
SimSU ··· ·· -- ··· ··-
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

Tim Sobolev wrote:Конкретно на ShiftSpace у меня висит переход к определению функции в Colorer: BM.Add() F11 O 8
если тут сменить позицию в редакторе то тут
на ShiftBS висит BM.Prev()
разьве не появится лишняя закладка?
На CtrlShiftBS висит BM.Next()
Т.о. я могу посмотреть что делает функция, её подфункция и т.д., попрыгать туда-обратно столько, сколько мне нужно
SimSU ··· ·· -- ··· ··-
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 »

SUSim wrote:разьве не появится лишняя закладка?
Появится, в этом-то и весь смысл :)

PS. BM.stat(1) в 1711 пофиксил, теперь 0 когда закладок нет, и от 1 и выше -- индекс закладки.
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

:) Блина... получаешь то, на что даже не надеялся, (непонятки - баги, могут оказаться фичами :) )
я не понимал этой фичи и в макросах приходилось писать add() next(), а с примером понял мысль :)
SimSU ··· ·· -- ··· ··-
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

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

Post by SUSim »

В реализации универсального перечисления чего-либо, и всесторонней работы с этим перечислением, должно быть как минимум:
1 - возможность добавления и/или вставки в произвольное место элемента;
2 - возможность перехода к любому элементу;
3 - возможность удаления любого элемента;
Это минимальный функционал при работе с абстрактными элементами.
Для реализации специфики программирования требуется еще как минимум:
4 - получение количества всех элементов (при проведении физического эксперимента оно(количество) известно или не важно);
5 - изменение позиционирования (на индекс "нужного" элемента) без выполнения пункта 2 (то есть возможность получать данные от любого элемента без посещения старших элементов);

Перечитал 4 раза, не знаю как понятней рассказать... не та специфика у меня, но теория фундаментальная... :?
SimSU ··· ·· -- ··· ··-
Post Reply

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