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

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

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

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

Latest post of the previous page:

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.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

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

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

LAT wrote: Sat 30 Jan, 2021 00:38Если планируется выполнить преобразование и поменять текущую раскладку, то он лишний: достаточно Keys('XLat'). Если планируется выполнить преобразование и оставить текущую раскладку, то он не помогает, можно так:
mf.xlat('1', 1)
Keys('XLat')
Если ничего не помечено, да и нельзя, то семантика будет та же, насколько возможно. area-то == 'Common'. Если внимательнее, у меня написано почти как у вас, то же.
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:16 В том числе, не хватает чего-то вроде mf.format с новым свойством: обращение из формата к аргументу по номеру.
кстате, вот вам если не полностью удовлетворящий метод,
то пригодный для любой доработки.
  1. do -- to isolate the stuff
  2.  
  3.     -- get default metatable for strings:
  4.  
  5.     local str_mt = getmetatable("")
  6.  
  7.     -- set the "%" operator as a method of string substitution:
  8.  
  9.     str_mt.__mod = function(str, tbl_substs)
  10.  
  11.         local   tbl_subst_str = { }
  12.  
  13.         for key, val in pairs(tbl_substs)
  14.  
  15.         do  tbl_subst_str[tostring(key)] = val
  16.  
  17.         end
  18.  
  19.         return str:gsub("%$([%w_]+)", tbl_subst_str)
  20.  
  21.     end
  22.  
  23. end
  24.  
  25.  
  26.  
  27. local str_fmt = "name2: $name222, name1: $name111\nSee also: $1, $1, $3, $2."
  28.  
  29. local str_res = str_fmt % {
  30.  
  31.     name111 = "ZDRASTE!";
  32.  
  33.     name222 = "DOSVIDANIA..";
  34.  
  35.     [1] = "AAA";
  36.  
  37.     [2] = "BBB";
  38.  
  39.     [3] = "CCC";
  40.  
  41. }
  42.  
  43. --[[.. and you will get here this:
  44.  
  45. name2: DOSVIDANIA.., name1: ZDRASTE!
  46.  
  47. See also: AAA, AAA, CCC, BBB.
  48.  
  49. ]]
  50.  
  51. if  far
  52.  
  53. and far.Message
  54.  
  55. then    far.Message(str_res)
  56.  
  57. else    print(str_res)
  58.  
  59. end
То же самое без раскраски, но с ТАБами по 8:

Code: Select all

do -- to isolate the stuff
	-- get default metatable for strings:
	local str_mt = getmetatable("")
	-- set the "%" operator as a method of string substitution:
	str_mt.__mod = function(str, tbl_substs)
		local	tbl_subst_str = { }
		for key, val in pairs(tbl_substs)
		do	tbl_subst_str[tostring(key)] = val
		end
		return str:gsub("%$([%w_]+)", tbl_subst_str)
	end
end

local str_fmt = "name2: $name222, name1: $name111\nSee also: $1, $1, $3, $2."
local str_res = str_fmt % {
	name111 = "ZDRASTE!";
	name222 = "DOSVIDANIA..";
	[1] = "AAA";
	[2] = "BBB";
	[3] = "CCC";
}
--[[.. and you will get here this:
name2: DOSVIDANIA.., name1: ZDRASTE!
See also: AAA, AAA, CCC, BBB.
]]
if	far
and	far.Message
then	far.Message(str_res)
else	print(str_res)
end
Last edited by citRiks on Sat 30 Jan, 2021 22:58, edited 2 times in total.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

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

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

citRiks wrote: Sat 30 Jan, 2021 22:56 кстате, вот вам если не полностью удовлетворящий метод, то пригодный для любой доработки.
Хотелось бы использовать общеупотребительные подходы. Даже не самые удобные из них, а поближе к стандартам. Подход в C# удовлетворительный (номер аргумента в { }), но слишком далёк от того, что уже использует lua. Вроде такого: string.Format("[{1:D}] -- {0}", sz, x). Тут даже индексы с 0, а метки формата прописными. Наверное не стоит подменять имя стандартной функции, подумал я ещё.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

