Макросы для редактора Журко

Здесь обсуждается всё, что касается макросов.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

Почти всё переписал. Многое упростилось, сказывается опыт. Стало точнее, но новых возможностей пока почти нет, потому что хочу выйти на уровень, который называют продуктом. Ближайший план: сделать меню по предложению ув. Ann и перейти, наверное, на поиск слов вручную, минуя F7. Чтобы не мешать ручные и автоматические настройки поиска. Вообще, поиск, это то, куда хочу углубиться. Очередная замена обычному поиску грядёт...
---------------------
Пока вместо настоящего меню советую вызывать MacroBrowser. У меня это делает макрос Ctrl`.lua. Меню mbrowser довольно наглядное, можно нажать Ctrl+H, чтобы отображались только те макросы, которые работают в действующем окружении. Там есть справка и сортировки.
---------------------
Чего бы хотелось здесь: обсуждение этого кода и особенно — его применения. Мнения тех, кто не читал и не использовал, странны, а приговоры автору невозможны. То есть тут критики сообщают что-то о себе, что я постараюсь забыть, я умею. Наоборот, даже просто ощущения и общее мнение об использовании тут уместны. Баг репорты не требуются, уж как-нибудь сам пока. Могу помочь написать что-то.

Но всем спасибо за обсуждения. Они порождают идеи. Теперь я записываю замечания к системе, чтобы когда-то их оформить в bug report. Даже жаль, что многое не помню, с чем сначала мучился. Это важный для отладки среды опыт.

1. Несколько скриптов для замены не вполне совершенных из %FARHOME%\Addons\Macros. На сей раз вполне отлаженных и двуязычных.
ShiftBS.lua Shell.AltBS.lua Shell.Alt=.lua
Сразу их код для тех, кто ставить не будет, но почитал бы (я бы так сделал):
  1. -- coding: utf-8
  2.  
  3. -- Устанавливает папку неактивной панели как у активной, указывает на тот же файл.
  4.  
  5. -- Работает для погашенной или не файловых панелей.
  6.  
  7.  
  8.  
  9. local MSG = { { 'same inactive panel' }, Rus = { 'та же папка рядом' }, }
  10.  
  11. local LNG = Far.GetConfig('Language.Help').sub(1, 3); MSG = MSG[LNG] and MSG[LNG] or MSG[1] -- Язык определяется однажды при загрузке макроса.
  12.  
  13.  
  14.  
  15. Macro { key = 'Alt='; area = 'Shell'; description = MSG[1]; action = function()
  16.  
  17.         if not APanel.Visible or APanel.Current:len() <= 0 then return end
  18.  
  19.         local path = far.ConvertPath(APanel.Current)
  20.  
  21.         Panel.SetPath(1, mf.fsplit(path, 1 + 2), mf.fsplit(path, 4 + 8))
  22.  
  23.         if not PPanel.Visible then Keys('CtrlQ')
  24.  
  25.         end -- Не знаешь что делать с панелью? Жми Ctl+Q, пока не заработает!
  26.  
  27.         for _ = 1, 2 do if not PPanel.FilePanel then Keys('CtrlQ') end
  28.  
  29.         end
  30.  
  31.     end
  32.  
  33. }
  34.  
  35.  
  36.  
  37. -- coding: utf-8
  38.  
  39. local MSG = { { 'folder back' }, Rus = { 'назад в папку' }, }
  40.  
  41. local LNG = Far.GetConfig('Language.Help').sub(1, 3); MSG = MSG[LNG] and MSG[LNG] or MSG[1] -- Язык определяется однажды при загрузке макроса.
  42.  
  43.  
  44.  
  45. local altbs
  46.  
  47. Macro { key = 'AltBS'; area = 'Shell'; description = MSG[1]; action = function()
  48.  
  49.         Keys('AltF12')
  50.  
  51.         altbs = Object.CurPos == Object.ItemCount and not altbs
  52.  
  53.         Keys((altbs and '' or 'Up')..' ShiftEnter')
  54.  
  55.     end
  56.  
  57. }
  58.  
  59.  
  60.  
  61. -- coding: utf-8
  62.  
  63. local MSG = { { 'Xlat' }, Rus = { 'Xlat: QWERTY-ЙЦУКЕН выделения или слова и смена языка ввода ОС' }, }
  64.  
  65. local LNG = Far.GetConfig('Language.Help').sub(1, 3); MSG = MSG[LNG] and MSG[LNG] or MSG[1] -- Язык определяется однажды при загрузке макроса.
  66.  
  67.  
  68.  
  69. Macro { key = 'ShiftBS'; area = 'Common'; description = MSG[1]; action = function()
  70.  
  71.         if not Object.Selected then
  72.  
  73.             Keys('SelWord')
  74.  
  75.         end
  76.  
  77.         Keys('Xlat')
  78.  
  79.         mf.xlat('0', 1)
  80.  
  81.     end
  82.  
  83. }
  84.  
  85. -- Для предсказуемой работы xlat можно запустить из командной строки far:config и скопировать ограничители слов редактора
  86.  
  87. -- Editor.WordDiv в соответствующую настройку xlat — XLat.WordDivForXlat, не забыв, правда, оставить пробелы в начале этой настройки xlat.
  88.  
  89. -- Например, такие знаки (без скобок) [[     ~!%^&*()+|{}:"<>?`-=\[];',./]].
2. Скрипт jr.typographic.lua для замены Юникод мнемоник в тексте и для быстрого ввода употребительных, но сложных для набивки знаков, вроде «» или Σ. Полностью локализуется. Но он уже с моими модулями, недостаточно скопировать один файл скрипта.

3. F5.lua, улучшенная замена одноимённого скрипта Editor.ColorWord.moon из %FARHOME%\Addons. Двуязычный.

4. Моя раскладка клавиш и всякая вкуснота в редакторе. Пока только по-русски. Там работа с Colorer, перестановки строк, работа с колоночным блоком, переходы по слову.
jr.F4.Rus.lua

5. Для тех, кому ничего сложного не надо, своё есть, маленький модуль с усовершенствованиями среды LuaFAR.
  1. -- coding: utf-8; tab 8
  2.  
  3. --[[debug]]local function bbb(o, t) Menu.Show(mf.serialize(o):gsub('&', '&&'), t and tostring(t) or '') return o end--]]
  4.  
  5.  
  6.  
  7. function aboriginal (p) -- Процедура, которая упрощает синтаксис настроек языка. Без local, return, { } и пр.
  8.  
  9.     local lng = Far.GetConfig('Language.Help'):sub(1, 3) -- Для неописанных возможностей уместнее язык справки. 3 знака!
  10.  
  11.     local f = mf.fsplit(p, 1 + 2 + 4) .. '\\' .. (lng or 'def') -- Если метка языка не даёт файл, то файл def там же.
  12.  
  13.     local fh = io.open(f)
  14.  
  15.     fh = fh or io.open(mf.fsplit(p, 1 + 2 + 4) .. '\\' .. 'def') -- Настройки в файле path(p)\name(p)\lng
  16.  
  17. if not fh then return end
  18.  
  19.     f = fh:read(99999) fh:close()
  20.  
  21.     f = loadstring(f)
  22.  
  23. if not f then return end
  24.  
  25.     local r = {} -- Глобальные переменные файла настроек попадут в таблицу r.
  26.  
  27.     setfenv(f, r)
  28.  
  29.     f(lng)
  30.  
  31. return r end -- aboriginal (p)
  32.  
  33.  
  34.  
  35. function align (s, t, w, x) if type(w) ~= 'number' then return end --   Повторы строки x между строками s и t усечёные до длины w.
  36.  
  37.     if type(s) ~= 'string' then s = s and tostring(s) or '' end --  s и t не усекаются. Если нет x, x = пробелы.
  38.  
  39.     if type(t) ~= 'string' then t = t and tostring(t) or '' end --  Если w < 0, то x повторяется без усечения и хотя бы раз.
  40.  
  41.     local n = math.abs(w) - s:len() - t:len() --            Тогда длина итога ≤ -w: s и x (1 и более раз) и t.
  42.  
  43.     if type(x) ~= 'string' then x = x and tostring(x) or (' '):rep(n) end -- Использовать:
  44.  
  45. if n <= 0 then return w < 0 and s .. x .. t or s .. t end --        align('AAA', 'bbb', 5)      [AAAbbb].
  46.  
  47.     if x:len() ~= n and 0 < x:len() then --             align('AAA', 'bbb', 10)     [AAA    bbb].
  48.  
  49.         if w < 0 then --                    align('AAA', '', 10, '123') [AAA1231231].
  50.  
  51.             x = x:rep(math.floor(n/x:len())) --     align(nil, nil, 10, -123)   [-123-123-1].
  52.  
  53.         else    x = x:rep(math.ceil(n/x:len())):sub(1, n) --    align('%', '%%', -2, -123)  [%-123%%].
  54.  
  55.         end --                          align('%', '%%', -10, '123')    [%123123%%].
  56.  
  57.     end --                              align('', '', -10, true)    [truetrue].
  58.  
  59. return s .. x .. t end --                       align('', '', 10, true)     [truetruetr].
  60.  
  61.  
  62.  
  63. function pad (s, w, x) if type(w) ~= 'number' then return end -- Добавляю повторы строки x к s, чтобы увеличить общую длину до w.
  64.  
  65. return w < 0 and align('', s, -w, x) or align(s, '', w, x) end -- Если w положительно, то s слева, отрицательно — справа.
  66.  
  67.  
  68.  
  69. function iformat (how, ...) local argv = { ... } -- Стиль Java. Метки преобразования string.format. Если номер арг. не указан, то как прежде.
  70.  
  71.     local function f(p, i, o) i = tonumber(i) return argv[i] and (p .. o):format(argv[i]) or '' end
  72.  
  73. return how:gsub('%f[%%](%%)(%d+)$([-+]?%d*%.?%d*[A-Za-z])', f):format(...) end -- Пример: 'Второй аргумент %2$s поставлен перед первым %1s.'
  74.  
  75.  
  76.  
  77. function cliche (how, argt) -- Предпочёл стиль Format C#, так как он сильнее отличается от Regexp.
  78.  
  79.     local function f(k) return (k:match('^(%d+)$') and argt[tonumber(k)]) or argt[k] or '' end
  80.  
  81. return how:gsub('%f[{]{([%w_]+)}', f):gsub('{{', '{') end -- {{ — экранирование {. Todo: пока тупое экранирование { и нет меток преобразования аргументов.
  82.  
  83.  
  84.  
  85. --Примеры:
  86.  
  87. --msgbox(iformat('(5): %5$-10.10s, (4): %4$-3.3s, (3): %3$8f, (2): %2$s (1): %1$s.', '1AA', '2bb', math.pi, '4looooooong', '5sht'))
  88.  
  89. --msgbox(cliche('(5): {5}, (4): {4}, (3): {3}, (2): {2} (1): {1}.', { '1AA', '2bb', math.pi, '4looooooong', '5sht'), })
  90.  
  91. --msgbox(cliche('{{X}} (E): {{{E}}, (D): {D}, (1): {1}, (B): {B} (A): {A}.', { A = 'AAA', B = 'Bbb', math.pi, D = 'Dlooooooong', E = 'Esht', }))
  92.  
  93.  
  94.  
  95. -- get default metatable for strings:
  96.  
  97. function nocasepatternof (t)
  98.  
  99. return t:gsub('.', function (c) local u, l = c:upper(), c:lower() return u == l and c or '['..u..l..']' end) end
  100.  
  101.  
  102.  
  103. --msgbox(NoCasePatternOf('-- Привет!'))
  104.  
  105.  
  106.  
  107. --EOT /16.02.2021 (o) Дмитрий Журко. Я старался. dm.jurko@gmail.com Сбер 4276 2007 2491 8425
Чтобы установить макрос его надо поместить в файл с кодировкой utf-8 и расширением ".lua". Этот файл надо поместить в папку %FARLOCALPROFILE%\Macros\scripts\ и дать команду "macro: load" в командной строке.

Если скрипт ещё и загружает модуль, то файл с текстом модуля надо поместить в папку %FARLOCALPROFILE%\Macros\modules\
Attachments
jr5.7z
(12.85 KiB) Downloaded 82 times
Last edited by Дмитрий Журко on Sun 21 Feb, 2021 15:40, edited 16 times in total.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

Ещё одно усовершенствование для Addons — сделать пассивную панель с папкой как у файла активной панели. С учётом того что бывает временная панель или панель просмотра.

Code: Select all

Macro { key = 'Alt='; area = 'Shell'; description = 'та же папка рядом'; action = function()
	if not APanel.Visible or APanel.Current:len() <= 0 then return end
	local path, fn = far.ConvertPath(APanel.Current):match('^(.*[/\\])([^/\\]*)$')
	Panel.SetPath(1, path, fn)
	if not PPanel.Visible then Keys('CtrlQ') end
	for _ = 1, 2 do if not PPanel.FilePanel then Keys('CtrlQ') end end
end }
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

Ах, да. Для новичков.

Чтобы установить макрос его надо поместить в файл с кодировкой utf-8 и расширением ".lua". Этот файл надо поместить в папку %FARLOCALPROFILE%\Macros\scripts\ и дать команду "macro: load" в командной строке.

Я вот очень недавно этого не знал и не знал, откуда узнать. Как и многое ещё "простое", но неописанное.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

Верно ли я понимаю, что неопределённое число аргументов функции в LuaFAR не поддержано?
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

Совершенно волшебный макрос из Addons на Moonscript %FARHOME%\Addons\Macros\Editor.ColorWord.moon (ув. zero-gravity, как выяснилось).

Я его переписал, чуть ускорил (тут надо!). Этот макрос неожиданно удобен. Своей работой я доволен.

+ Обновляю пока тут, но вскоре переделаю шапку.

Code: Select all

-- coding: utf-8; tab 8
-- Для установки скопируйте файл в папку %FARLOCALPROFILE%\Macros\scripts\ и командная строка C:\>macro: load
--[[debug]local X = ' x ' local function bb(o, t) local x = X if x then msgbox(t or 'отладка', mf.serialize(o)) end end--]]

local msg = { other = { d = 'Word highlight; the Case option from the Editor: search', t = '│OFF[%s] %s "%s"', ci = 'WORD', cs = 'Word' },
	Russian = { d = 'Подсветить слово; учёт регистра как в Поиске', t = '│ВЫК[%s] %s «%s»', ci = 'СЛОВО', cs = 'Слово' } }
msg = msg[win.GetEnv('FARLANG')] and msg[win.GetEnv('FARLANG')] or msg['other'] -- Язык определяется однажды при загрузке макроса.

local colorid = win.Uuid "507CFA2A-3BA3-4f2b-8A80-318F5A831235"

local f = far.Flags
local color = far.AdvControl(f.ACTL_GETCOLOR, far.Colors.COL_EDITORTEXT)
color.ForegroundColor, color.BackgroundColor = color.BackgroundColor, color.ForegroundColor
local words = { }
local f7insens = true

--[[time debug]local tt = 0--]]

Macro { key = 'F5'; area = 'Editor'; description = msg.d;
action = function()
	local ei = editor.GetInfo()
	local id = ei.EditorID
	if words[id] then
		words[id] = nil
		Editor.SetTitle()
--[[time debug]far.Show(tt) tt = 0--]]
return end
	Keys('F7 Down') local f7insens = Dlg.GetValue() == 0 Keys('Esc') -- Поиск [ ] Учитывать регистр.
	local line = Editor.Value
	local pos = Editor.RealPos
if line:len() + 1 < pos then return end -- В x попадает слово слева и над курсором.
    	local x = '' ..	line	:sub(1, pos - 1)	:match('[%w]*$') ..
			line	:sub(pos)		:match('^[%w]*')
if x:len() < 1 then return end
	if f7insens then x = x:lower() end
	words[id] = { x, f7insens }

	local title = msg.t:format(mf.akey(1, 1), f7insens and msg.ci or msg.cs, x)
        Editor.SetTitle(ei.FileName .. (' '):rep(math.max(1, ei.WindowSizeX - title:len() - ei.FileName:len() - 45)) .. title)
end }

--[[todo: Don't touch that!]]
Event { group = 'EditorEvent';
action = function(id, event, param)
	if event ~= f.EE_REDRAW then
		if event == f.EE_CLOSE then words[id] = nil end
return end
if not words[id] then return end

--[[time debug]local t0 = far.FarClock()--]]
	local mustlower = words[id][2]
	local lite = words[id][1]
	local patt = '%f[%w]' .. lite .. '%f[%W]'
	local ei = editor.GetInfo(id)
	for ln = ei.TopScreenLine, math.min(ei.TotalLines, ei.TopScreenLine + ei.WindowSizeY) do
		local line = editor.GetString(id, ln).StringText
		if mustlower then line = line:lower() end
		local found
		local pos = 0
		repeat
			pos = line:cfind(lite, pos + 1, true) -- Быстрый поиск лексемы.
		if not pos then break end
			found, pos = line:cfind(patt, pos) -- Медленный поиск шаблоном слова.
		if not found then break end
			editor.AddColor(id, ln, found, pos, f.ECF_AUTODELETE, color, 100, colorid)
		until false
	end
--[[time debug]tt = math.max(tt, far.FarClock() - t0)--]]
end }--]]

--EOT /31.01.2021, на основе %FARHOME%\Addons\Macros\Editor.ColorWord.moon Автор: zero-gravity.
--dm.jurko@gmail.com Сбер 4276 2007 2491 8425 (o) Дмитрий Журко
Last edited by Дмитрий Журко on Sun 31 Jan, 2021 19:29, edited 6 times in total.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

По поводу format. Такой код написал, но его можно обобщить. Хотя, конечно, неудобно без arg и arg.n.

Code: Select all

local function format(s, argv)
	s = s:gsub('%f[%%](%%)([0-9]+)$(%d*%.?%d*[AaEefGgcdiouXxqs])',
		function (p, i, o)
			i = tonumber(i)
			if 1 <= i and i <= #argv then return (p..o):format(argv[i]) end
		return '' end)
return s:format(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]) end

-- Использование: format('%5$8.12f X %s X %2$s X %10s', { '123456', '000', '1', '3', math.pi})
-- Как видите, работает только для 9 аргументов и менее.
-- Обратите внимание, что аргументы передаются таблицей, то есть в { }.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

Есть ещё:
1. Ввод юникода в редакторе вместо его мнемоник. Даже с локализацией.
2. Клавиши для работы с Colorer.
3. И вообще, раскладка клавиш для редактора, чтобы сделать его роднее. Поиск слова и прочие перестановки строк.

