Макросы для работы с описаниями файлов

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Re: Макросы для работы с описаниями файлов

Post by John Doe » Wed 03 Apr, 2013 12:23

Latest post of the previous page:

Почему не
  1. ?
  2. И неплохо бы какое-то краткое описание без спойлера.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Re: Макросы для работы с описаниями файлов

Post by Smitis » Wed 03 Apr, 2013 12:31

John Doe wrote:Почему не
  1. ?
  2. И неплохо бы какое-то краткое описание без спойлера.[/quote]
  3. Сделаю. Мало опыта делать такие шапки. К code2 не привык ещё...
Разум когда-нибудь победит.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Re: Макросы для работы с описаниями файлов

Post by Smitis » Wed 03 Apr, 2013 19:43

Не прошло и суток - версия 1.02 макроса descss.lua
Изменения:
- При отметке/снятия отметки проверяется опция ФАРа Panel.SelectFolders (если false, выделение папок не затрагивается).
- Конфигурация - все макроклавиши можно задать в таблице в начале макроса. Причём, при пустой строке макрос отключается. Там же опция, циклический поиск или нет.
- Локализация english, russian (громко сказано, там всего по три строчки :) ). Язык определяется через переменную среды FARLANG. Если язык отличный от английского/русского, устанавливается английский.

И надо упомянуть, от последних ломок macro api макрос не зависит. Работать должен на версиях ФАРа как до ломки, так и после.
Разум когда-нибудь победит.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Re: Макросы для работы с описаниями файлов

Post by Smitis » Wed 15 May, 2013 09:27

Версия 1.03
- Добавлен файл конфигурации (за идею определения пути к скрипту персональное спасибо John Doe), использование файла является факультативным.
- Исправлено сравнение через match (осталось после замены find). Как ни странно, на работу не влияло.
- Строка иницилизации в макросах делается "изменённая" (что бы удобнее было сразу продолжать ввод).
- В макросе Alt. (т.е. в котором задана начальная маска) сразу делается переход на ближайшее совпадение.
Разум когда-нибудь победит.

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Re: Макросы для работы с описаниями файлов

Post by John Doe » Wed 15 May, 2013 09:36

Code: Select all

do local f,m=loadfile(debug.getinfo(function()end).source:match("^@(.+)"):gsub(".lua$",".cfg"))
Лучше так: debug.getinfo(1,"S").source

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Re: Макросы для работы с описаниями файлов

Post by Smitis » Wed 15 May, 2013 09:42

John Doe wrote:Лучше так: debug.getinfo(1,"S").source
Спасибо, попробую. Я ещё с этим debug не разбирался, некогда было.
Разум когда-нибудь победит.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Re: Макросы для работы с описаниями файлов

Post by Smitis » Wed 26 Jun, 2013 14:02

DESCSS 1.04
- Использовать match для проверки клавиши в диалоге была не самая лучшая идея (возможны частичные совпадения). Пришлось доработать проверку.

CTRLZ 1.02
- Для некоторых макросов поле ввода делается "изменённым" (AltZ, AltV).
- Убрал проверку того, что новое введённое значение == старому значению. Раньше в этом случае макрос ничего не делал - нет изменений, нечего и сохранять описание. На самом деле, обычный CtrlZ при чтении описания отбрасывает начальные и завершающие пробелы. А при сохранении - нет, хотя они и не показываются в панелях. Поэтому descript.ion может быть уже другим.
- Отбрасываются начальные и конечные пробельные символы.
Разум когда-нибудь победит.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Макросы для работы с описаниями файлов

Post by Smitis » Thu 26 Nov, 2015 14:49

DescriptionMultiEdit - Многострочный редактор описаний
Пределка CtrlZ в качестве эскперимента в продолжении темы viewtopic.php?f=7&t=285&start=32
Мне было лень делать даже простые диалоги, поэтому для работы требует DialogClass v.1.10 (а кроме того диалог будет потом переделан в более сложный для личных нужд).
Вызов диалога редактирования описания CtrlZ.
Переход к многострочному редактированию из диалога - CtrlE или F4.
Если результат одна строка (нет символов 0x0A), всё остаётся как есть, символы 0x04 0xC2 в конце удаляются. Иначе, разделители строк заменяются на \n (два символа!), в конце дописывается 0x04 0xC2, типа, формат, совместимый с TotalCommander. Совместимость только при сохранении описаний в ANSI кодировке (в настройках ФАРа опция "Use ANSI code page by default" установлена, опция "Save in UTF8" сброшена.)