Дмитрий Журко wrote: Sat 30 Jan, 2021 23:40Наверное не стоит подменять имя стандартной функции, подумал я ещё.
эх, скучно с вами :) можете переделать без использования metatable, это возможно, но оставляю это вам
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

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

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

citRiks wrote: Sun 31 Jan, 2021 00:48 эх, скучно с вами можете переделать без использования metatable, это возможно, но оставляю это вам
Я о своём предложении переопределить format. % уместен, подход красивый.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Дмитрий Журко wrote: Fri 29 Jan, 2021 20:38 Этот код всё-таки лучше того, что в %farhome%\Addons\Macros\ShiftBS.lua
viewtopic.php?p=126646#p126646
Дмитрий Журко wrote: Fri 29 Jan, 2021 20:43 Ещё одно усовершенствование для Addons — сделать пассивную панель с папкой как у файла активной панели.
viewtopic.php?f=15&t=7811
Дмитрий Журко wrote: Fri 29 Jan, 2021 21:04 Верно ли я понимаю, что неопределённое число аргументов функции в LuaFAR не поддержано?
Неправильно https://www.lua.org/pil/5.2.html
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Дмитрий Журко wrote: Fri 29 Jan, 2021 21:16 Я его переписал, чуть ускорил (тут надо!).
Действительно ускорили, есть результаты сравнения производительности?
https://t.me/FarManager — Telegram чат
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

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

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

John Doe wrote: Mon 01 Feb, 2021 14:50 Действительно ускорили, есть результаты сравнения производительности?
Действительно ускорил. В тексте есть простая отладка для этого. Хотите, исследуйте. Внизу moon-скрипт, в котором строки с такой же засечкой времени.

Вкратце, прежде искали с шаблоном любые слова, которые сравнивали с тем словом, которое нужно. Теперь ищется слово без шаблона, "плоским" поиском. Если находит в строке, то далее с шаблоном именно этого слова. Можно было бы и просто искать с таким шаблоном, но тогда ускорения не будет, а иногда наоборот, на коротких словах.

PS Я выдал сегодня в первом сообщении почти всё то, что собирался для начала. По сути, я этими скриптами давно пользовался, но почти все они работали чуть кривовато. И никакой локализации. Пришлось таки исследовать неописанное. Теперь там полный порядок.
  1. -- Options
  2.  
  3. OptCaseSensitive=true
  4.  
  5. -- End of options
  6.  
  7.  
  8.  
  9. F=far.Flags
  10.  
  11. color = far.AdvControl(F.ACTL_GETCOLOR, far.Colors.COL_EDITORTEXT)
  12.  
  13. color.ForegroundColor, color.BackgroundColor = color.BackgroundColor, color.ForegroundColor
  14.  
  15. colorguid=win.Uuid "507CFA2A-3BA3-4f2b-8A80-318F5A831235"
  16.  
  17. words={}
  18.  
  19.  
  20.  
  21. tt = 0
  22.  
  23.  
  24.  
  25. Macro
  26.  
  27.   area:"Editor"
  28.  
  29.   key:"F9"
  30.  
  31.   description:"Color Word Under Cursor"
  32.  
  33.   action:->
  34.  
  35.     ei=editor.GetInfo!
  36.  
  37.     id=ei.EditorID
  38.  
  39.     if words[id] then
  40.  
  41.       words[id]=nil
  42.  
  43.       Menu.Show(tt)
  44.  
  45.       tt = 0
  46.  
  47.     else
  48.  
  49.       pos=ei.CurPos
  50.  
  51.       line=editor.GetString!.StringText
  52.  
  53.       if pos<=line\len()+1
  54.  
  55.         slab=pos>1 and line\sub(1,pos-1)\match('[%w_]+$') or ""
  56.  
  57.         tail=line\sub(pos)\match('^[%w_]+') or ""
  58.  
  59.         if slab~="" or tail~="" then words[id]=OptCaseSensitive and slab..tail or (slab..tail)\lower!
  60.  
  61.  
  62.  
  63. Event
  64.  
  65.   group:"EditorEvent"
  66.  
  67.   description: "Color Word"
  68.  
  69.   action:(id,event,param)->
  70.  
  71.     if event==F.EE_REDRAW
  72.  
  73.       if words[id]
  74.  
  75.        
  76.  
  77.         t0 = far.FarClock!
  78.  
  79.        
  80.  
  81.         ei=editor.GetInfo id
  82.  
  83.         start,finish=ei.TopScreenLine,math.min ei.TopScreenLine+ei.WindowSizeY,ei.TotalLines
  84.  
  85.         for ii=start,finish
  86.  
  87.           line,pos=editor.GetString(id,ii).StringText,1
  88.  
  89.           while true
  90.  
  91.             jj,kk,curr=line\cfind("([%w_]+)",pos)
  92.  
  93.             if not jj then break
  94.  
  95.             if not OptCaseSensitive then curr=curr\lower!
  96.  
  97.             if curr==words[id] then editor.AddColor id,ii,jj,kk,F.ECF_AUTODELETE,color,100,colorguid
  98.  
  99.             pos=kk+1
  100.  
  101.        
  102.  
  103.         tt = math.max(tt, far.FarClock! - t0)
  104.  
  105.  
  106.  
  107.     elseif event==F.EE_CLOSE then words[id]=nil
