Page 1 of 2

Особенности ECTL_SELECT

Posted: Mon 05 Mar, 2012 22:46
by Shmuel
Случайно обнаружил, что в зависимости от типа блока нужно указывать разную величину BlockStartPos: для BTYPE_STREAM - строковую, а для BTYPE_COLUMN - экранную (то-есть, с учётом экранной длины табов). При этом, в случае BTYPE_COLUMN возможно программно задать выделение, которое невозможно сделать вручную (т.е., начинающееся внутри экранных позиций, занимаемых табом).

Очень желательно это задокументировать.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 00:35
by zg
Shmuel wrote:При этом, в случае BTYPE_COLUMN возможно программно задать выделение, которое невозможно сделать вручную (т.е., начинающееся внутри экранных позиций, занимаемых табом).
сделано вручную:
Image

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 00:44
by Shmuel
А поделиться рецептом?

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 00:45
by zg
Shmuel wrote:А поделиться рецептом?
постоянные блоки. выделено по простому тексту, потом текст удалён и введены табы.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 00:51
by Shmuel
zg wrote:
Shmuel wrote:А поделиться рецептом?
постоянные блоки. выделено по простому тексту, потом текст удалён и введены табы.
Это, конечно, любопытно, но не в этом суть. Считаю, что следует задокументировать разный смысл BlockStartPos и BlockWidth для разных типов блоков, так как это далеко не для всех очевидно.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 00:59
by zg
Shmuel wrote:Это, конечно, любопытно, но не в этом суть. Считаю, что следует задокументировать разный смысл BlockStartPos и BlockWidth для разных типов блоков, так как это далеко не для всех очевидно.
он должен быть одинаковым.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 03:50
by zg
2524.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 08:50
by Shmuel
zg wrote:2524.
Надо иметь в виду, что это изменение ломает некоторые редакторные плагины, в том числе ANSI-плагины.

Например, в S&R после замены в вертикальном блоке выделение устанавливается неправильно, если блоку предшествуют табы. Возможно, будут замечены и более серьёзные поломки.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 13:55
by Shmuel
zg wrote:2524.
zg
1. Может, лучше откатить? Прежнее поведение было ещё с 1-го Фара, и вроде никто не жаловался. И есть своя логика в том, что начало и ширина вертикального блока задаются в экранных координатах: вертикальный блок, в отличие от поточного, он как бы "сам по себе" (привязан скорее к экрану, чем к тексту).

2. Если не откатываем: данное изменение сломало ECTL_GETSTRING по части SelEnd. Пример: в редакторе 2 одинаковых строки "-\t". Выделяем их вертикальным блоком. Для 1-й SelEnd=2 (правильно), для 2-й строки почему-то SelEnd=1.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 14:44
by zg
Shmuel wrote:
zg wrote:2524.
1. Может, лучше откатить? Прежнее поведение было ещё с 1-го Фара, и вроде никто не жаловался. И есть своя логика в том, что начало и ширина вертикального блока задаются в экранных координатах: вертикальный блок, в отличие от поточного, он как бы "сам по себе" (привязан скорее к экрану, чем к тексту).
если не использовать табы, то ничего не изменилось. если использовать, то большой разницы как бы и нет. сейчас на мой взгляд логичней некоторые вещи. плюс баги некоторые ушли (при определённых условиях alt-up не работал например). вообще вертикальные блоки и табы порождают неоднозначность в любом случае. если вопрос навеян анси плагинами — врапер я поправлю, как будет время.
2. Если не откатываем: данное изменение сломало ECTL_GETSTRING по части SelEnd. Пример: в редакторе 2 одинаковых строки "-\t". Выделяем их вертикальным блоком. Для 1-й SelEnd=2 (правильно), для 2-й строки почему-то SelEnd=1.
код:

Code: Select all

local line=editor.GetString(-1,-1)
far.Message("start: "..line.SelStart..", end: "..line.SelEnd, nil, "OK")
для обеих строк показывает 0 2.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 15:00
by Shmuel
Да, немного ошибся. Мой опыт был такой (после GetString следовал SetString):

Code: Select all

for i=0,1 do
  local line=editor.GetString(-1,i)
  far.Message("start: "..line.SelStart..", end: "..line.SelEnd, nil, "OK")
  editor.SetString(-1,i,"abc")
end
И вот здесь - неверный результат (для второй строки SelEnd=1). Это же видно при замене в данном вертикальном блоке: как в S&R, так и в LF Search (заменять "." на "A" с регулярными выражениями).

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 15:29
by zg
Shmuel wrote:И вот здесь - неверный результат (для второй строки SelEnd=1).
он верный. поменяй только первую строку, посмотри что с блоком.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 15:34
by Shmuel
А разве вертикальный блок (который может иметь высоту в сотни строк) должен менять свои параметры после замены в одной какой-то строке? Раньше, вроде, такого не было.

Да, и по существу возражения: визуально после первой замены ширина блока становится равной 2 экранным позициям.
Что же получается: в первой строке ширина вертикального блока осталась 2, а во второй стала 1?
Это сильно новые правила игры.

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 16:16
by 2useven10
вертикальные блоки в символах?
до первого апреля почти месяц...
может какие-то баги и ушли, а сколько появилось новых?
в тексте ниже, начинаем от начала строки: Right Alt-Right Alt-Right Alt-Down Alt-Left
кому-то нужно такое поведение?

Code: Select all

1<tab><tab>
abcdefghijklmnopqrst

Re: Особенности ECTL_SELECT

Posted: Tue 06 Mar, 2012 16:27
by zg
Shmuel wrote:А разве вертикальный блок (который может иметь высоту в сотни строк) должен менять свои параметры после замены в одной какой-то строке? Раньше, вроде, такого не было.
раньше была привязка к экранной позицией. сейчас к символам первой строки. ладно, я откачу. но всех «несогласных» буду посылать к тебе.
Да, и по существу возражения: визуально после первой замены ширина блока становится равной 2 экранным позициям.
Что же получается: в первой строке ширина вертикального блока осталась 2, а во второй стала 1?
Это сильно новые правила игры.
1 символ, да. в чём проблема?