DescriptionMultiEdit 2.03
  1. --[=[ ----------------------------------------------------------------------------------------------
  2. Работа с описаниями файлов, в том числе и с многострочными
  3. v.2.03 (C) 2013-2015 Smitis
  4. - Замена стандартного диалога редактирования.
  5. - Редактируется описание только текущего элемента панелей, не зависимо от выделения (Выделение сохраняется/восстанавливается через внутренний буфер. Восстановление предыдущего выделения через CtrlM теряется.)
  6. - Возможность редактирования многострочных описаний.
  7.  
  8. Для работы требуется модуль DialogClass
  9.     viewtopic.php?t=8523
  10. Обсуждение макросов для работы с описаниями
  11.     viewtopic.php?t=7846
  12. Обсуждение многострочного редактора описаний
  13.     viewtopic.php?t=285
  14. --]=] ----------------------------------------------------------------------------------------------
  15.  
  16. local F = far.Flags
  17. local dialog = require 'DialogClass'
  18.  
  19. ----------------------------------------------------------------------------------------------------
  20.  
  21. local DescriptionMultiEditId = "75CA1288-4C06-4621-870E-A4FDD9E7319E"
  22. --far.Guids.DescriptionEditId = DescriptionEditId
  23.  
  24. local HistoryLimitLen = 80 -- описания длиней чем HistoryLimitLen в историю добавляться не будут
  25. local DescriptionPrev = ""
  26.  
  27. ----------------------------------------------------------------------------------------------------
  28. -- Редактирование в окне с рамкой
  29. local MultiEditId = "736B91DE-2525-4296-9529-F0BAD8503B57"
  30. --far.Guids.MultiEditId = MultiEditId
  31. local function MultiEdit(x1,y1,x2,y2,text,title)
  32.     dialog.New {
  33.         Guid = MultiEditId,
  34.         X1=x1, Y1=y1, X2=x2, Y2=y2, Frame=2,
  35.         DlgProc = function(hDlg,Msg,Param1,Param2,D,DI)
  36.             local coord, hfile, tmpfile
  37.             if Msg==F.DN_DRAWDIALOGDONE then
  38.                 coord = D:Send(F.DM_GETDLGRECT,0,0)
  39.                 tmpfile = far.MkTemp()
  40.                 hfile = io.open(tmpfile,"w") hfile:write(text) hfile:close()
  41.                 editor.Editor(tmpfile,title,coord.Left+4,coord.Top+2,coord.Right-4,coord.Bottom-2, bor(F.EF_DISABLEHISTORY,F.EF_DISABLESAVEPOS),0,0,65001)
  42.                 hfile = io.open(tmpfile,"r") text = hfile:read("*a") hfile:close()
  43.                 win.DeleteFile(tmpfile)
  44.                 D:Send(F.DM_CLOSE)
  45.             end
  46.         end
  47.     } ()
  48.     return text
  49. end
  50. ----------------------------------------------------------------------------------------------------
  51. local idtc = win.Utf16ToUtf8(win.MultiByteToWideChar(unicode.ascii.char(0x04,0xC2),win.GetACP())) -- идентификатор TC в UTF-8
  52. local function DescriptionEdit(init,changed)
  53.     local Selected = APanel.Selected
  54.     local Description = Panel.Item(0,0,11)
  55.     local HistoryName = "DizText"
  56.     local FileName = APanel.Current
  57.  
  58.     if Area.Search then Keys "Esc" end
  59.  
  60.     local D,DI = dialog.New {
  61.         Guid = DescriptionMultiEditId,
  62.         Title = "Describe file",
  63.         W=76, H=8,
  64.         DlgProc = function(hDlg,Msg,Param1,Param2,D,DI)
  65.             if Msg==F.DN_INITDIALOG then
  66.                 -- для некоторых макросов требуется, чтобы поле не было "неизменённое"
  67.                 if changed then
  68.                     DI.Description:Unchanged(0)
  69.                 end
  70.             elseif Msg==F.DN_CLOSE then
  71.                 -- не записываем в историю пустые, слишком большие и многострочные описания
  72.                 local text = DI.Description:GetText()
  73.                 if text~="" and text:len()<=HistoryLimitLen and text:find('\n')==nil then
  74.                     DI.Description:Send(F.DM_ADDHISTORY,text)
  75.                 end
  76.                 return true
  77.             elseif Msg==F.DN_CONTROLINPUT and Param2.EventType==F.KEY_EVENT and Param2.KeyDown then
  78.                 local k = far.InputRecordToName(Param2):gsub('[RL]Ctrl','Ctrl')
  79.                 if k=="CtrlE" or k=="F4" then
  80.                     local coord = D:Send(F.DM_GETDLGRECT,0,0)
  81.                     --local text = DI.Description:GetText():gsub('\x02',''):gsub('\x03','\n')
  82.                     local text = DI.Description:GetText()
  83.                     if text:sub(-2)==idtc then -- проверка частичная, так как мы не знаем, из какой кодировки конвертировали в юникод
  84.                         idsymbol = text:sub(-1) -- это то, во что был преобразован id после конвертирования ANSI->UNICODE
  85.                         text = text:sub(1,-3):gsub('(\\*\\n)',
  86.                             function(s)
  87.                                 if s:sub(1,-3):len()%2==0 then
  88.                                     return s:sub(1,-3)..'\n' -- перед \n чётное число или 0 символов \
  89.                                 end
  90.                                 return s
  91.                             end
  92.                         ):gsub('\\\\','\\')
  93.                     end
  94.                     local newtext = MultiEdit(coord.Left,coord.Top-5,coord.Right,coord.Bottom+5,text,"Description Edit")
  95.                     if newtext ~= text then
  96.                         if newtext:find('\n') then
  97.                             newtext = newtext:gsub('\\','\\\\'):gsub('\n','\\n')..idtc
  98.                         end
  99.                         DI.Description:SetText(newtext)
  100.                     end
  101.                     return true
  102.                 end
  103.             end
  104.         end,
  105.         Items = {
  106.             {"t+", Text="Description:"},
  107.             {"emh+@", Name="Description", Text=init or Description, History=HistoryName},
  108.             {"s+"},
  109.             {"b=!+", Name="OK"},
  110.             {"b=", Name="Cancel"},
  111.         },
  112.     }
  113.     D()
  114.     if D.Ret ~= -1 and D.Ret ~= DI.Cancel.Id then
  115.         if DI.Description.Text ~= Description then
  116.             DescriptionPrev = Description
  117.             Description = DI.Description.Text:gsub("^%s+",""):gsub("%s+$","") -- trim
  118.             mf.clip(5,2)
  119.             if Selected then -- сохранить выделение
  120.                 Keys "CtrlShiftIns"
  121.                 Panel.Select(0,0)
  122.             end
  123.             Far.DisableHistory(-1) -- добавляются в DlgProc
  124.             Keys "CtrlZ"
  125.             print(Description)
  126.             Keys "Enter"
  127.             if Selected then -- восстановить выделение
  128.                 Panel.Select(0,1,2,mf.clip(0))
  129.             end
  130.         end
  131.     end
  132. end
  133. ----------------------------------------------------------------------------------------------------
  134. Macro { --  Описание
  135.     description="Description";
  136.     area="Shell Search";
  137.     key="CtrlAltZ";
  138.     action=function()
  139.         Keys "CtrlZ"
  140.     end;
  141. }
  142. ----------------------------------------------------------------------------------------------------
  143. Macro { --  Описание только одного файла
  144.     description="Description: Edit";
  145.     area="Shell Search";
  146.     key="CtrlZ";
  147.     action=function()
  148.         DescriptionEdit()
  149.     end;
  150. }
  151. ----------------------------------------------------------------------------------------------------
  152. Macro { --  Копирование описания в буфер обмена
  153.     description="Description: Copy to clipboard";
  154.     area="Shell Search";
  155.     key="AltC";
  156.     action=function()
  157.         if Area.Search then Keys "Esc" end
  158.         mf.clip(1,Panel.Item(0,0,11))
  159.     end;
  160. }
  161. ----------------------------------------------------------------------------------------------------
  162. Macro { --  Новое описание из буфера обмена
  163.     description="Description: New from clipboard";
  164.     area="Shell Search";
  165.     key="AltZ";
  166.     action=function()
  167.         if Area.Search then Keys "Esc" end
  168.         local Clipboard = mf.clip(0)
  169.         if type(Clipboard)=="string" then
  170.             DescriptionEdit(Clipboard:gsub("[\r\n]+"," "),true)
  171.         end
  172.     end;
  173. }
  174. ----------------------------------------------------------------------------------------------------
  175. Macro { --  Добавить описание из буфера обмена к текущему описанию через пробел.
  176.     description="Description: Append from clipboard";
  177.     area="Shell Search";
  178.     key="AltV";
  179.     action=function()
  180.         if Area.Search then Keys "Esc" end
  181.         local Clipboard = mf.clip(0)
  182.         if type(Clipboard)=="string" and Clipboard:len()>0 then
  183.             local Description = Panel.Item(0,0,11)
  184.             if Description:len() > 0 then
  185.                 DescriptionEdit(Description.." "..Clipboard:gsub("[\r\n]+"," "),true)
  186.             else
  187.                 DescriptionEdit(Clipboard,true)
  188.             end
  189.         end
  190.     end;
  191. }
  192. ----------------------------------------------------------------------------------------------------
  193. Macro { --  Удалить описание в буфер обмена. Это описание не будет помещено в DescriptionPrev
  194.     description="Description: Cut to clipboard";
  195.     area="Shell Search";
  196.     key="AltX";
  197.     action=function()
  198.         if Area.Search then Keys "Esc" end
  199.         local Description = Panel.Item(0,0,11)
  200.         if Description:len() > 0 then
  201.             Far.DisableHistory(-1) -- пустое описание не будет добавлено в историю
  202.             mf.clip(1,Description)
  203.             local selected = APanel.Selected
  204.             mf.clip(5,2)
  205.             if selected then
  206.                 Keys "CtrlShiftIns"
  207.                 Panel.Select(0,0)
  208.             end
  209.             Keys "CtrlZ CtrlY Enter"
  210.             if selected then
  211.                 Panel.Select(0,1,2,mf.clip(0))
  212.             end
  213.         end
  214.     end;
  215. }
  216. ----------------------------------------------------------------------------------------------------
  217. Macro { --  Удалить описание. Это описание будет помещено в DescriptionPrev
  218.     description="Description: Delete";
  219.     area="Shell Search";
  220.     key="AltD";
  221.     action=function()
  222.         if Area.Search then Keys "Esc" end
  223.         local Description = Panel.Item(0,0,11)
  224.         if Description:len() > 0 then
  225.             Far.DisableHistory(-1) -- пустое описание не будет добавлено в историю
  226.             DescriptionPrev = Description
  227.             local selected = APanel.Selected
  228.             mf.clip(5,2)
  229.             if selected then
  230.                 Keys "CtrlShiftIns"
  231.                 Panel.Select(0,0)
  232.             end
  233.             Keys "CtrlZ CtrlY Enter"
  234.             if selected then
  235.                 Panel.Select(0,1,2,mf.clip(0))
  236.             end
  237.         end
  238.     end;
  239. }
  240. ----------------------------------------------------------------------------------------------------
  241. Macro { --  Восстановить описание
  242.     description="Description: Restore";
  243.     area="Shell Search";
  244.     key="AltShiftZ";
  245.     action=function()
  246.         DescriptionEdit(DescriptionPrev)
  247.     end;
  248. }
  249. ----------------------------------------------------------------------------------------------------