Last edited by Дмитрий Журко on Mon 08 Feb, 2021 21:40, edited 4 times in total.
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

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

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

John Doe wrote: Mon 01 Feb, 2021 14:47 Неправильно https://www.lua.org/pil/5.2.html
А вы испытайте, не надо теорий. Впрочем, не тратьте время как я. arg в этой реализации просто нет.
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: Mon 08 Feb, 2021 21:44
John Doe wrote: Mon 01 Feb, 2021 14:47 Неправильно https://www.lua.org/pil/5.2.html
А вы испытайте, не надо теорий.
Я же Вам присылал код, без всяких теорий практически работающий с неопределённым количеством аргументов! Так что John Doe написал совершенно верно: неправильно!
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

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

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

buniak_a_h wrote: Mon 08 Feb, 2021 22:52 Я же Вам присылал код, без всяких теорий практически работающий с неопределённым количеством аргументов! Так что John Doe написал совершенно верно: неправильно!
Вы не разобрались теперь.

1. За тот код я вас благодарил, этот подход использую.
2. Как в учебнике работать не будет, нет arg. Приводить учебник — обрекать всех новичков наступать на мои грабли, им придётся убедиться, что примеры учебника не работают. Они потратят время на недоразумения. Вообще, это баг документации FAR, конечно, неуважение.
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

Дмитрий Журко wrote: Mon 08 Feb, 2021 23:17 Как в учебнике работать не будет, нет arg. Приводить учебник — обрекать всех новичков наступать на мои грабли, им придётся убедиться, что примеры учебника не работают. Они потратят время на недоразумения. Вообще, это баг документации FAR, конечно, неуважение.
Вы обнаружили баг, считаете, что это неуважение, знаете, как его исправить… Где же Pull request с исправлением?!
Фар есть инструмент, а не нянька. © 2009 DrKnS
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: Mon 08 Feb, 2021 23:17 Приводить учебник — обрекать всех новичков наступать на мои грабли, …
Попробуйте начать не с учебника, а с описания языка. Vararg описан тут. И ФАР тут вообще ни при чём.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Дмитрий Журко wrote: Mon 08 Feb, 2021 23:17 Вообще, это баг документации FAR, конечно, неуважение.
Если не трудно, укажите, пожалуйста, где находится этот баг в документации FAR.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

DEL
Last edited by citRiks on Tue 09 Feb, 2021 09:09, edited 3 times in total.
Post Reply

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