Вставка строки в редакторе

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Вставка строки в редакторе

Post by buniak_a_h »

Помогите, пожалуйста, написать макрос (из одной строки), вставляющий строку перед первой.
Editor.InsStr('qqq', 1 ) вставляет вторую строку
Editor.InsStr('qqq', 0 ) вставляет строку в текущую позицию
Тупик? Или нужно явно перейти в начало файла и вставлять в текущую? Очень не хочется (терять место в файле, образовывать bookmark-и...). Неужели такое не предусмотрено???
Last edited by buniak_a_h on Fri 26 Jan, 2018 23:43, edited 1 time in total.
Shmuel
Posts: 6218
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 349 times

Вставка строки в редакторе

Post by Shmuel »

Я обычно пользуюсь editor.InsertString, но она также предполагает предварительную установку позиции.
Да, это может быть неудобно в каких-то случаях и потребовать дополнительных телодвижений.
ernest
Posts: 4
Joined: Tue 05 Jan, 2021 19:03

Lua FAR, редактор. Нельзя вставить первую строку

Post by ernest »

Editor.InsStr('бла', 1) -- добавляет вторую строку, первую добавить нельзя.

Причём сообразно описанию
https://api.farmanager.com/ru/macro/mac ... ditor.html
"Вставить значение S после строки с номером Line. Если S не указан, то вставляется пустая строка. Если Line не указан или меньше 1, то вставляется в текущую строку".
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Lua FAR, редактор. Нельзя вставить первую строку

Post by buniak_a_h »

Я как-то уже спрашивал; см. здесь
ernest
Posts: 4
Joined: Tue 05 Jan, 2021 19:03

Вставка строки в редакторе

Post by ernest »

То есть это неудобная функция. Давайте её выбросим, чтобы пользователи не тратили время на отладку системы с несуразностями.

Суть моего предложения: не можете сделать хорошо, не делайте. Предлагаю исключить функцию Editor.InsStr.
User avatar
John Doe
Бюрократ
Posts: 13075
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 42 times
Been thanked: 319 times

Вставка строки в редакторе

Post by John Doe »

ernest wrote: Sat 16 Jan, 2021 13:37 Предлагаю исключить функцию Editor.InsStr.
Собственно можете считать её уже исключённой, вместе со всеми остальными функциями макро апи (из таблиц с заглавной буквы).
Считайте что они до сих пор существуют из соображений совместимости.

Вместо этого используйте функции апи плагинов.
https://t.me/FarManager — Telegram чат
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Вставка строки в редакторе

Post by citRiks »

тут надо сделать враппер для ИнсСтр/ИнсертСтринг я щитаю.
По аналогии с враппером для УТФ8 @БАХ
Который бы унутри себя бы делал логичную реализацию,
типа если параметр ноль то вставлять в начало как-нибудь уж.
а для current line чтобы был -1 или НИЛ
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Вставка строки в редакторе

Post by buniak_a_h »

John Doe wrote: Sat 16 Jan, 2021 13:43 Вместо этого используйте функции апи плагинов.
Стесняюсь спросить… Может, я чего-то до сих пор не знаю? А какая функция из апи плагинов реализует поставленную задачу (вставку строки в начало непустого файла)?
Ну и вдогоночку.
А какая функция из апи плагинов возвращает количество строк редактора (то, что возвращает Editor.Lines)? Выдирать из editor.GetInfo.TotalLines? Как-то некрасиво…
Last edited by buniak_a_h on Sat 16 Jan, 2021 16:21, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13075
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 42 times
Been thanked: 319 times

Вставка строки в редакторе

Post by John Doe »

buniak_a_h wrote: Sat 16 Jan, 2021 16:15 (вставку строки в начало непустого файла)?
Я не утверждаю что это делается одной командой (но никто не мешает для частоиспользуемой команды и самостоятельно функцию-враппер добавить).
Человек жалуется что макроапи нелогично, а я отвечаю что да, мы знаем. Возьмите апи плагинов, как более стройное (но и более низкоуровневое).
buniak_a_h wrote: Sat 16 Jan, 2021 16:15 А какая функция из апи плагинов возвращает количество строк редактора (то, что возвращает Editor.Lines)? Выдирать из editor.GetInfo.TotalLines? Как-то некрасиво…
Как правило количество строк это не единственный параметр, который требуется для выполнения задачи, поэтому получения всех одним махом (editor.GetInfo) вполне оправданно.
Но я и с вами соглашусь: теоретически можно создать внутренне согласованное интуитивно-понятное и всячески прекрасное апи высокого уровня, в котором будет Editor.Lines (и прочее). И будет суперудобно, во много раз лучше чем сейчас.

