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

Здесь обсуждается всё, что касается макросов.
User avatar
HaRT
Moderator
Posts: 8682
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 78 times
Been thanked: 145 times

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

Post by HaRT » Mon 22 Dec, 2008 15:46

Latest post of the previous page:

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: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 3 times

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

Post by Skirda » Mon 22 Dec, 2008 16:15

мммм... у меня такое впечатление, что мы о разном.
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: 8682
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 78 times
Been thanked: 145 times

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

Post by HaRT » Mon 22 Dec, 2008 18:11

Skirda wrote:типа Ctrl-K b и Ctrl-K k в Turbo-средах
Да, я ориентировался на такой сценарий.
Просто функция с 5 параметрами, 3 из которых используются только вместе и только в меньшинстве случаев, — это, на мой взгляд, некрасиво и трудно для восприятия.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

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

Post by NightRoman » Thu 22 Jan, 2009 00:00

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

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

Бага-фича или я чего где недочитал? А функция полезная, хорошо бы разобраться.

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

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

Post by Skirda » Thu 22 Jan, 2009 09:01

да. бага. не учел табы. :oops:
ща...
We are the Borg. You will be assimilated.
So Say We All!

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

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

Post by Skirda » Thu 22 Jan, 2009 09:35

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

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

поведение "в" так и оставлять или прыгать внутрь?
We are the Borg. You will be assimilated.
So Say We All!

Denis
Posts: 1411
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 4 times
Been thanked: 2 times

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

Post by Denis » Thu 22 Jan, 2009 10:09

Skirda
Я бы оставил "в" как сейчас - след. позиция за концом блока.

User avatar
HaRT
Moderator
Posts: 8682
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 78 times
Been thanked: 145 times

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

Post by HaRT » Thu 22 Jan, 2009 10:34

Skirda wrote:оставлять или прыгать внутрь
В начало лучше на первый символ, в конец — сразу за последним.
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by Skirda » Thu 22 Jan, 2009 10:56

fixed. проверяйте (в 2.0 - 746, в 1.75 - 2518)
We are the Borg. You will be assimilated.
So Say We All!

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

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

Post by NightRoman » Thu 22 Jan, 2009 15:08

HaRT wrote:
Skirda wrote:оставлять или прыгать внутрь
В начало лучше на первый символ, в конец — сразу за последним.
+1 По крайней мере, если это повесить на кнопки Left и Right, то будет как во многих редакторах, Visual Studio, Word, да и много их таких. Так и сделаю, и придется выкинуть один PowerShell скрипт :), что этим занимался.

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

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

Post by Skirda » Thu 22 Jan, 2009 15:13

в общем... я тут при реализации не учел одну штуку - блоки-то бываю разными! сейчас эта функция в "принципе" нормально работает только с потоковыми блоками...
выясню пару вопросов, закоммичу окончательные изменения по функции. :oops:
We are the Borg. You will be assimilated.
So Say We All!

Denis
Posts: 1411
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 4 times
Been thanked: 2 times

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

Post by Denis » Thu 22 Jan, 2009 15:19

Skirda
Это из-за багов(в пред. сообщении) или я не так что-то делаю? Блоки непостоянные.
Этот макрос удаляет блок:
Editor.Sel(1, 0); Editor.Sel(2, 0); Editor.Sel(2, 1);

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

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

Post by Skirda » Thu 22 Jan, 2009 16:42

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: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 3 times

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

Post by Skirda » Thu 22 Jan, 2009 16:56

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: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 3 times

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

Post by Skirda » Thu 22 Jan, 2009 19:29

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

здесь
макросы:
- 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!

User avatar
HaRT
Moderator
Posts: 8682
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 78 times
Been thanked: 145 times

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

Post by HaRT » Thu 22 Jan, 2009 19:43

Skirda wrote:Editor.Sel(0,4) - вернет тип блока (0 - нету, 1 - stream, 2 - column)
Это нарочно в добавок к EDITORSTATE_STREAM_SELECT и EDITORSTATE_VERTICAL_BLOCK?
Не предполагается ли предоставить также возможность переключить тип блока?
Skirda wrote:для чего нужна была проверка "if(BlockWidth==-1)"
Случаем не для „(одно)строчного” выделения (того, которое получается, если нажать CtrlIns при отсутствии выделения)?
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

Post by Skirda » Thu 22 Jan, 2009 20:00

HaRT wrote:
Skirda wrote:Editor.Sel(0,4) - вернет тип блока (0 - нету, 1 - stream, 2 - column)
Это нарочно в добавок к EDITORSTATE_STREAM_SELECT и EDITORSTATE_VERTICAL_BLOCK?
Ну... т.с. для единообразия :-)
Могу и убрать.
HaRT wrote:Не предполагается ли предоставить также возможность переключить тип блока?
Ну и как ты себе представляешь КАК ЭТО будет выглядеть? Особенно, если блок был потоковый, размазанный на несколько строк, а мы тут раз, махнули тип и жмакнули Ctrl-C.
Что после Ctrl-V будет?
HaRT wrote:
Skirda wrote:для чего нужна была проверка "if(BlockWidth==-1)"
Случаем не для „(одно)строчного” выделения (того, которое получается, если нажать CtrlIns при отсутствии выделения)?
Ну... собственно это были мысли вслух :D Нет конечно, я описывал АПИ.
We are the Borg. You will be assimilated.
So Say We All!

Post Reply

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