Latest post of the previous page:
http://bugs.farmanager.com/view.php?id=1142Editor.Pos
Re: Горизонтальная прокрутка в редакторе
тестируем
Синтаксис:
Пример (при включенном ScrollLock клавиши Left/Right занимаются скроллллингом)
Синтаксис:
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)
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!
So Say We All!
Re: Горизонтальная прокрутка в редакторе
Спасибо - пока полет нормальный !
Я ещё добавил:
А можно ещё добавить функцию, возвращающую максимальную длину строки в редакторе ?
Я ещё добавил:
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. ©
To ban or not to ban, that is the question. ©
Re: Горизонтальная прокрутка в редакторе
которую - максимальную из тех что сейчас на экране? или вообще у текущего файла?DAtaMan wrote:А можно ещё добавить функцию, возвращающую максимальную длину строки в редакторе ?
ошибка — считать, что фар для пользователей. (с) zg
Re: Горизонтальная прокрутка в редакторе
У текущего файла. Тогда легко можно будет скроллировать до конца самой длинной строки.
P.S. Хотя как вариант примерно так:
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. ©
To ban or not to ban, that is the question. ©
Re: Горизонтальная прокрутка в редакторе
супер
упрощенный вариант приведенного примера служит заменой гор. скроллинга EditCrutch'а:
упрощенный вариант приведенного примера служит заменой гор. скроллинга 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
Фар делают добрые люди
Re: Горизонтальная прокрутка в редакторе
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) — перемещает курсор на столько же позиций, на сколько сдвинули прокрутку. Можно этого не делать? При желании всегда можно написать макрос.
Прокомментировал на Мантисе относительно 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) — перемещает курсор на столько же позиций, на сколько сдвинули прокрутку. Можно этого не делать? При желании всегда можно написать макрос.
Может кому пригодится.
Re: Горизонтальная прокрутка в редакторе
1. ну так set ведь успешно выполнен!
2. поправлю
3. при большом количестве строк... тормоза будут
4. сдвиг курсора делал по аналогии с Ctrl-Up/Down... надо подумать
2. поправлю
3. при большом количестве строк... тормоза будут
4. сдвиг курсора делал по аналогии с Ctrl-Up/Down... надо подумать
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
Re: Горизонтальная прокрутка в редакторе
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. Или как раз из-за такой логики будут тормоза?
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. Или как раз из-за такой логики будут тормоза?
Может кому пригодится.
Re: Горизонтальная прокрутка в редакторе
1. гляну.
3. теперь понятно. я сначала подумал про весь текст
3. теперь понятно. я сначала подумал про весь текст
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
Re: Горизонтальная прокрутка в редакторе
Так...
Editor.Pos "паразитирует" на вызове EditorControl. Похоже здесь бага, древняя как сам Мир.
Если плагин вызывает EditorControl(ECTL_SETPOSITION,{-1,-1,-1,1,-1,-1}) - т.е. хотим выставить только топскрин, но при этом, скажем стоим где-то в районе 2000 строки (посреди экрана), то... вместо ожидаемого "строка 2 вверху экрана" получаем: 2000 строка вместе с курсором внизу экрана, а "топом" становится 1978 (консоль 80x25).
Ideas? (не только по макросам, но и касаемо АПИ!)
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!
So Say We All!
Re: Горизонтальная прокрутка в редакторе
ИМХО оно так и должно работать. Что такое скролл в GUI? Это когда курсор сохраняет свою позицию в тексте, а меняется только положение прокрутки. Поскольку Фар не умеет ставить курсор за пределами экрана (такой он есть и таким мы его любим), курсор просто упирается в край экрана и прокрутка прекращается. Кстати, в нынешней реализации макро Editor.Pos прокрутки вообще не происходит и мы остаёмся в районе 2000 строки, посреди экрана.
По поводу АПИ. В данном примере мы получили то, что хотели. Курсор не двигали, и двигали только прокрутку. Вот она и прокрутилась насколько возможно. Хотели бы курсор в строку 2, сказали бы так: EditorControl(ECTL_SETPOSITION,{2,-1,-1,1,-1,-1}). Сначала курсор в строку 2 (при этом топскрин автоматически выставится в 2), а затем топскрин устанавливаем в 1.
По поводу АПИ. В данном примере мы получили то, что хотели. Курсор не двигали, и двигали только прокрутку. Вот она и прокрутилась насколько возможно. Хотели бы курсор в строку 2, сказали бы так: EditorControl(ECTL_SETPOSITION,{2,-1,-1,1,-1,-1}). Сначала курсор в строку 2 (при этом топскрин автоматически выставится в 2), а затем топскрин устанавливаем в 1.
Может кому пригодится.
- Centaur
- Posts: 1083
- Joined: Tue 05 Apr, 2005 20:09
- Location: Novosibirsk, Russia
- Been thanked: 2 times
Re: Горизонтальная прокрутка в редакторе
Во-первых, хорошо бы это оПисать.
А во-вторых, как-то неочевидно работает Editor.Pos(1, 5) в присутствии Tab’ов:
Ожидается: жмём Left, редактор прокручивается на один символ.
Наблюдается: если слева от курсора обычный символ, то всё нормально; если Tab, прокручиваемся на размер Tab’а.
А во-вторых, как-то неочевидно работает 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
Наблюдается: если слева от курсора обычный символ, то всё нормально; если Tab, прокручиваемся на размер Tab’а.
-
- Posts: 71
- Joined: Tue 29 Dec, 2009 19:16
Некорректная работа функции Editor.Pos
Far Manager, version 2.0 (build 1579) x86
N=Editor.Pos(Op, What[, Where])
Функция неправильно устанавливает позицию курсора в строке, если до этой позиции встречаются символы табуляции - ставит курсор в позицию больше указанной.
Закономерность сумел уловить только если табуляции находятся в начале строки. В этом случае увеличение позиции курсора происходит на 7 на каждую табуляцию; причём у меня размер табуляции установлен 8.
Если табуляции перемежаются другими символами, то регулярности в увеличении позиции курсора нет (точнее - не заметил).
N=Editor.Pos(Op, What[, Where])
Функция неправильно устанавливает позицию курсора в строке, если до этой позиции встречаются символы табуляции - ставит курсор в позицию больше указанной.
Закономерность сумел уловить только если табуляции находятся в начале строки. В этом случае увеличение позиции курсора происходит на 7 на каждую табуляцию; причём у меня размер табуляции установлен 8.
Если табуляции перемежаются другими символами, то регулярности в увеличении позиции курсора нет (точнее - не заметил).
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Горизонтальная прокрутка в редакторе
Skirda wrote:4. сдвиг курсора делал по аналогии с Ctrl-Up/Down... надо подуматьToxa wrote: 4. (wish)
Editor.Pos(1, 4, %a) — оставляет курсор в текущей строке
Editor.Pos(1, 5, %a) — перемещает курсор на столько же позиций, на сколько сдвинули прокрутку. Можно этого не делать? При желании всегда можно написать макрос.
В итоге:Centaur wrote:[...] как-то неочевидно работает Editor.Pos(1, 5) в присутствии Tab’ов:Ожидается: жмём Left, редактор прокручивается на один символ.Code: Select all
$If (flock(2, -1) == 1) Editor.Pos(1, 5, Editor.Pos(0, 5) - 1) $Else $AKey $End
Наблюдается: если слева от курсора обычный символ, то всё нормально; если Tab, прокручиваемся на размер Tab’а.
Предложение Toxa не изменять позицию курсора при изменении LeftPos осталось без внимания.
Нехорошо, т.к. отличается от поведения при изменении TopScreenLine.
Но замысел всё же понятен: смещать курсор синхронно с левой границей экрана.
Всё бы ничего, но по замечанию Centaur были внесены изменения, и при наличии табов движение получается несинхронным.
В общем сделали из функции какую-то чупакабру...
Не знаю стоит ли править, но документировать хотя бы.
P.S.
В энциклопедии:
4 новая строка вверху экрана
.Не согласуется с остальными описаниями: