Editor.Pos

Здесь обсуждается всё, что касается макросов.
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:

тестируем

Синтаксис:

Code: Select all

N=Editor.Pos(Op,What[,Where])

Op: 0 - get, 1 - set
What: 
   1 - CurLine
   2 - CurPos
   3 - CurTabPos
   4 - TopScreenLine
   5 - LeftPos
   6 - Overtype

Return: -1 - "не в теме", для "get" - текущее значение, для "set" - "угу" (1) или "не угу" (0)
Пример (при включенном ScrollLock клавиши Left/Right занимаются скроллллингом)

Code: Select all

REGEDIT4

[HKEY_CURRENT_USER\Software\far2\KeyMacros\Editor\Right]
"Sequence"="$if(FLock(2,-1) == 1) Editor.Pos(1,5,Editor.Pos(0,5)+1); $else Right $end"
"DisableOutput"=dword:00000001

[HKEY_CURRENT_USER\Software\far2\KeyMacros\Editor\Left]
"Sequence"="$if(FLock(2,-1) == 1) Editor.Pos(1,5,Editor.Pos(0,5)-1); $else Left $end"
"DisableOutput"=dword:00000001
We are the Borg. You will be assimilated.
So Say We All!
User avatar
DAtaMan
Posts: 262
Joined: Wed 24 Jun, 2009 10:01
Location: не отсюда

Re: Горизонтальная прокрутка в редакторе

Post by DAtaMan »

Спасибо - пока полет нормальный !
Я ещё добавил:

Code: Select all

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Far2\KeyMacros\Editor\CtrlLeft]
"Sequence"="$if(FLock(2,-1) == 1) Editor.Pos(1,5,Editor.Pos(0,5)-10); $else CtrlLeft $end"
"DisableOutput"=dword:00000001

[HKEY_CURRENT_USER\Software\Far2\KeyMacros\Editor\CtrlRight]
"Sequence"="$if(FLock(2,-1) == 1) Editor.Pos(1,5,Editor.Pos(0,5)+10); $else CtrlRight $end"
"DisableOutput"=dword:00000001
А можно ещё добавить функцию, возвращающую максимальную длину строки в редакторе ?
2B OR NOT 2B = FF (Иногда code - это просто код. Почти Дйерф Омолш Днумзигис)
To ban or not to ban, that is the question. ©
wolf
Posts: 1030
Joined: Fri 08 Apr, 2005 12:54
Location: Moscow

Re: Горизонтальная прокрутка в редакторе

Post by wolf »

DAtaMan wrote:А можно ещё добавить функцию, возвращающую максимальную длину строки в редакторе ?
которую - максимальную из тех что сейчас на экране? или вообще у текущего файла?
ошибка — считать, что фар для пользователей. (с) zg
User avatar
DAtaMan
Posts: 262
Joined: Wed 24 Jun, 2009 10:01
Location: не отсюда

Re: Горизонтальная прокрутка в редакторе

Post by DAtaMan »

У текущего файла. Тогда легко можно будет скроллировать до конца самой длинной строки.

P.S. Хотя как вариант примерно так:

Code: Select all

N=Editor.MaxLineLength(What)

What: 
   1 - Visible
   2 - Total
 
2B OR NOT 2B = FF (Иногда code - это просто код. Почти Дйерф Омолш Днумзигис)
To ban or not to ban, that is the question. ©
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

Re: Горизонтальная прокрутка в редакторе

Post by ccaid »

супер
упрощенный вариант приведенного примера служит заменой гор. скроллинга EditCrutch'а:

Code: Select all

[HKEY_CURRENT_USER\Software\far2\KeyMacros\Editor\AltShiftRight]
"Sequence"="Editor.Pos(1,5,Editor.Pos(0,5)+1);"
"DisableOutput"=dword:00000001