Last edited by Smitis on Mon 07 Dec, 2015 09:58, edited 4 times in total.
Разум когда-нибудь победит.

Victorian
Posts: 80
Joined: Sun 11 Oct, 2009 05:55
Has thanked: 1 time

Макросы для работы с описаниями файлов

Post by Victorian » Thu 26 Nov, 2015 16:43

А зачем городить несовместимые между собой способы, уже применяемые в Total Commander, и предлагаемый сейчас в FAR?
Ведь в результате придётся выполнять тройную работу: также сделать способ поддержки, принятый в Total Commander, а потом ещё и убеждать автора Total Commander поддерживать способ, принятый в FAR, чтобы обеспечить взаимную совместимость описаний при обмене пользователей файлами.

Victorian
Posts: 80
Joined: Sun 11 Oct, 2009 05:55
Has thanked: 1 time

Макросы для работы с описаниями файлов

Post by Victorian » Thu 26 Nov, 2015 16:48

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

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Макросы для работы с описаниями файлов

Post by Smitis » Thu 26 Nov, 2015 18:02

Неизвестно ещё кто нагородил. По-моему, нагородил как раз автор TC придумав свой способ, несовместимый с существующим ещё с ДОСа однострочным форматом, да ещё и кривой (использование "управляющих" "псевдосимволов" \n как разделителя я считаю кривым способом). То, что ТС до сих пор не поддерживает юникод говорит скорее всего о том, что автору пофиг на эти описания.

