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

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

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

Post by John Doe »

Latest post of the previous page:

Желательно в шапке привести и код.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

John Doe wrote:Желательно в шапке привести и код.
Добавил код, доредактировал описание.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Почему не [codebox=lua file=untitled.lua]?
И неплохо бы какое-то краткое описание без спойлера.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

John Doe wrote:Почему не [codebox=lua file=untitled.lua]?
И неплохо бы какое-то краткое описание без спойлера.
Сделаю. Мало опыта делать такие шапки. К code2 не привык ещё...
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

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

И надо упомянуть, от последних ломок macro api макрос не зависит. Работать должен на версиях ФАРа как до ломки, так и после.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

Версия 1.03
- Добавлен файл конфигурации (за идею определения пути к скрипту персональное спасибо John Doe), использование файла является факультативным.
- Исправлено сравнение через match (осталось после замены find). Как ни странно, на работу не влияло.
- Строка иницилизации в макросах делается "изменённая" (что бы удобнее было сразу продолжать ввод).
- В макросе Alt. (т.е. в котором задана начальная маска) сразу делается переход на ближайшее совпадение.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Code: Select all

do local f,m=loadfile(debug.getinfo(function()end).source:match("^@(.+)"):gsub(".lua$",".cfg"))
Лучше так: debug.getinfo(1,"S").source
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

John Doe wrote:Лучше так: debug.getinfo(1,"S").source
Спасибо, попробую. Я ещё с этим debug не разбирался, некогда было.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

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

CTRLZ 1.02
- Для некоторых макросов поле ввода делается "изменённым" (AltZ, AltV).
- Убрал проверку того, что новое введённое значение == старому значению. Раньше в этом случае макрос ничего не делал - нет изменений, нечего и сохранять описание. На самом деле, обычный CtrlZ при чтении описания отбрасывает начальные и завершающие пробелы. А при сохранении - нет, хотя они и не показываются в панелях. Поэтому descript.ion может быть уже другим.
- Отбрасываются начальные и конечные пробельные символы.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

