Скрипт для нумерации линий в редакторе, больше как демонстрация необходимости нормального Always-on-Top

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Скрипт для нумерации линий в редакторе, больше как демонстрация необходимости нормального Always-on-Top

Post by citRiks »

Скрипт для нумерации линий в редакторе,
больше как демонстрация необходимости нормального Always-on-Top,
или управления размером открытого редактора.

Скрипт неплох, например учитывает наличие/отсутствие скроллбара, отмечает текущую линию иным цветом.

Недостатки:
1.) Моргает при любом движении в редакторе (необходимость перерисовывать при каждом ЕЕ_Redraw)
2.) нумерация неизбежно изза far.Text(...) находится справа, что неудобно.
3.) Даже будучи справа, может заслонять текст

Пути решения через АПИ ФАРа (нет на данный момент):

1.) Изменение размера редактора на лету
Тогда уменьшаем редактор по ширине на нужную ширину полей, в полях рисуем фар.Текстом(..) все что нужно.
В полях - это за пределами редактора, поэтому не нужно никакого ЕЕ_Redraw, как нарисовали,
так и будет нарисовано, - моргать не будет, эпилептики спасены!

1.) Сделать Always-on-Top диалог с нумерацией, ну тут все понятно, диалог моргать не будет,
будет в форме бара высотой с редактор с нумерацией.

ЗДЕСь:
https://github.com/dr-dba/far-lua-edito ... t-edit-pos
Last edited by citRiks on Sat 08 May, 2021 21:17, edited 5 times in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Скрипт для нумерации линий в редакторе, больше как демонстрация необходимости нормального Always-on-Top

Post by citRiks »

Отмечу вот что, моргание происходит изза Redraw().
A Redraw() создает колорер, даже при отсутствии телодвижений юзера или изменений ФАРа.
А создает он эти евенты, потому что на больших файлах не успевает прямо сразу все отрисовать,
и потом в фоне дорисовывает у себя то что остается за кадром.
Делать ему это надо, потому что там за кадром могут быть скобки, и прочее что надо просчитать для отисовки.
Так что это, в принципе, не баг.
И на открытом файле, через время в зависимости от размера файла, это моргание исчезает.
User avatar
Taciturn
Posts: 600
Joined: Thu 26 May, 2005 17:14
Location: Санкт-Петербург
Has thanked: 89 times
Been thanked: 31 times
Contact:

Скрипт для нумерации линий в редакторе, больше как демонстрация необходимости нормального Always-on-Top

Post by Taciturn »

citRiks wrote: Fri 05 Jun, 2020 16:12 И на открытом файле, через время в зависимости от размера файла, это моргание исчезает.
А нельзя ли где-нибудь проценты готовности рисовать?
User avatar
ctapmex
Posts: 1240
Joined: Fri 11 Apr, 2008 07:53
Has thanked: 1 time
Been thanked: 50 times

Скрипт для нумерации линий в редакторе, больше как демонстрация необходимости нормального Always-on-Top

Post by ctapmex »

если 23 строку заменить на

Code: Select all

local line_num_final = math.min(ei.TopScreenLine + ei.WindowSizeY- (band(ei.Options, F.EOPT_SHOWTITLEBAR) == 0 and 0 or 1), ei.TotalLines)
то будет еще получше
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Скрипт для нумерации линий в редакторе, больше как демонстрация необходимости нормального Always-on-Top

Post by citRiks »

ctapmex, спасибо, принимается :) да, не моргает теперь даже на больших файлах, что вообще круто
поменял в заголовке с учетом предложенных изменений, плюс некоторая косметика
косметика в том что столбец с нумерацией не шире самого числа
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Скрипт для нумерации линий в редакторе, больше как демонстрация необходимости нормального Always-on-Top

Post by citRiks »

Taciturn wrote: Sat 06 Jun, 2020 12:48
citRiks wrote: Fri 05 Jun, 2020 16:12 И на открытом файле, через время в зависимости от размера файла, это моргание исчезает.
А нельзя ли где-нибудь проценты готовности рисовать?
Идея хорошая, это вопрос к Колореру
ctapmex, что скажете?
Т.е., нельзя ли получить какой-то API который дает статус готовности в процентах?
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Скрипт для нумерации линий в редакторе, больше как демонстрация необходимости нормального Always-on-Top