А вот если придумать нормальный и логичный формат и его поддержат другие авторы, вот тогда автора ТС можно ткнуть носом - дорабатывай! А иначе даже не почешится.

Я пока предлагаю вариант.
Разум когда-нибудь победит.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Макросы для работы с описаниями файлов

Post by Smitis » Thu 26 Nov, 2015 18:55

Конечно же, Гислер нагородил с описаниями.
Вот, например, эти псевдоуправляющие двойные символы-разделители \n зачем? Например, я иногда храню в описаниях пути. Если путь будет в многострочном описании все \ придётся удвоить и как это будет выглядеть в столбце описаний - сплошные двойные \\, а перед именем, начинающимся с n ещё и тройные \\\n.
Откуда взялись эти 0x04 0xC2? Судя по всему, это позаимствовано у JPSoft. Но там после этих символов идёт информация сторонней программы (TotalCommander), а не перед.
Разум когда-нибудь победит.

Victorian
Posts: 80
Joined: Sun 11 Oct, 2009 05:55
Has thanked: 1 time

Макросы для работы с описаниями файлов

Post by Victorian » Thu 26 Nov, 2015 19:10

Многострочности первоначально не было, но реальность такова, что пользователям она нужна, и приходится изощряться. В XnView она просто необходима.
Просто замена символа для различения многострочности от действительного конца строки-записи описания, тут приведёт к коллизиям с некоторыми спецсимволами, а замена на печатные символы не даст эту комбинацию использовать пользователям. Существующая в Си традиционная замена с префиксом "\" вполне понятно большинству образованных людей, удобочитаема в "сыром" виде, и допускает однозначное обратное декодирование.
Тут важна даже не лучшесть, а поддержка всеми разработчиками различных программ. Кто раньше применил, тот и навязал стандарт, а если он ущербен, то необходимо уже общение разработчиков между собой. Я своё дело сделал, обозначив проблему :)
P.S.
Smitis wrote:перед именем, начинающимся с n ещё и тройные \\\n.
- это не так, потому как это не имя начинающееся с "n...", а перевод строки за "\".
Бояться избыточности не стоит, ибо сейчас нет ограничения в ресурсах, а вероятность использования \n в исходном описании ничтожно мала. Двойные \\ используются в реестре, и никого это не смущает...