Но для этого всё равно придётся поломать текущее макроапи (которое изначально не было грамотно спроектировано, и поэтому развивалось хаотично).
https://t.me/FarManager — Telegram чат
ernest
Posts: 4
Joined: Tue 05 Jan, 2021 19:03

Вставка строки в редакторе

Post by ernest »

local function insline(n, s) -- Вставить содержимое s в начало строки с номером n.
if not n or n == 0 then n = Editor.CurLine end; if not s then s = '\n' end -- Умолчания.
Editor.Pos(1, 2, 1) -- В начало строки.
Editor.Pos(1, 1, n) -- На строку номер n.
print(s) -- Вставить s, включая знаки конца строки в ней. В начале прежнего текста строки.
end

-- Этот код удовлетворительно заменяет Editor.InsStr. Собственно, и GetStr я теперь избегаю пользоваться.
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Вставка строки в редакторе

Post by buniak_a_h »

ernest, у меня правило: по возможности не использовать Keys и print. Причина: в моменты, для меня совершенно неожиданные, возникает ошибка, связанная с корутинами. Посему мне лично нравится больше вместо тела функции нечто вроде:

Code: Select all

Editor.InsStr(Editor.GetStr(1), 1) -- дублирование первой строки
Editor.SetStr(s, 1) -- замена первой строки на аргумент
Дмитрий Журко
Posts: 48
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 8 times
Been thanked: 1 time

Вставка строки в редакторе

Post by Дмитрий Журко »

Здравствуйте, buniak_a_h, теперь я Дмитрий. Решил, что мне лучше здесь без анонимности.

У меня иные ощущения: API неизвестно когда отладят, глючит, клавиши — навсегда. Это "системные вызовы". Потому предпочитаю Keys('CtrlU'), а не Editor.Sel(4). Это и нагляднее, проще испытать.

Разница между SetStr и print вместе с Keys('CtrLV') в том, что SetStr может вставить знаки конца строки, а редактор это не интерпретирует. Напротив: print работает надёжно, во всём ожидаемо. Включая интерпретацию специальных знаков.

Вот ещё от меня пример:

Code: Select all

Macro { key = 'ShiftBS'; area = 'Common';	description = 'XLat: QWERTY-ЙЦУКЕН выделения или слова и смена языка ввода ОС';
action = function()           
	if Area.Editor then
		if not Object.Selected then Keys('CtrlShiftLeft') end
		if Object.Selected then
			local s = mf.xlat(Editor.SelValue, 1)
			if s and 0 < #s then Editor.Undo(0) Keys('CtrlD') print(s) s = nil Editor.Undo(1) end
		end
	elseif Area.Dialog then
		if not Object.Selected then Keys('CtrlShiftLeft') end
		local s = Dlg.GetValue() local p1 = 1 local p2 = #s
		if Object.Selected then p1 = Editor.Sel(0, 1) p2 = Editor.Sel(0, 3) end
		Editor.Undo(0) Keys('CtrlD') s = mf.xlat(s:sub(p1, p2), 1) print(s) s = nil Editor.Undo(1)
	elseif Area.Shell then
		if not Object.Selected and not Object.Empty then Keys('CtrlShiftLeft') end
		Keys('XLat') if Object.Selected then Editor.Sel(1, 1) end -- Выделение не убираю, так как откатки в коммандной строке нет.
	else Keys('XLat WinSpace') end -- После XLat смена языка ввода средствами ОС Windows 10.
end }
Я решил переписать корректнее старый макрос для xlat. Так, чтобы он работал ожидаемо. И тут помогает именно print. Вышло неожиданно для меня громоздко. Может быть, маловато опыта. Наверное, надо разделить на 4 макроса для областей. Но я, по правде, не могу их уверенно перечислить, зато есть else.
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Вставка строки в редакторе

Post by buniak_a_h »

Дмитрий Журко wrote: Tue 19 Jan, 2021 22:09 API неизвестно когда отладят, глючит, клавиши — навсегда. Это "системные вызовы". Потому предпочитаю Keys('CtrlU'),
1. Вы, видимо, ещё не нарывались на вылет содержащий текст acros yeld. В частности, Keys вызывает такое в condition.
2. Конкретно это АПИ уже, видимо, не отладят никогда, т.к. считается устаревшим, сохранено для совместимости. Но можно использовать функции из таблицы editor:

Code: Select all

local Info=editor.GetInfo(nil); Info.CurLine = Info.CurLine + 1; Info.TopScreenLine = Info.TopScreenLine + 1
editor.SetPosition(nil,1,1)
editor.InsertText(nil, s..'\n')
editor.SetPosition(nil, Info)
Last edited by buniak_a_h on Tue 19 Jan, 2021 22:34, edited 1 time in total.
Post Reply

Return to “Нужна помощь”