DescriptionMultiEdit - Многострочный редактор описаний
Пределка CtrlZ в качестве эскперимента в продолжении темы http://forum.farmanager.com/viewtopic.p ... 5&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. Работа с описаниями файлов, в том числе и с многострочными
  4.  
  5. v.2.03 (C) 2013-2015 Smitis
  6.  
  7. - Замена стандартного диалога редактирования.
  8.  
  9. - Редактируется описание только текущего элемента панелей, не зависимо от выделения (Выделение сохраняется/восстанавливается через внутренний буфер. Восстановление предыдущего выделения через CtrlM теряется.)
  10.  
  11. - Возможность редактирования многострочных описаний.
  12.  
  13.  
  14.  
  15. Для работы требуется модуль DialogClass
  16.  
  17.     viewtopic.php?t=8523
  18.  
  19. Обсуждение макросов для работы с описаниями
  20.  
  21.     viewtopic.php?t=7846
  22.  
  23. Обсуждение многострочного редактора описаний
  24.  
  25.     viewtopic.php?t=285
  26.  
  27. --]=] ----------------------------------------------------------------------------------------------
  28.  
  29.  
  30.  
  31. local F = far.Flags
  32.  
  33. local dialog = require 'DialogClass'
  34.  
  35.  
  36.  
  37. ----------------------------------------------------------------------------------------------------
  38.  
  39.  
  40.  
  41. local DescriptionMultiEditId = "75CA1288-4C06-4621-870E-A4FDD9E7319E"
  42.  
  43. --far.Guids.DescriptionEditId = DescriptionEditId
  44.  
  45.  
  46.  
  47. local HistoryLimitLen = 80 -- описания длиней чем HistoryLimitLen в историю добавляться не будут
  48.  
  49. local DescriptionPrev = ""
  50.  
  51.  
  52.  
  53. ----------------------------------------------------------------------------------------------------
  54.  
  55. -- Редактирование в окне с рамкой
  56.  
  57. local MultiEditId = "736B91DE-2525-4296-9529-F0BAD8503B57"
  58.  
  59. --far.Guids.MultiEditId = MultiEditId
  60.  
  61. local function MultiEdit(x1,y1,x2,y2,text,title)
  62.  
  63.     dialog.New {
  64.  
  65.         Guid = MultiEditId,
  66.  
  67.         X1=x1, Y1=y1, X2=x2, Y2=y2, Frame=2,
  68.  
  69.         DlgProc = function(hDlg,Msg,Param1,Param2,D,DI)
  70.  
  71.             local coord, hfile, tmpfile
  72.  
  73.             if Msg==F.DN_DRAWDIALOGDONE then
  74.  
  75.                 coord = D:Send(F.DM_GETDLGRECT,0,0)
  76.  
  77.                 tmpfile = far.MkTemp()
  78.  
  79.                 hfile = io.open(tmpfile,"w") hfile:write(text) hfile:close()
  80.  
  81.                 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)
  82.  
  83.                 hfile = io.open(tmpfile,"r") text = hfile:read("*a") hfile:close()
  84.  
  85.                 win.DeleteFile(tmpfile)
  86.  
  87.                 D:Send(F.DM_CLOSE)
  88.  
  89.             end
  90.  
  91.         end
  92.  
  93.     } ()
  94.  
  95.     return text
  96.  
  97. end
  98.  
  99. ----------------------------------------------------------------------------------------------------
  100.  
  101. local idtc = win.Utf16ToUtf8(win.MultiByteToWideChar(unicode.ascii.char(0x04,0xC2),win.GetACP())) -- идентификатор TC в UTF-8
  102.  
  103. local function DescriptionEdit(init,changed)
  104.  
  105.     local Selected = APanel.Selected
  106.  
  107.     local Description = Panel.Item(0,0,11)
  108.  
  109.     local HistoryName = "DizText"
  110.  
  111.     local FileName = APanel.Current
  112.  
  113.  
  114.  
  115.     if Area.Search then Keys "Esc" end
  116.  
  117.  
  118.  
  119.     local D,DI = dialog.New {
  120.  
  121.         Guid = DescriptionMultiEditId,
  122.  
  123.         Title = "Describe file",
  124.  
  125.         W=76, H=8,
  126.  
  127.         DlgProc = function(hDlg,Msg,Param1,Param2,D,DI)
  128.  
  129.             if Msg==F.DN_INITDIALOG then
  130.  
  131.                 -- для некоторых макросов требуется, чтобы поле не было "неизменённое"
  132.  
  133.                 if changed then
  134.  
  135.                     DI.Description:Unchanged(0)
  136.  
  137.                 end
  138.  
  139.             elseif Msg==F.DN_CLOSE then
  140.  
  141.                 -- не записываем в историю пустые, слишком большие и многострочные описания
  142.  
  143.                 local text = DI.Description:GetText()
  144.  
  145.                 if text~="" and text:len()<=HistoryLimitLen and text:find('\n')==nil then
  146.  
  147.                     DI.Description:Send(F.DM_ADDHISTORY,text)
  148.  
  149.                 end
  150.  
  151.                 return true
  152.  
  153.             elseif Msg==F.DN_CONTROLINPUT and Param2.EventType==F.KEY_EVENT and Param2.KeyDown then
  154.  
  155.                 local k = far.InputRecordToName(Param2):gsub('[RL]Ctrl','Ctrl')
  156.  
  157.                 if k=="CtrlE" or k=="F4" then
  158.  
  159.                     local coord = D:Send(F.DM_GETDLGRECT,0,0)
  160.  
  161.                     --local text = DI.Description:GetText():gsub('\x02',''):gsub('\x03','\n')
  162.  
  163.                     local text = DI.Description:GetText()
  164.  
  165.                     if text:sub(-2)==idtc then -- проверка частичная, так как мы не знаем, из какой кодировки конвертировали в юникод
  166.  
  167.                         idsymbol = text:sub(-1) -- это то, во что был преобразован id после конвертирования ANSI->UNICODE
  168.  
  169.                         text = text:sub(1,-3):gsub('(\\*\\n)',
  170.  
  171.                             function(s)
  172.  
  173.                                 if s:sub(1,-3):len()%2==0 then
  174.  
  175.                                     return s:sub(1,-3)..'\n' -- перед \n чётное число или 0 символов \
  176.  
  177.                                 end
  178.  
  179.                                 return s
  180.  
  181.                             end
  182.  
  183.                         ):gsub('\\\\','\\')
  184.  
  185.                     end
  186.  
  187.                     local newtext = MultiEdit(coord.Left,coord.Top-5,coord.Right,coord.Bottom+5,text,"Description Edit")
  188.  
  189.                     if newtext ~= text then
  190.  
  191.                         if newtext:find('\n') then
  192.  
  193.                             newtext = newtext:gsub('\\','\\\\'):gsub('\n','\\n')..idtc
  194.  
  195.                         end
  196.  
  197.                         DI.Description:SetText(newtext)
  198.  
  199.                     end
  200.  
  201.                     return true
  202.  
  203.                 end
  204.  
  205.             end
  206.  
  207.         end,
  208.  
  209.         Items = {
  210.  
  211.             {"t+", Text="Description:"},
  212.  
  213.             {"emh+@", Name="Description", Text=init or Description, History=HistoryName},
  214.  
  215.             {"s+"},
  216.  
  217.             {"b=!+", Name="OK"},
  218.  
  219.             {"b=", Name="Cancel"},
  220.  
  221.         },
  222.  
  223.     }
  224.  
  225.     D()
  226.  
  227.     if D.Ret ~= -1 and D.Ret ~= DI.Cancel.Id then
  228.  
  229.         if DI.Description.Text ~= Description then
  230.  
  231.             DescriptionPrev = Description
  232.  
  233.             Description = DI.Description.Text:gsub("^%s+",""):gsub("%s+$","") -- trim
  234.  
  235.             mf.clip(5,2)
  236.  
  237.             if Selected then -- сохранить выделение
  238.  
  239.                 Keys "CtrlShiftIns"
  240.  
  241.                 Panel.Select(0,0)
  242.  
  243.             end
  244.  
  245.             Far.DisableHistory(-1) -- добавляются в DlgProc
  246.  
  247.             Keys "CtrlZ"
  248.  
  249.             print(Description)
  250.  
  251.             Keys "Enter"
  252.  
  253.             if Selected then -- восстановить выделение
  254.  
  255.                 Panel.Select(0,1,2,mf.clip(0))
  256.  
  257.             end
  258.  
  259.         end
  260.  
  261.     end
  262.  
  263. end
  264.  
  265. ----------------------------------------------------------------------------------------------------
  266.  
  267. Macro { --  Описание
  268.  
  269.     description="Description";
  270.  
  271.     area="Shell Search";
  272.  
  273.     key="CtrlAltZ";
  274.  
  275.     action=function()
  276.  
  277.         Keys "CtrlZ"
  278.  
  279.     end;
  280.  
  281. }
  282.  
  283. ----------------------------------------------------------------------------------------------------
  284.  
  285. Macro { --  Описание только одного файла
  286.  
  287.     description="Description: Edit";
  288.  
  289.     area="Shell Search";
  290.  
  291.     key="CtrlZ";
  292.  
  293.     action=function()
  294.  
  295.         DescriptionEdit()
  296.  
  297.     end;
  298.  
  299. }
  300.  
  301. ----------------------------------------------------------------------------------------------------
  302.  
  303. Macro { --  Копирование описания в буфер обмена
  304.  
  305.     description="Description: Copy to clipboard";
  306.  
  307.     area="Shell Search";
  308.  
  309.     key="AltC";
  310.  
  311.     action=function()
  312.  
  313.         if Area.Search then Keys "Esc" end
  314.  
  315.         mf.clip(1,Panel.Item(0,0,11))
  316.  
  317.     end;
  318.  
  319. }
  320.  
  321. ----------------------------------------------------------------------------------------------------
  322.  
  323. Macro { --  Новое описание из буфера обмена
  324.  
  325.     description="Description: New from clipboard";
  326.  
  327.     area="Shell Search";
  328.  
  329.     key="AltZ";
  330.  
  331.     action=function()
  332.  
  333.         if Area.Search then Keys "Esc" end
  334.  
  335.         local Clipboard = mf.clip(0)
  336.  
  337.         if type(Clipboard)=="string" then
  338.  
  339.             DescriptionEdit(Clipboard:gsub("[\r\n]+"," "),true)
  340.  
  341.         end
  342.  
  343.     end;
  344.  
  345. }
  346.  
  347. ----------------------------------------------------------------------------------------------------
  348.  
  349. Macro { --  Добавить описание из буфера обмена к текущему описанию через пробел.
  350.  
  351.     description="Description: Append from clipboard";
  352.  
  353.     area="Shell Search";
  354.  
  355.     key="AltV";
  356.  
  357.     action=function()
  358.  
  359.         if Area.Search then Keys "Esc" end
  360.  
  361.         local Clipboard = mf.clip(0)
  362.  
  363.         if type(Clipboard)=="string" and Clipboard:len()>0 then
  364.  
  365.             local Description = Panel.Item(0,0,11)
  366.  
  367.             if Description:len() > 0 then
  368.  
  369.                 DescriptionEdit(Description.." "..Clipboard:gsub("[\r\n]+"," "),true)
  370.  
  371.             else
  372.  
  373.                 DescriptionEdit(Clipboard,true)
  374.  
  375.             end
  376.  
  377.         end
  378.  
  379.     end;
  380.  
  381. }
  382.  
  383. ----------------------------------------------------------------------------------------------------
  384.  
  385. Macro { --  Удалить описание в буфер обмена. Это описание не будет помещено в DescriptionPrev
  386.  
  387.     description="Description: Cut to clipboard";
  388.  
  389.     area="Shell Search";
  390.  
  391.     key="AltX";
  392.  
  393.     action=function()
  394.  
  395.         if Area.Search then Keys "Esc" end
  396.  
  397.         local Description = Panel.Item(0,0,11)
  398.  
  399.         if Description:len() > 0 then
  400.  
  401.             Far.DisableHistory(-1) -- пустое описание не будет добавлено в историю
  402.  
  403.             mf.clip(1,Description)
  404.  
  405.             local selected = APanel.Selected
  406.  
  407.             mf.clip(5,2)
  408.  
  409.             if selected then
  410.  
  411.                 Keys "CtrlShiftIns"
  412.  
  413.                 Panel.Select(0,0)
  414.  
  415.             end
  416.  
  417.             Keys "CtrlZ CtrlY Enter"
  418.  
  419.             if selected then
  420.  
  421.                 Panel.Select(0,1,2,mf.clip(0))
  422.  
  423.             end
  424.  
  425.         end
  426.  
  427.     end;
  428.  
  429. }
  430.  
  431. ----------------------------------------------------------------------------------------------------
  432.  
  433. Macro { --  Удалить описание. Это описание будет помещено в DescriptionPrev
  434.  
  435.     description="Description: Delete";
  436.  
  437.     area="Shell Search";
  438.  
  439.     key="AltD";
  440.  
  441.     action=function()
  442.  
  443.         if Area.Search then Keys "Esc" end
  444.  
  445.         local Description = Panel.Item(0,0,11)
  446.  
  447.         if Description:len() > 0 then
  448.  
  449.             Far.DisableHistory(-1) -- пустое описание не будет добавлено в историю
  450.  
  451.             DescriptionPrev = Description
  452.  
  453.             local selected = APanel.Selected
  454.  
  455.             mf.clip(5,2)
  456.  
  457.             if selected then
  458.  
  459.                 Keys "CtrlShiftIns"
  460.  
  461.                 Panel.Select(0,0)
  462.  
  463.             end
  464.  
  465.             Keys "CtrlZ CtrlY Enter"
  466.  
  467.             if selected then
  468.  
  469.                 Panel.Select(0,1,2,mf.clip(0))
  470.  
  471.             end
  472.  
  473.         end
  474.  
  475.     end;
  476.  
  477. }
  478.  
  479. ----------------------------------------------------------------------------------------------------
  480.  
  481. Macro { --  Восстановить описание
  482.  
  483.     description="Description: Restore";
  484.  
  485.     area="Shell Search";
  486.  
  487.     key="AltShiftZ";
  488.  
  489.     action=function()
  490.  
  491.         DescriptionEdit(DescriptionPrev)
  492.  
  493.     end;
  494.  
  495. }
  496.  
  497. ----------------------------------------------------------------------------------------------------
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 »