[HKEY_CURRENT_USER\Software\far2\KeyMacros\Editor\AltShiftLeft]
"Sequence"="Editor.Pos(1,5,Editor.Pos(0,5)-1);"
"DisableOutput"=dword:00000001
Фар делают добрые люди
User avatar
Toxa
Posts: 275
Joined: Wed 27 Jul, 2005 14:35
Location: Москва
Contact:

Re: Горизонтальная прокрутка в редакторе

Post by Toxa »

Skirda
Прокомментировал на Мантисе относительно TopScreenLine и LeftPos. Дублирую сюда:

1.
> Return: для "set" - "угу" (1) или "не угу" (0)
Как минимум Editor.Pos(1, 4, %a) и Editor.Pos(1, 5, %a) возвращают всегда 1, то есть "угу", даже если смещения не произошло. Другие операции не проверял на предмет return.

2.
Editor.Pos(1, 5, %a) ведёт себя неадекватно при %a < 1. Остальное не проверял.

3.
Можно ли при превышении лимитов всё же производить сдвиг на максимально возможное значение, то есть пока курсор не упрётся в левую, правую, верхнюю или нижнюю границу экрана?

4. (wish)
Editor.Pos(1, 4, %a) — оставляет курсор в текущей строке
Editor.Pos(1, 5, %a) — перемещает курсор на столько же позиций, на сколько сдвинули прокрутку. Можно этого не делать? При желании всегда можно написать макрос.
Может кому пригодится.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Горизонтальная прокрутка в редакторе

Post by Skirda »

1. ну так set ведь успешно выполнен!
2. поправлю
3. при большом количестве строк... тормоза будут
4. сдвиг курсора делал по аналогии с Ctrl-Up/Down... надо подумать
We are the Borg. You will be assimilated.
So Say We All!
User avatar
Toxa
Posts: 275
Joined: Wed 27 Jul, 2005 14:35
Location: Москва
Contact:

Re: Горизонтальная прокрутка в редакторе

Post by Toxa »

1. Допустим, есть файл, строк в нём хватает. CurLine == 2, TopScreenLine == 1.
Editor.Pos(1, 4, 2) срабатывает (TopScreenLine == 2) и возвращает 1 («угу»).
Editor.Pos(1, 4, 3) НЕ срабатывает (TopScreenLine == 1) и возвращает 1 («угу»).
Разве во втором случае set успешно выполнен?
А вообще это не так важно, если бы работал п. 3 (см. далее).

3. Я имел в виду, что в описанном выше примере нужно было установить TopScreenLine = 2 (т. к. 3, 4, 5 и т. д. нельзя из-за курсора) и вернуть 1 («угу»). То есть, если TopScreenLine > CurLine, то TopScreenLine = CurLine. Аналогично, если TopScreenLine < CurLine - Editor.Height + 1, то TopScreenLine = CurLine - Editor.Height + 1. Или как раз из-за такой логики будут тормоза?
Может кому пригодится.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Горизонтальная прокрутка в редакторе

Post by Skirda »

1. гляну.
3. теперь понятно. я сначала подумал про весь текст
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.Pos "паразитирует" на вызове EditorControl. Похоже здесь бага, древняя как сам Мир.
Если плагин вызывает EditorControl(ECTL_SETPOSITION,{-1,-1,-1,1,-1,-1}) - т.е. хотим выставить только топскрин, но при этом, скажем стоим где-то в районе 2000 строки (посреди экрана), то... вместо ожидаемого "строка 2 вверху экрана" получаем: 2000 строка вместе с курсором внизу экрана, а "топом" становится 1978 (консоль 80x25).

Ideas? (не только по макросам, но и касаемо АПИ!)
We are the Borg. You will be assimilated.
So Say We All!
User avatar
Toxa
Posts: 275
Joined: Wed 27 Jul, 2005 14:35
Location: Москва
Contact:

Re: Горизонтальная прокрутка в редакторе

Post by Toxa »

