Editor.Sel(): работа с выделением

Здесь обсуждается всё, что касается макросов.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Редактор: работа с выделением

Post by Skirda »

Latest post of the previous page:

dolzenko_, понил.

подумалось тут и... вот такое пойдет ("ТЗ на Землю")?:

Code: Select all

V=Editor.Sel(Action[,P1[,P2[,P3[,P4]]]])

  Action: 0 = Get Pos
              P1:   0 = return FirstLine
                    1 = return FirstPos
                    2 = return LastLine
                    3 = return LastPos

          1 = Set Pos
              P1:   0 = begin block (FirstLine & FirstPos)
                    1 = end block (LastLine & LastPos)
              return: 0 = false, 1 = true
          2 = Select None
              return 1 = true
          3 = Select Stream
              P1 = X1, P2 = Y1, P3 = X2, P4 = Y2
              return: 0 = false, 1 = true
          4 = Select Column
              P1 = X1, P2 = Y1, P3 = X2, P4 = Y2
              return: 0 = false, 1 = true
We are the Borg. You will be assimilated.
So Say We All!
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Re: Редактор: работа с выделением

Post by HaRT »

Skirda
В части SetPos/GetPos вполне, а вот с остальным, мне кажется, слишком мудрёно.
Вместо SelectNone есть CtrlU. Может лучше сделать так:

Code: Select all

Action: 2 = Set Stream Selection Edge
                P1:     0 = selection start
                        1 = selection finish
                return: 0 = failure
                        1 = success
        3 = Set Column Selection Edge
                P1:     0 = selection start
                        1 = selection finish
                return: 0 = failure
                        1 = success 
При этом позиция задавалась бы текущим положением курсора. Тогда и три лишних параметра не понадобятся.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Редактор: работа с выделением

Post by Skirda »

