Virtual string wrap

Здесь обсуждается всё, что касается макросов.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Re: Virtual string wrap

Post by IgorZ »

Latest post of the previous page:

AleXH wrote:IgorZ
Разве нельзя при свётке текущую позицию курсора разделить на ширину экрана, тогда целое покажет вертикальный сдвиг курсора для этой строки, а остаток горизонтальный. Затем сдвинуть экран влево до упора и выставить курсор? При разворачивании восстановить позицию курсора.
Это всё делается, кроме сдвига экрана влево/вправо. Сдвиг добавлю.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Re: Virtual string wrap

Post by IgorZ »

Новая версия: 0.6 - исправлено (вроде бы) позиционирование экрана при свёртке/развёртке. Проверяйте.
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: Virtual string wrap

Post by AleXH »

Проверил, уже лучше, но не идеально.

Правильный алгоритм видимо такой:
Свёртка. Запоминаются текущие координаты курсора и окна, затем выполняется свёртка, экран сдвигается влево с тем, чтобы весь текст оказался внутри окна, курсор позиционируется по остатку от деления исходной позиции курсора на ширину окна, вертикальная позиция ... ну вы знаете лучше меня :)

Развёртка. Текст разворачивается, окну и курсору восстанавливают старую позицию.

На текущий момент 0.6 неправильно позиционирует курсор, если он стоял не в конце строки.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Re: Virtual string wrap

Post by IgorZ »

AleXH wrote:Проверил, уже лучше, но не идеально.

Правильный алгоритм видимо такой:
Свёртка. Запоминаются текущие координаты курсора и окна, затем выполняется свёртка, экран сдвигается влево с тем, чтобы весь текст оказался внутри окна, курсор позиционируется по остатку от деления исходной позиции курсора на ширину окна, вертикальная позиция ... ну вы знаете лучше меня :)
Ну, в общем-то примерно так оно и делается, за исключением того, что вертикальную позицию Far и сам неплохо рассчитывает.
AleXH wrote:Развёртка. Текст разворачивается, окну и курсору восстанавливают старую позицию.
А ничего, что свёрнутый файл некоторое время редактировался, и понятие "старая позиция" в общем случае вообще не имеет смысла?
AleXH wrote:На текущий момент 0.6 неправильно позиционирует курсор, если он стоял не в конце строки.
Конкретнее, пожалуйста. Желательно с предоставлением тестового файла, точной последовательности действий и ожидаемой ошибки.
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: Virtual string wrap

Post by AleXH »

Тестовый файл, например сам EditWrap.lua.

Code: Select all

На текущий момент 0.6 неправильно позиционирует курсор, если он стоял не в конце строки.
Прошу прощения, видимо бес попутал, сегодня всё нормально, и ведь Фар после обновления скрипта перезапускал... или всё же забыл?
Одним словом сейчас позиция курсора всегда на одном и том же символе - гуд.

Из пожеланий:
Возможно ли восстанавливать после свёртки (действие свернуть-развернуть, с целью просмотра, т.е. без перемещения курсора и редактирования) точно в то же положение, как было до свёртки? Либо позиционировать её на 1/3 высоты экрана как при свёртке, так и при развёртке, чтобы был виден текст вокруг. Сейчас строка переносится в самый верх экрана и что находится над ней - не видно.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Re: Virtual string wrap

Post by IgorZ »

AleXH wrote:Тестовый файл, например сам EditWrap.lua.

Code: Select all

На текущий момент 0.6 неправильно позиционирует курсор, если он стоял не в конце строки.
Прошу прощения, видимо бес попутал, сегодня всё нормально, и ведь Фар после обновления скрипта перезапускал... или всё же забыл?
Одним словом сейчас позиция курсора всегда на одном и том же символе - гуд.
Бывает...
AleXH wrote:Из пожеланий:
Возможно ли восстанавливать после свёртки (действие свернуть-развернуть, с целью просмотра, т.е. без перемещения курсора и редактирования) точно в то же положение, как было до свёртки? Либо позиционировать её на 1/3 высоты экрана как при свёртке, так и при развёртке, чтобы был виден текст вокруг. Сейчас строка переносится в самый верх экрана и что находится над ней - не видно.
Думаю, второй вариант (1/3) универсальнее и логичнее. Сделаю.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Re: Virtual string wrap

Post by IgorZ »

Новогодние праздники не способствуют работе. Увы.

Вот, наконец, новая версия 0.61. Изменения: если курсор в самом верху или низу экрана, текст на экране по возможности сдвигается.
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

Re: Virtual string wrap

Post by ccaid »

с undo скрипт очень не дружит.
включаем свертку строк, впечатываем пару слов где-то внутри текста, нажимаем CtrlZ — вместо отмены ввода начинает частично отменяться свертка.
можно еще проще: включаем свертку строк, нажимаем CtrlZ — вместо отмены целиком всей свертки, начинает отменяться свертка отдельных строк, причем с перевыполнением, в конце концов текст оказывается состоящим из двух строк.
это только у меня так получается? или никто не пользуется undo?
Фар делают добрые люди
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Virtual string wrap

Post by zg »

ccaid wrote:это только у меня так получается? или никто не пользуется undo?
на маленьких файлах проблема сохраняется?
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

Re: Virtual string wrap

Post by ccaid »

обнаружено на тестовом файле в несколько килобайт. широких исследований не проводил.
Фар делают добрые люди
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Virtual string wrap

Post by zg »

да, когда свёртка активна, ундо портит текст при попытке отката изменений свёртки.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Virtual string wrap

Post by citRiks »

Было бы вполне решаемо, если бы был доступ через АПИ (из Луа) к массиву операций Undo/Redo,
которые в том или ином виде всяко уже есть унутри.
Например:

Code: Select all

editor.DoneChanges = Array<EditorChange>()
..
struct EditorChange {
	line_num: int; // changed line number
	line_pos: int; // changed characters start location
	op_type: {char_insert, char_delete, line_break, ...} // done operation type
	char_new: string
	// <more, and whatever needed if needed here >
}
на сами операции враппинг же замораживать в макросе типа так:
editor.ChangeStackDisable(true)
и корректировать структуры стэка (прошлые изменения) в соответсвии с новой реальностью
ну в целом надо научить редактор (и\или changes history) разделять виртуальные переносы строки и реальные,
что не сложно если есть доступ к ChangeStack.
Last edited by citRiks on Fri 28 Feb, 2020 09:10, edited 3 times in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Virtual string wrap

Post by citRiks »

еще соображения такие.
Реализация выглядит элементарщиной
(На всякий случай отмечу, что "элементарность" не означает что это можно за 15 минут начиркать)

1.) Перехватывать операции Undo/Redo (CtrlZ/CtrlY) макросами, и в макросе же вести журнал этих операций
Вроде несложно, и наверное, для простоты, не посимвольно, а построчно, т.е. хранить изменную строку целиком.
2.) Отключить для данного экземпляра редактора его "нативный" (внутренний) журнал измений.
Если этой отключки еще нет в АПИ, то добавить думаю что будет легко до безобразия, - ломать ведь это не строить.
Post Reply

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