Подожду отклика. Если что, никому не занятно, я дальше по плану писать. ColorWord настоятельно советую...
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Макросы для редактора Журко

Post by citRiks »

Дмитрий Журко wrote: Fri 29 Jan, 2021 21:30 ColorWord настоятельно советую...
Есть такой колор-ворд:
viewtopic.php?f=6&t=3733
(там в конце @ЗГ на муне написал)
с ним как за основу написан такой:
https://github.com/dr-dba/far-lua-editor-color-word
Единственный недостаток, надо чтобы по выделению нового слова и нажатию Ф5,
макрос "забывал" про прежнее слово, а так он идет по циклу с нажатиями:
"нечувствительно к регистру"==>>"чувствительно"==>>"как регулярное выражение"==>>"перестать выделят светом"
(Наверное непонятно сказал, но вряд ли это очень важно)
Все хочу исправить это, но руки не доходят.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

citRiks wrote: Fri 29 Jan, 2021 21:59..(там в конце @ЗГ на муне написал)
с ним как за основу написан такой:
https://github.com/dr-dba/far-lua-editor-color-word
О, спасибо. Уважаемый zero-gravity и есть автор исходного текста. Отличная идея и удовлетворительное воплощение. Остальное посмотрю. В Addons попал только познавательный текст zg, его я и переделал, не меняя удобной сути.