мммм... у меня такое впечатление, что мы о разном.
HaRT, так, как предлагаешь ты... может и не получится (IMHO)... слишком много контекста получается.
Правильно я понимаю, что Set`ами ты хочешь начинать и оканчивать селекты? (т.е. между Set(2,0) и Set(2,1) макрос будет что-то делать с позицией курсора, типа Ctrl-K b и Ctrl-K k в Turbo-средах).
We are the Borg. You will be assimilated.
So Say We All!
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Re: Редактор: работа с выделением

Post by HaRT »

Skirda wrote:типа Ctrl-K b и Ctrl-K k в Turbo-средах
Да, я ориентировался на такой сценарий.
Просто функция с 5 параметрами, 3 из которых используются только вместе и только в меньшинстве случаев, — это, на мой взгляд, некрасиво и трудно для восприятия.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Sel - работает неправильно или что?

Post by NightRoman »

Полезно читать свежую энциклопецию по Фар Апи :)

Попробовал новую (~ 16 января 2009) макро функцию Editor.Sel(1,0), чтобы по Left ставить курсор на начало блока. Поначалу показалось - работает, потом заметил - если строка начинается с табуляций (у меня размер 4), то курсор ставится левее нужного места. Чем больше табуляций, тем более левее.

Бага-фича или я чего где недочитал? А функция полезная, хорошо бы разобраться.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Sel - работает неправильно или что?

Post by Skirda »

да. бага. не учел табы. :oops:
ща...
We are the Borg. You will be assimilated.
So Say We All!
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Sel - работает неправильно или что?

Post by Skirda »

кстати, Editor.Sel(1,1) прыгает:
а) по позии тоже неверно (неучет табов)
б) на строку ниже :-)
в) на следующую позицию за концом блока

"а" и "б" я исправил, а вот "в" - ХЗ, непонятно.

поведение "в" так и оставлять или прыгать внутрь?
We are the Borg. You will be assimilated.
So Say We All!
Denis
Posts: 1444
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 10 times
Been thanked: 5 times

Re: Sel - работает неправильно или что?

Post by Denis »

Skirda
Я бы оставил "в" как сейчас - след. позиция за концом блока.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Re: Sel - работает неправильно или что?

Post by HaRT »

Skirda wrote:оставлять или прыгать внутрь
В начало лучше на первый символ, в конец — сразу за последним.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Редактор: работа с выделением

Post by Skirda »

fixed. проверяйте (в 2.0 - 746, в 1.75 - 2518)
We are the Borg. You will be assimilated.
So Say We All!
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Sel - работает неправильно или что?

Post by NightRoman »

HaRT wrote:
Skirda wrote:оставлять или прыгать внутрь
В начало лучше на первый символ, в конец — сразу за последним.
+1 По крайней мере, если это повесить на кнопки Left и Right, то будет как во многих редакторах, Visual Studio, Word, да и много их таких. Так и сделаю, и придется выкинуть один PowerShell скрипт :), что этим занимался.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Редактор: работа с выделением

Post by Skirda »

в общем... я тут при реализации не учел одну штуку - блоки-то бываю разными! сейчас эта функция в "принципе" нормально работает только с потоковыми блоками...
выясню пару вопросов, закоммичу окончательные изменения по функции. :oops:
We are the Borg. You will be assimilated.
So Say We All!
Denis
Posts: 1444
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 10 times
Been thanked: 5 times

Re: Редактор: работа с выделением

Post by Denis »

Skirda
Это из-за багов(в пред. сообщении) или я не так что-то делаю? Блоки непостоянные.
Этот макрос удаляет блок:
Editor.Sel(1, 0); Editor.Sel(2, 0); Editor.Sel(2, 1);
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Редактор: работа с выделением

Post by Skirda »

Denis wrote:Skirda
Это из-за багов(в пред. сообщении) или я не так что-то делаю? Блоки непостоянные.
Этот макрос удаляет блок:
Editor.Sel(1, 0); Editor.Sel(2, 0); Editor.Sel(2, 1);
нет, это не из-за "выше", здесь "раньше" :-(
ошибка в парсере...
блок удаляется сразу после первого "Editor.Sel(1, 0);", т.к. это чудо раскладывается на "Editor.Sel(1, 0)" и ";". вот эта самая точка-с-запятой и убивает блок.
Сама Editor.Sel никаких боевых действий с букафками не делает.

щаз гляну...


Попутно дурацкий вопрос :crazy:
Имеем в наличии выделенный блок, мы вызываем Editor.Sel(2, 0) - должно ли с текущего блока сниматься выделение?
We are the Borg. You will be assimilated.
So Say We All!
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Редактор: работа с выделением

Post by Skirda »

Skirda wrote:Попутно дурацкий вопрос :crazy:
Имеем в наличии выделенный блок, мы вызываем Editor.Sel(2, 0) - должно ли с текущего блока сниматься выделение?
забыл пояснить...
выделение снимается при полной установке блока, т.е. только когда помечаем конечную точку.
т.е. сейчас можно делать... эээ
1. Editor.Sel(2, 0) - помечаем начало stream блока
2. что-то делали, и даже блоки выделяли...
3. Editor.Sel(2, 1) - помечаем конец - предыдущие выделения снимаются и помечается новый блок от (1) до "сюда".

если блок будет гаснуть при Editor.Sel(2, 0), то фокус, описанный выше, уже не прокатит :)


хмм... и Editor.Sel(2, 0) и Editor.Sel(3, 0) делают одно и тоже действие, принятие решения о типе блока (вертикальный или обычный) делается в Editor.Sel([2|3], 1).
We are the Borg. You will be assimilated.
So Say We All!
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Редактор: работа с выделением

Post by Skirda »

проверяем - этот билд тестовый никуда пока не закоммиченный.

здесь
макросы:
- Editor.Sel(0,4) - вернет тип блока (0 - нету, 1 - stream, 2 - column)
- исправлены прыжки (в т.ч с column, которые по сути не пахали)
- некорректно работали установки... без учета табов
- некорректно работали инфо-функции - без учета табов
- парсер - символ ';' сразу после закрывающейся скобки функции игнорируется

Попутно в АПИ для ECTL_SELECT была несуразица:
- отметка блока исчезает всегда, сейчас, если что-то не так с параметрами, блок остается на месте
- отметка блока исчезает всегда, даже если такой строки не находили (BlockStartLine)
- если BlockHeight был больше чем текста (например, пытаемся выделить блок, указывая последнюю строку, а BlockHeight=, например, 10), то EditorControl возвращал FALSE, хотя блок успешно выделялся.
- Читаем "BlockWidth - Ширина блока. Может быть отрицательной величиной." - но получалось, что при BTYPE_COLUMN и BlockWidth=-1 "транзакция"
пометки блока неполная, что может приводить к непоняткам с блоками.

Что-то не могу припомнить для чего нужна была проверка "if(BlockWidth==-1)", в любом случае получалась не полная транзакция.

фокус с
1. Editor.Sel(2, 0) - помечаем начало stream блока
2. что-то делали, и даже блоки выделяли...
3. Editor.Sel(2, 1) - помечаем конец - предыдущие выделения снимаются и помечается новый блок от (1) до "сюда"
остается в силе :)
We are the Borg. You will be assimilated.
So Say We All!
Post Reply

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