ИМХО оно так и должно работать. Что такое скролл в GUI? Это когда курсор сохраняет свою позицию в тексте, а меняется только положение прокрутки. Поскольку Фар не умеет ставить курсор за пределами экрана (такой он есть и таким мы его любим), курсор просто упирается в край экрана и прокрутка прекращается. Кстати, в нынешней реализации макро Editor.Pos прокрутки вообще не происходит и мы остаёмся в районе 2000 строки, посреди экрана.

По поводу АПИ. В данном примере мы получили то, что хотели. Курсор не двигали, и двигали только прокрутку. Вот она и прокрутилась насколько возможно. Хотели бы курсор в строку 2, сказали бы так: EditorControl(ECTL_SETPOSITION,{2,-1,-1,1,-1,-1}). Сначала курсор в строку 2 (при этом топскрин автоматически выставится в 2), а затем топскрин устанавливаем в 1.
Может кому пригодится.
User avatar
Centaur
Posts: 1083
Joined: Tue 05 Apr, 2005 20:09
Location: Novosibirsk, Russia
Been thanked: 2 times

Re: Горизонтальная прокрутка в редакторе

Post by Centaur »

Во-первых, хорошо бы это оПисать.

А во-вторых, как-то неочевидно работает Editor.Pos(1, 5) в присутствии Tab’ов:

Code: Select all

$If (flock(2, -1) == 1) Editor.Pos(1, 5, Editor.Pos(0, 5) - 1) $Else $AKey $End
Ожидается: жмём Left, редактор прокручивается на один символ.
Наблюдается: если слева от курсора обычный символ, то всё нормально; если Tab, прокручиваемся на размер Tab’а.
sysadm-nk-resurs
Posts: 71
Joined: Tue 29 Dec, 2009 19:16

Некорректная работа функции Editor.Pos

Post by sysadm-nk-resurs »

Far Manager, version 2.0 (build 1579) x86

N=Editor.Pos(Op, What[, Where])

Функция неправильно устанавливает позицию курсора в строке, если до этой позиции встречаются символы табуляции - ставит курсор в позицию больше указанной.
Закономерность сумел уловить только если табуляции находятся в начале строки. В этом случае увеличение позиции курсора происходит на 7 на каждую табуляцию; причём у меня размер табуляции установлен 8.
Если табуляции перемежаются другими символами, то регулярности в увеличении позиции курсора нет (точнее - не заметил).
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Горизонтальная прокрутка в редакторе

Post by John Doe »

Skirda wrote:
Toxa wrote: 4. (wish)
Editor.Pos(1, 4, %a) — оставляет курсор в текущей строке
Editor.Pos(1, 5, %a) — перемещает курсор на столько же позиций, на сколько сдвинули прокрутку. Можно этого не делать? При желании всегда можно написать макрос.
4. сдвиг курсора делал по аналогии с Ctrl-Up/Down... надо подумать
Centaur wrote:[...] как-то неочевидно работает Editor.Pos(1, 5) в присутствии Tab’ов:

Code: Select all

$If (flock(2, -1) == 1) Editor.Pos(1, 5, Editor.Pos(0, 5) - 1) $Else $AKey $End
Ожидается: жмём Left, редактор прокручивается на один символ.
Наблюдается: если слева от курсора обычный символ, то всё нормально; если Tab, прокручиваемся на размер Tab’а.
В итоге:
Предложение Toxa не изменять позицию курсора при изменении LeftPos осталось без внимания.
Нехорошо, т.к. отличается от поведения при изменении TopScreenLine.
Но замысел всё же понятен: смещать курсор синхронно с левой границей экрана.

Всё бы ничего, но по замечанию Centaur были внесены изменения, и при наличии табов движение получается несинхронным.

В общем сделали из функции какую-то чупакабру...
Не знаю стоит ли править, но документировать хотя бы.


P.S.
В энциклопедии: 4 новая строка вверху экрана.
Не согласуется с остальными описаниями:
Post Reply

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