User avatar
HaRT
Moderator
Posts: 8022
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 99 times

Макросы для работы с описаниями файлов

Post by HaRT » Thu 26 Nov, 2015 19:27

Victorian wrote: вполне понятно большинству образованных людей
Какая чушь!
Не путайте образованность и профессиональные знания.
Victorian wrote: важна даже не лучшесть
Вы недооцениваете важность удобоваримости однострочного представления описания при использовании инструментов, которые (пока?) не поддерживают многострочные описания. Вообще-то я уверен, что поддержка многострочных описаний в ближайшие 10 лет не будет внесена в ядро Фара.
Victorian wrote: вероятность использования \n в исходном описании ничтожно мала
Ерунда.
Вам же привели пример: в описании фигурирует какой-то путь в файловой системе. N — достаточно распространённая буква для начала имени файла/папки.
Фар есть инструмент, а не нянька. © 2009 DrKnS

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Макросы для работы с описаниями файлов

Post by Smitis » Thu 26 Nov, 2015 19:38

это не так, потому как это не имя начинающееся с "n...", а перевод строки за "\".
aaa\nnn будет выглядеть как aaa\\\nnn
Существующая в Си традиционная замена с префиксом "\" вполне понятно большинству образованных людей
Спорный тезис. Кроме того, есть ещё такая вещь, как удобочитаемость. И вот у символов \n среди текста удобочитаемости нет.
Тут важна даже не лучшесть, а поддержка всеми разработчиками различных программ.
Пока поддерживает (ли?) только один разработчик.
А вот если свой стандарт будут поддерживать FAR и XnView, то разработчиков, поддерживающих новый стандарт будет в ДВА раза больше :)
Разум когда-нибудь победит.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Макросы для работы с описаниями файлов

Post by Smitis » Thu 26 Nov, 2015 19:41

HaRT wrote:Вообще-то я уверен, что поддержка многострочных описаний в ближайшие 10 лет не будет внесена в ядро Фара.
Ну это как раз решается макросом. Тут важнее будет поддержка UTF-16 (CP-1200)
Разум когда-нибудь победит.

Victorian
Posts: 80
Joined: Sun 11 Oct, 2009 05:55
Has thanked: 1 time

Макросы для работы с описаниями файлов

Post by Victorian » Thu 26 Nov, 2015 20:06

HaRT wrote:Вам же привели пример: в описании фигурирует какой-то путь в файловой системе. N — достаточно распространённая буква для начала имени файла/папки.
Практика отвергает это.

Вот исходная строка:

Code: Select all

Путь к файлу C:\File\name\filename.ext, затем конечный символ\
а тут продолжение на другой строке.
Вот что читаю в файле "Descript.ion"

Code: Select all

1.jpg Путь к файлу C:\\File\\name\\filename.ext, затем конечный символ\\\nа тут продолжение на другой строке.В

Post Reply

Return to “Полезные макросы и скрипты”