Post by citRiks »

Произведено несущественное обновление, в заголовке.
Больше как повод отметить, что оказывается что для уже открытого редактора нет никакого официального способа ни получить координаты редактора, ни тем более задать ее.
Поэтому рисование нумерации справа при любом "нестандартном" (с заданными координатами) открытии редактора неизбежно будет кривым.
У себя я это решил такими способами:
1.) См. приаттаченный здесь архив с макросом - частичное костыльное решение, но во многих сценариях прокатит.
ЗДЕСь:
https://github.com/dr-dba/far-lua-edito ... t-edit-pos
2.) Скачал исходники ФАРа, сделал там editor.GetCoord(...) + editor.SеtCoord(...),
это полное решение рабочее решение, но только в своем личном билде
Last edited by citRiks on Sat 08 May, 2021 21:18, edited 2 times in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Скрипт для нумерации линий в редакторе, больше как демонстрация необходимости нормального Always-on-Top

Post by citRiks »

citRiks wrote: Tue 08 Sep, 2020 21:42 Больше как повод отметить, что оказывается что для уже открытого редактора нет никакого официального способа ни получить координаты редактора, ни тем более задать ее.
На самом деле можно, отталкиваясь от ACTL_GETCURSORPOS,
несколько окольным путем получаем координату и геометрию окна редактора:

Code: Select all

function Xer0X.fnc_cons_edit_curs_geomtr(editor_id, edit_info, curs_pstn, cons_rect)
	edit_info = edit_info or editor_GetInfo(editor_id)
	if not edit_info then return end
	curs_pstn = curs_pstn or far_AdvControl(ACTL_GETCURSORPOS)
	cons_rect = cons_rect or far_AdvControl(ACTL_GETFARRECT)
	local tbl_rtvl = {
		cons_rect	 = cons_rect,
		curs_pstn	 = curs_pstn,
		edit_info	 = edit_info,
		DPosX	= math_max(curs_pstn.X - (edit_info.CurTabPos	+ 0 - edit_info.LeftPos		), 0),
		DPosY	= math_max(curs_pstn.Y - (edit_info.CurLine	+ 0 - edit_info.TopScreenLine	), 0),
		DSizeX	= math_max(cons_rect.Right	- cons_rect.Left+ 1 - edit_info.WindowSizeX,	0),
		DSizeY	= math_max(cons_rect.Bottom	- cons_rect.Top	+ 1 - edit_info.WindowSizeY,	0),
	}
	tbl_rtvl.EPosX = math_max(tbl_rtvl.DSizeX - tbl_rtvl.DPosX, 0)
	tbl_rtvl.EPosY = math_max(tbl_rtvl.DSizeY - tbl_rtvl.DPosY, 0)
	tbl_rtvl.EPosX1= tbl_rtvl.DPosX
	tbl_rtvl.EPosY1= tbl_rtvl.DPosY					- (bit64_band(edit_info.Options, EOPT_SHOWTITLEBAR)== EOPT_SHOWTITLEBAR	and 1 or 0)
	tbl_rtvl.EPosX2= tbl_rtvl.EPosX1 + edit_info.WindowSizeX - 1	+ (bit64_band(edit_info.Options, EOPT_SHOWSCROLLBAR)==EOPT_SHOWSCROLLBAR and 1 or 0)
	tbl_rtvl.EPosY2= tbl_rtvl.EPosY1 + edit_info.WindowSizeY - 1	+ (bit64_band(edit_info.Options, EOPT_SHOWKEYBAR ) == EOPT_SHOWKEYBAR	and 1 or 0)
	return tbl_rtvl
end
Эта функция сидит уже в модуле:
https://github.com/dr-dba/far-lua-general-utils
В этом скрипте рисования нумерации линий уже используется.
Кстати, в том же скрипте есть полезный макрос возвращения к месту последнего редактривания.
Post Reply

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