И нет, лишнюю сложность я не ценю. Ищу ускользающей элегантности или хотя бы простоты.
Last edited by Дмитрий Журко on Fri 29 Jan, 2021 22:40, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Макросы для редактора Журко

Post by citRiks »

Дмитрий Журко,
а по поводу транслита, надо бы что-то делающее такое :
Common==>>Коммон
а не:
Common==>>сщььщт
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

citRiks wrote: Fri 29 Jan, 2021 23:07а по поводу транслита, надо бы что-то делающее такое : Common==>>Коммон
Тут не транслит, а исправление ошибки переключения языка ввода. Работает посредственно. Транслит есть, скажем, в Punto Switcher и не нужен. Но, если вам надо, исследуйте его. Единственная программа Яндекса, которой пользуюсь.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Макросы для редактора Журко

Post by HaRT »

Фар есть инструмент, а не нянька. © 2009 DrKnS
LAT
Posts: 343
Joined: Thu 21 Jan, 2010 20:00
Has thanked: 22 times
Been thanked: 39 times

Макросы для редактора Журко

Post by LAT »

Дмитрий Журко wrote: Fri 29 Jan, 2021 20:38

Code: Select all

Macro { key = 'ShiftBS'; area = 'Common'; description = 'XLat: QWERTY-ЙЦУКЕН выделения или слова и смена языка ввода ОС';
action = function() if not Object.Selected then Keys('SelWord') end Keys('XLat') mf.xlat('', 1) end }
А зачем здесь mf.xlat('', 1)? Если планируется выполнить преобразование и поменять текущую раскладку, то он лишний: достаточно Keys('XLat'). Если планируется выполнить преобразование и оставить текущую раскладку, то он не помогает, можно так:
mf.xlat('1', 1)
Keys('XLat')
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Макросы для редактора Журко