А зачем городить несовместимые между собой способы, уже применяемые в 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 »

К тому же возникает ещё одна проблема: к одному общепринятому способу присоединятся другие разработчики, и реализуют этот же способ в своих программах, но реализовывать несколько альтернативных правил они вряд ли возьмутся, решив резонно подождать того времени, когда будет принят единственный способ обработки.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

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

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

Я пока предлагаю вариант.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

Конечно же, Гислер нагородил с описаниями.
Вот, например, эти псевдоуправляющие двойные символы-разделители \n зачем? Например, я иногда храню в описаниях пути. Если путь будет в многострочном описании все \ придётся удвоить и как это будет выглядеть в столбце описаний - сплошные двойные \\, а перед именем, начинающимся с n ещё и тройные \\\n.
Откуда взялись эти 0x04 0xC2? Судя по всему, это позаимствовано у JPSoft. Но там после этих символов идёт информация сторонней программы (TotalCommander), а не перед.
Разум когда-нибудь победит.
Victorian
Posts: 80
Joined: Sun 11 Oct, 2009 05:55
Has thanked: 1 time

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

Post by Victorian »

Многострочности первоначально не было, но реальность такова, что пользователям она нужна, и приходится изощряться. В XnView она просто необходима.
Просто замена символа для различения многострочности от действительного конца строки-записи описания, тут приведёт к коллизиям с некоторыми спецсимволами, а замена на печатные символы не даст эту комбинацию использовать пользователям. Существующая в Си традиционная замена с префиксом "\" вполне понятно большинству образованных людей, удобочитаема в "сыром" виде, и допускает однозначное обратное декодирование.
Тут важна даже не лучшесть, а поддержка всеми разработчиками различных программ. Кто раньше применил, тот и навязал стандарт, а если он ущербен, то необходимо уже общение разработчиков между собой. Я своё дело сделал, обозначив проблему :)
P.S.
Smitis wrote:перед именем, начинающимся с n ещё и тройные \\\n.
- это не так, потому как это не имя начинающееся с "n...", а перевод строки за "\".
Бояться избыточности не стоит, ибо сейчас нет ограничения в ресурсах, а вероятность использования \n в исходном описании ничтожно мала. Двойные \\ используются в реестре, и никого это не смущает...
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

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

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