Post by buniak_a_h »

Дмитрий Журко wrote: Fri 29 Jan, 2021 21:04 Верно ли я понимаю, что неопределённое число аргументов функции в LuaFAR не поддержано?
Я прошу прощения, если уже ответили. Всю конференцию не стал читать.
Если в качестве параметра указать ..., а в тексте программы - local Params={...}, то Params будет таблица-массив аргументов функции.
Ещё есть select( '#', ...) - количество параметров, select(n,...) - n-й параметр
Last edited by buniak_a_h on Sat 30 Jan, 2021 01:31, edited 2 times in total.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

Макросы для редактора Журко

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

buniak_a_h wrote: Sat 30 Jan, 2021 01:01 Я прошу прощения, если уже ответили. Всю конференцию не стал читать.
Да что вы. Тут пока немноголюдно. Огромная благодарность. Теперь можно написать красивый Java format на lua и надеяться, что семантика ненумерованных аргументов совпадёт. Ещё раз спасибо за скорый ответ по существу.

Суть: шаблоны вида "%номер аргумента$обычный шаблон" выделяются и подставляются до передачи строки формата в string.format, но с теми самыми шаблонами. То есть string.format применяется к каждому нумерованному шаблону, а потом, уже без них, к целому.

TODO: Надо мне подумать, что будет, если три %, то есть %%% и более. Наверное, не стоит мне также работать за lua, перечисляя все известные метки формата — просто одна лат. буква ([A-z]).
  1. function iformat (how, ...) local argv = { ... } -- Стиль Java. Метки преобразования string.format. Если номер не указан, то как прежде.
  2.  
  3.     local function f(p, i, o) i = tonumber(i) return argv[i] and (p .. o):format(argv[i]) or '' end
  4.  
  5. return how:gsub('%f[%%](%%)(%d+)$([-+]?%d*%.?%d*[A-Za-z])', f):format(...) end -- Пример: 'Второй аргумент %2$s поставлен перед первым %1$s.'
  6.  
  7.  
  8.  
  9. --Пример:
  10.  
  11. --msgbox(iformat('(5): %5$-10.10s, (4): %4$-3.3s, (3): %3$8f, (2): %2$s (1): %1$s.', '1AA', '2bb', math.pi, '4looooooong', '5sht'))
Last edited by Дмитрий Журко on Thu 18 Feb, 2021 14:30, edited 4 times in total.
Post Reply

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