Содержимое командной строки в редактор и обратно

Здесь обсуждается всё, что касается макросов.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Содержимое командной строки в редактор и обратно

Post by buniak_a_h »

Latest post of the previous page:

citRiks wrote: Mon 03 Oct, 2022 08:00 кондитион макроса обычного дополнения
Обычное дополнение - это не макрос. Это - плагин
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Содержимое командной строки в редактор и обратно

Post by citRiks »

buniak_a_h wrote: Mon 03 Oct, 2022 08:58 Обычное дополнение - это не макрос. Это - плагин
я имел ввиду ваше дополненеие, а не плугином, значит я неправильно понял.
Если плагин, то его наверное можно тоже отключать в скрипте реДАКТОра
А что за плагин то?
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Содержимое командной строки в редактор и обратно

Post by buniak_a_h »

buniak_a_h wrote: Mon 03 Oct, 2022 00:06 плагин Word Completion)
(от Вадима Егорова, для редактора).
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Не работает far.Text в редакторе?

Post by HaRT »

buniak_a_h wrote: Mon 03 Oct, 2022 16:34 Хотел автодополнение сделать не как у плагина (дозапись в строку), а выводить чисто на экран без "порчи" текста.
А нельзя показывать диалог без рамки в нужном месте?
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Не работает far.Text в редакторе?

Post by buniak_a_h »

HaRT wrote: Mon 03 Oct, 2022 17:47 А нельзя показывать диалог без рамки в нужном месте?
Если АВТОдополнение, то как бы и низзя. На то оно и авто (само должно подставлять, а согласиться или нет - на выбор юзера). А по кнопочке (Ctrl+Space, например, или Ctrl+End) - да, буду выводить список (если больше одного подходящего значения найдётся)
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Не работает far.Text в редакторе?

Post by HaRT »

buniak_a_h wrote: Mon 03 Oct, 2022 18:51 На то оно и авто (само должно подставлять, а согласиться или нет - на выбор юзера)
Да, я так же это понимаю. А диалог я предложил в качестве замены текста, нарисованного поверх. Ведь диалог может, если пользователь согласился, уже вставить текст в редактор, а если нет — просто отдать клавишу дальше?
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Не работает far.Text в редакторе?

Post by buniak_a_h »

Пока я хочу просто дописывать строку другим цветом, а при изменении добавленный текст убирать.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Содержимое командной строки в редактор и обратно

Post by buniak_a_h »

Ну, в общем автодополнение комстроки из истории команд сделано (спасибо HaRT-у и zg) - на базе диалога в одну строку. Пока подставляется только последняя (наиболее поздняя) соответствующая строка (без возможности перебирать историю и без возможности выбора из меню). Это будет делаться.

Как это выглядит:
image.png
image.png (10.04 KiB) Viewed 3593 times
Интересующимся - скрипт:
EditCmdLine.lua
(11.13 KiB) Downloaded 78 times
Жду сообщений об ошибках. Защиту от "вырожденного случая" (когда добавляемая строка нулевой длины) не сделана.
Краткая инструкция по работе с "добавкой" из истории:
End, Tab - Взять из истории до конца добавочки.
Right - Взять один символ из добавочки.
Esc - скрыть добавочку, перейти в редактор.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Содержимое командной строки в редактор и обратно

Post by buniak_a_h »

citRiks wrote: Sun 02 Oct, 2022 23:24 buniak_a_h,
вас чудесный скрипт берем
и когда команда из командной строки оказывается в редакторе
.. то в редакторе можно делать автодополнение команд(ы) как в командной строке
ну как мы это делаем по КтрлПробел в ком. строке фара

м ?
Пока сделал автоматическое дополнение последней в истории команды, начинающейся с введённого.
Условия появления дополнения:
1) курсор стоит в конце последней строки;
2) в истории есть команда, начинающаяся с введённой уже команды (без учёта регистра);
3) длина введённой части команды более установленного минимума (по умолчанию - более 3-х символов).

Перебор (по Ctrl+Space) не реализован пока. Также не реализован выбор из списка. Это - впереди, если надо
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Содержимое командной строки в редактор и обратно

Post by buniak_a_h »

Ну вот вроде реализован полный набор функций работы с историей команд: как автоподстановка, так и выбор из списка. Тестируйте, если вообще в скрипте заинтересованы.
  1. local F = far.Flags
  2.  
  3. local MoveKeys = '|Up|Down|PgUp|PgDn|Left|Right|Home|End|CtrlRight|CtrlLeft|'
  4.  
  5. local SelectKeys = MoveKeys:gsub('|(%a)', '|Shift%1',8):gsub('Ctrl','CtrlShift')
  6.  
  7. local ChangeKeys = {['|BackSlash|']=true; ['|Space|']=true; ['|BS|']=true}
  8.  
  9. local TerminateKeys = '|F10|Esc|'
  10.  
  11. local OperatingFuncKeys = '|F1|F10|F11|F7|CtrlF7|ShiftF7|AltF7|AltF8|'
  12.  
  13. local aEditors = {}
  14.  
  15. local CmdHistory = {}
  16.  
  17. local Cfg = {
  18.  
  19.         AutoCompl_Start = 3
  20.  
  21.       }
  22.  
  23. Macro{
  24.  
  25.   id="710E66E5-D204-4F02-A3B3-F544A8980349";
  26.  
  27.   area="Shell";
  28.  
  29.   key="CtrlAltF4";
  30.  
  31.   description="Редактирование командной строки в редакторе";
  32.  
  33.   action=function(data)
  34.  
  35.     local function InitEd()
  36.  
  37.       local function Label(Key,Text,LongText)
  38.  
  39.         local rec = far.NameToInputRecord(Key)
  40.  
  41.         return {VirtualKeyCode=rec.VirtualKeyCode,ControlKeyState=rec.ControlKeyState,Text=Text,LongText=LongText or Text}
  42.  
  43.       end
  44.  
  45.       local SelStart, SelEnd = panel.GetCmdLineSelection()
  46.  
  47.       aEditors[tostring(editor.GetInfo().EditorID)] = {Value=CmdLine.Value, Pos= CmdLine.CurPos, SelStart=SelStart, SelEnd=SelEnd}
  48.  
  49.       if CmdLine.Value ~= '' then
  50.  
  51.         editor.SetString(nil, 1, CmdLine.Value)
  52.  
  53.         editor.SetPosition(nil, 1, CmdLine.CurPos)
  54.  
  55.         if CmdLine.Selected then
  56.  
  57.           editor.Select(nil, F.BTYPE_STREAM, 1, SelStart, SelEnd-SelStart+1, 1)
  58.  
  59.         end
  60.  
  61.       end
  62.  
  63.       local aKeyBar = {Label("F1","Help"),Label("F10","Save&Close")}
  64.  
  65.       for i=1,12 do
  66.  
  67.         local sKey = 'F' .. i
  68.  
  69.         if not OperatingFuncKeys:find('|'..sKey..'|',1,true) then
  70.  
  71.           aKeyBar[#aKeyBar+1] = Label(sKey, '')
  72.  
  73.         end
  74.  
  75.       end
  76.  
  77.       for _,v in ipairs({'Ctrl','Shift','Alt','CtrlShift','CtrlAlt','AltShift','CtrlAltShift'}) do
  78.  
  79.         for i=1,12 do
  80.  
  81.           local sKey = v .. 'F'..i
  82.  
  83.           if not OperatingFuncKeys:find('|'..sKey..'|',1,true) then aKeyBar[#aKeyBar+1] = Label(sKey, '') end
  84.  
  85.         end
  86.  
  87.       end
  88.  
  89.       editor.SetKeyBar(nil, aKeyBar)
  90.  
  91.       -- Чтение истории в массив
  92.  
  93.       local obj = far.CreateSettings('far')
  94.  
  95.       local enum = obj:Enum(far.Flags.FSSF_HISTORY_CMD)
  96.  
  97.       obj:Free()
  98.  
  99.       CmdHistory = {}
  100.  
  101.       for _,v in ipairs(enum) do CmdHistory[#CmdHistory+1] = v.Name end
  102.  
  103.     end
  104.  
  105.     mf.postmacro(InitEd)
  106.  
  107.     editor.Editor(far.MkTemp('frc'), 'Командная строка',nil,nil,nil,nil,
  108.  
  109.                   bor(F.EF_CREATENEW,F.EF_DELETEONCLOSE,F.EF_DISABLEHISTORY,F.EF_DISABLESAVEPOS,F.EF_NONMODAL),
  110.  
  111.                   1, panel.GetCmdLinePos(), win.GetConsoleCP() )
  112.  
  113.   end;
  114.  
  115. }
  116.  
  117. ---------------------------------------------------------------------------------
  118.  
  119. local function ChangingKey(key)
  120.  
  121.   return ChangeKeys[key] or key:len()==3
  122.  
  123. end
  124.  
  125. Event {
  126.  
  127.   id = "BD6FED70-78A0-4E6B-B30F-2858ACC7AE1A";
  128.  
  129.   group       = "EditorInput"; --export.ProcessEditorInput
  130.  
  131.   description = "Event example";
  132.  
  133.   condition   = function(Rec)
  134.  
  135.     if next(aEditors) then
  136.  
  137.       local key = far.InputRecordToName(Rec)
  138.  
  139.       if key then
  140.  
  141.         key = '|'..key..'|'
  142.  
  143.         if MoveKeys:find(key,1,true) or
  144.  
  145.            SelectKeys:find(key,1,true) or
  146.  
  147.            ChangingKey(key) or
  148.  
  149.            TerminateKeys:find(key,1,true) or
  150.  
  151.            ('|CtrlSpace|CtrlEnd|'):find(key,1,true) or
  152.  
  153.            key == '|AltDown|' or
  154.  
  155.            key:match"^|F%d%d?|$"
  156.  
  157.         then
  158.  
  159.           local id = editor.GetInfo().EditorID
  160.  
  161.           if aEditors[tostring(id)] then
  162.  
  163.             Rec.Key = key
  164.  
  165.             Rec.EditorID = id
  166.  
  167.             return true
  168.  
  169.           end
  170.  
  171.         end
  172.  
  173.       end
  174.  
  175.     end
  176.  
  177.   end; -- condition
  178.  
  179.   action      = function(Rec)
  180.  
  181.     local function CurrCursorPos()
  182.  
  183.       local ei = editor.GetInfo(nil)
  184.  
  185.       local yDlg = 1 + ei.CurLine-ei.TopScreenLine - (band(ei.Options, F.EOPT_SHOWTITLEBAR)==0 and 1 or 0)
  186.  
  187.       local xDlg = ei.CurPos - ei.LeftPos - 1 ----------------------------------------------------------------------------------------------------------------------------------------------
  188.  
  189.       return xDlg, yDlg
  190.  
  191.     end -- CurrCursorPos
  192.  
  193.     local function CurrValue()
  194.  
  195.       local Value = {}
  196.  
  197.       for i=1, Editor.Lines do
  198.  
  199.         local l = Editor.GetStr(i)
  200.  
  201.         if l ~= '' then Value[#Value+1] = l end
  202.  
  203.       end
  204.  
  205.       for i,l in ipairs(Value) do
  206.  
  207.         if i < #Value and
  208.  
  209.            l:sub(-1) ~= ' ' and
  210.  
  211.            not (l:sub(-1) .. Value[i+1]:sub(1,1)):match"[^%w_]" then
  212.  
  213.           Value[i] = l .. ' '
  214.  
  215.         end
  216.  
  217.       end
  218.  
  219.       return table.concat(Value, '')
  220.  
  221.     end -- CurrValue
  222.  
  223.     local function FindMacro(key)
  224.  
  225.       local function KeyMatch(k,kk)
  226.  
  227.         if kk:sub(1,1) == '/' then
  228.  
  229.           return not not regex.match(kk,k)
  230.  
  231.         else
  232.  
  233.           return not not (' '..kk..' '):find(' '..k..' ',1,true)
  234.  
  235.         end
  236.  
  237.       end
  238.  
  239.       for Scr in mf.EnumScripts("Macro") do
  240.  
  241.         if Scr.area == "Editor" and not Scr.disabled and KeyMatch(key, Scr.key) then return true end
  242.  
  243.       end
  244.  
  245.     end
  246.  
  247.     local key, EditorID = Rec.Key, Rec.EditorID
  248.  
  249.     local aSave
  250.  
  251.     local function CalcPos(Line, Char)
  252.  
  253.       local iPos = 0
  254.  
  255.       for i=1,Line-1 do
  256.  
  257.         local l = editor.GetString(EditorID, i, 3)
  258.  
  259.         iPos = iPos + l:len() + (l:sub(-1)==' ' and 0 or 1)
  260.  
  261.       end
  262.  
  263.       return iPos + Char
  264.  
  265.     end -- CalcPos
  266.  
  267.     local function MoveCursor()
  268.  
  269.       local iPos = CalcPos(Editor.CurLine, Editor.CurPos)
  270.  
  271.       panel.SetCmdLinePos(nil, iPos)
  272.  
  273.     end -- MoveCursor
  274.  
  275.     local function SelCmdLine()
  276.  
  277.       local aSel = editor.GetSelection(EditorID)
  278.  
  279.       local SelStart, SelEnd  = CalcPos(aSel.StartLine, aSel.StartPos), CalcPos(aSel.EndLine, aSel.EndPos)
  280.  
  281.       panel.SetCmdLineSelection(EditorID, SelStart, SelEnd)
  282.  
  283.     end
  284.  
  285.     local function EdToCmdLine(ArgKey)
  286.  
  287.       local Value, iPos, SelStart, SelEnd = CurrValue(), CalcPos(Editor.CurLine, Editor.CurPos), 0, 0
  288.  
  289.       local function AddHistory(sAdd)
  290.  
  291.         local AddHistoryRet = false
  292.  
  293.         local function DlgFill(a)
  294.  
  295.           for i=1,6 do if a[i] == nil then a[i] = 0 end end
  296.  
  297.           return a
  298.  
  299.         end
  300.  
  301.         local xDlg, yDlg = CurrCursorPos()
  302.  
  303.         local aDlg = {
  304.  
  305.           DlgFill{F.DI_TEXT,1,0,sAdd:len()+1,0,[10]=sAdd};
  306.  
  307.           DlgFill{F.DI_EDIT,1,0,1,0,[10]=sAdd:sub(1,1)};
  308.  
  309.         }
  310.  
  311.  
  312.  
  313.     far.Dialog('',xDlg,yDlg,xDlg+sAdd:len(),yDlg,nil,aDlg,bor(F.FDLG_KEEPCONSOLETITLE,F.FDLG_NODRAWSHADOW,F.FDLG_SMALLDIALOG,F.FDLG_NODRAWPANEL),
  314.  
  315.       function(hDlg, Msg, Param1, Param2)
  316.  
  317.         if Msg == F.DN_INITDIALOG then
  318.  
  319.           hDlg:send(F.DM_EDITUNCHANGEDFLAG, 2, 0)
  320.  
  321.           hDlg:send(F.DM_SETEDITPOSITION, 2, {CurPos=1})
  322.  
  323.         elseif Msg == F.DN_CTLCOLORDLGITEM then
  324.  
  325.           --local Clr = far.AdvControl(F.ACTL_GETCOLOR, far.Colors.COL_EDITORTEXT)
  326.  
  327.           --Clr.ForegroundColor = 13
  328.  
  329.           --Clr.BackgroundColor = bor(Clr.BackgroundColor, 8)
  330.  
  331.           local Clr = far.AdvControl(F.ACTL_GETCOLOR, far.Colors.COL_MENUHIGHLIGHT)
  332.  
  333.           for i=1, #Param2 do Param2[1] = Clr end
  334.  
  335.           return Param2
  336.  
  337.         elseif Msg == F.DN_CONTROLINPUT
  338.  
  339.                and (Param2.EventType == F.KEY_EVENT) then
  340.  
  341.           local sKey = far.InputRecordToName(Param2)
  342.  
  343.           if sKey then
  344.  
  345.             if ((sKey:gsub('[LR]?Shift','')):gsub('[LR]?Alt','')):gsub('[LR]?Ctrl','') == '' then return end
  346.  
  347.             if sKey == 'Tab' or sKey == 'End' then
  348.  
  349.               editor.SetString(EditorID, 0, Editor.GetStr() .. sAdd)
  350.  
  351.               editor.SetPosition(EditorID, {CurPos = Editor.GetStr():len()+1})
  352.  
  353.             elseif sKey == 'Right' then
  354.  
  355.               editor.SetString(EditorID, 0, Editor.GetStr() .. sAdd:sub(1,1))
  356.  
  357.               Value = Value .. sAdd:sub(1,1)
  358.  
  359.               iPos = iPos + 1
  360.  
  361.               panel.SetCmdLine(nil, Value)
  362.  
  363.               panel.SetCmdLinePos(nil, panel.GetCmdLinePos(nil)+1)
  364.  
  365.               sAdd = sAdd:sub(2)
  366.  
  367.               editor.SetPosition(EditorID, {CurPos = iPos})
  368.  
  369.               hDlg:send(F.DM_RESIZEDIALOG, 0, {X=sAdd:len(),Y=0})
  370.  
  371.               hDlg:send(F.DM_MOVEDIALOG, 0, {X=1,Y=0})
  372.  
  373.               hDlg:send(F.DM_SETTEXT,1,sAdd)
  374.  
  375.               hDlg:send(F.DM_SETTEXT,2,sAdd:sub(1,1))
  376.  
  377.               return true
  378.  
  379.             elseif sKey == 'CtrlEnd' or sKey == 'CtrlSpace' then
  380.  
  381.               AddHistoryRet = true
  382.  
  383.             elseif sKey ~= 'Esc' then
  384.  
  385.               editor.ProcessInput(nil,Param2)
  386.  
  387.             elseif sKey == 'CtrlTab' then
  388.  
  389.               mf.postmacro(editor.ProcessInput, Param2)
  390.  
  391.             end
  392.  
  393.             hDlg:send(F.DM_CLOSE)
  394.  
  395.             return true
  396.  
  397.           end -- id sKey
  398.  
  399.         end
  400.  
  401.       end
  402.  
  403.     )
  404.  
  405.     return AddHistoryRet
  406.  
  407.   end -- AddHistory
  408.  
  409.   --local Value, iPos, SelStart, SelEnd = CurrValue(), CmdLine.CurPos, 0, 0
  410.  
  411.   local aSel = editor.GetSelection(EditorID)
  412.  
  413.   for i=1, Editor.Lines do
  414.  
  415.     local l = editor.GetString(EditorID, i, 3)
  416.  
  417.     if i < Editor.Lines and l:sub(-1) ~= ' ' then l = l .. ' ' end
  418.  
  419.     if i < Editor.CurLine then iPos = iPos + l:len() end
  420.  
  421.     if aSel then
  422.  
  423.       if i < aSel.StartLine then SelStart = iPos + l:len() end
  424.  
  425.       if i < aSel.EndLine then SelEnd = iPos + l:len() end
  426.  
  427.     end
  428.  
  429.   end
  430.  
  431.   if aSel then
  432.  
  433.     SelStart = SelStart + aSel.StartPos
  434.  
  435.     SelEnd = SelEnd + aSel.EndPos
  436.  
  437.   end
  438.  
  439.   if
  440.  
  441.      --ArgKey ~= '|BS|' and
  442.  
  443.      (Value:len() >= Cfg.AutoCompl_Start or ArgKey == '') and
  444.  
  445.      Editor.CurLine == Editor.Lines and
  446.  
  447.      Editor.CurPos == Editor.GetStr(Editor.Lines):len()+1
  448.  
  449.   then
  450.  
  451.     for i=#CmdHistory, 1, -1 do
  452.  
  453.       if mf.index(CmdHistory[i], Value) == 0 and CmdHistory[i]:len() > Value:len() then -- Чтоб поиск в истории был регистронезависимым
  454.  
  455.         local sAdd = CmdHistory[i]:sub(Value:len()+1)
  456.  
  457.         if not AddHistory(sAdd) then break end
  458.  
  459.       end
  460.  
  461.     end
  462.  
  463.   end
  464.  
  465.   panel.SetCmdLine(nil, Value)
  466.  
  467.   panel.SetCmdLinePos(nil, iPos)
  468.  
  469.   if aSel and aSel.BlockType == F.BTYPE_STREAM then
  470.  
  471.     panel.SetCmdLineSelection(nil, SelStart, SelEnd)
  472.  
  473.   end
  474.  
  475. end -- EdToCmdLine
  476.  
  477. if MoveKeys:find(key,1,true) or
  478.  
  479.    SelectKeys:find(key,1,true) then
  480.  
  481.   if SelectKeys:find(key,1,true) then
  482.  
  483.     mf.postmacro(function()MoveCursor(); SelCmdLine(); end)
  484.  
  485.   else
  486.  
  487.     mf.postmacro(MoveCursor)
  488.  
  489.   end
  490.  
  491. elseif TerminateKeys:find(key,1,true) then
  492.  
  493.   aSave = aEditors[tostring(EditorID)]
  494.  
  495.   local bQuit = true
  496.  
  497.   if key == '|Esc|' then
  498.  
  499.     local iCh
  500.  
  501.     local State = editor.GetInfo(EditorID).CurState
  502.  
  503.     if band(State, F.ECSTATE_MODIFIED) == F.ECSTATE_MODIFIED and
  504.  
  505.        band(State, F.ECSTATE_SAVED) == 0 then
  506.  
  507.       --iCh = far.Message("Что делать?", "Выход", "Ничего не делать;Восстановить ком. строку;Экспортировать", 'w')
  508.  
  509.       mf.postmacro(Keys, 'Tab')
  510.  
  511.       iCh = far.Message("Что делать?", "Выход", "Экспортировать;Восстановить ком. строку;Вернуться в редактор", 'w')
  512.  
  513.     else
  514.  
  515.       iCh = 1
  516.  
  517.     end
  518.  
  519.     if iCh == 2 then
  520.  
  521.       panel.SetCmdLine(nil, aSave.Value)
  522.  
  523.       panel.SetCmdLineSelection(nil, aSave.SelStart, aSave.SelEnd)
  524.  
  525.       panel.SetCmdLinePos(nil, aSave.Pos)
  526.  
  527.     elseif iCh ~= 1 then
  528.  
  529.       bQuit = false
  530.  
  531.     end
  532.  
  533.   end
  534.  
  535.   if bQuit then
  536.  
  537.     aEditors[tostring(EditorID)] = nil
  538.  
  539.     mf.postmacro(editor.Quit, EditorID)
  540.  
  541.   end
  542.  
  543.   return true
  544.  
  545. elseif ChangingKey(key) then -- Изменение
  546.  
  547.   mf.postmacro(EdToCmdLine, key)
  548.  
  549. elseif ('|CtrlSpace|CtrlEnd|'):find(key,1,true) then
  550.  
  551.   mf.postmacro(EdToCmdLine, '')
  552.  
  553. elseif key == '|AltDown|' then
  554.  
  555.   if Editor.CurLine == Editor.Lines and
  556.  
  557.      Editor.CurPos == Editor.GetStr(Editor.Lines):len()+1 then  -- в конце последней строки
  558.  
  559.     local Value = CurrValue()
  560.  
  561.     if next(CmdHistory) then
  562.  
  563.       local aMenu = {}
  564.  
  565.       --for i=#CmdHistory,1,-1 do
  566.  
  567.       for i=1, #CmdHistory do
  568.  
  569.         if mf.index(CmdHistory[i], Value) == 0 then
  570.  
  571.           --aMenu[#aMenu+1] = CmdHistory[i]
  572.  
  573.           aMenu[#aMenu+1] = {text=CmdHistory[i]}
  574.  
  575.         end
  576.  
  577.       end
  578.  
  579.       if next(aMenu) then
  580.  
  581.         --Menu.Show(table.concat(aMenu, '\n'), ' История: ', 0x3) -- far.Menu
  582.  
  583.         local XMenu, YMenu = CurrCursorPos()
  584.  
  585.         local aSel =
  586.  
  587.           far.Menu({ Title = 'История команд:';
  588.  
  589.                      SelectIndex = #aMenu;
  590.  
  591.                      X=XMenu+1; Y=YMenu;
  592.  
  593.                      MaxHeight = 10;
  594.  
  595.                    },
  596.  
  597.                    aMenu)
  598.  
  599.         if aSel then
  600.  
  601.           aSel = aSel.text:sub(Value:len()+1)
  602.  
  603.           local NewPos = {CurLine=Editor.Lines; CurPos=Editor.CurPos + aSel:len()}
  604.  
  605.           Editor.SetStr(Editor.GetStr() .. aSel)
  606.  
  607.           editor.SetPosition(EditorID, NewPos)
  608.  
  609.           mf.postmacro(EdToCmdLine, '')
  610.  
  611.         end
  612.  
  613.       end
  614.  
  615.       --CmdHistory
  616.  
  617.     end
  618.  
  619.   end -- в конце последней строки
  620.  
  621.   return true
  622.  
  623. elseif key== '|F1|' then
  624.  
  625.   return
  626.  
  627.   far.Message([[
  628.  
  629.   Изменение позиции, отметки и содержимого отражается в комстроке немедленно.
  630.  
  631.   Для выхода с сохранением нажмите F10.
  632.  
  633.   Для восстановления первоначальной комстроки выходите из редактора по Esc.
  634.  
  635.   Если редактор содержит несколько строк, то ко всем строкам, кроме последней,
  636.  
  637. дописывается пробел, если они не оканечиваются пробелом.
  638.  
  639.   Кодовая страница выставляется такой же, каку консоли.
  640.  
  641.  
  642.  
  643.     Работа с историей команд.
  644.  
  645.     -------------------------
  646.  
  647.   В процессе вврда команды проверяется история команд. Если в истории команд
  648.  
  649. имеются начинающиеся с уже введённой части, то окончание дописывается к
  650.  
  651. введённой команде. В этом контексте доступны клавиши:  - занести один символ;
  652.  
  653. End - занести всю команду из истории; Esc - погасить историю; Ctrl+Space или
  654.  
  655. Ctrl+End - подставить следующую подходящую команду.
  656.  
  657.   В любой момент можно нажать Alt+ для выбора команды из списка.
  658.  
  659. ]],
  660.  
  661.       "Редактирование командной строки в редакторе", "Понятно;Справка по редактору", 'l') ~= 2
  662.  
  663.     else
  664.  
  665.       return not ( OperatingFuncKeys:find(key,1,true) --key:match"^|F%d%d?|$"
  666.  
  667.                    or FindMacro(key:sub(2,-2) ) )
  668.  
  669.     end
  670.  
  671.   end; -- action
  672.  
  673. }
  674.  
  675.  
или во вложении:
EditCmdLine.lua
(15.04 KiB) Downloaded 83 times
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Содержимое командной строки в редактор и обратно

Post by buniak_a_h »

Выпустил новую (последнюю, вроде) версию скрипта. В голову больше ничего не приходит (кроме оформления, создания hlf-файла и локализации). Это я сделаю только если будет желание, опубликованное здесь.
Что нового в этой версии:
  1. два режима фильтрации истории команд для выбора: CtrlDown - по вхождению; AltDown - по началу;
  2. если в редакторе отмечен текст на одной строке, то для фильтрации используется именно он. Удобно, например, если нужно сформировать такую строку:
    lua:=mf.fsplit(APanel.Current, 12), far.ProcessName('PN_CMPNAMELIST', '<audio>', APanel.Current) и при этом в истории есть и первое, и второе выражение;
  3. реализована "зачаточная" настройка: можно указать количество символов, после которых начинается поиск для автодополнения из истории команд. Также можно совсем выключить автодополнение (указать количество символов = 0). Настройка вызывается как из диалога Options -> Plugins configuration, так и непосредственно из редактора по F9.
EditCmdLine.lua
Качать отсюда
(19.23 KiB) Downloaded 86 times
Last edited by buniak_a_h on Mon 24 Oct, 2022 05:17, edited 1 time in total.
User avatar
Taciturn
Posts: 603
Joined: Thu 26 May, 2005 17:14
Location: Санкт-Петербург
Has thanked: 89 times
Been thanked: 31 times
Contact:

Содержимое командной строки в редактор и обратно

Post by Taciturn »

Может пора большую часть сообщений выделить в отдельную в тему в Полезных макросах? Мой изначальный вопрос был успешно решён третьим сообщением в теме.
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Содержимое командной строки в редактор и обратно

Post by HaRT »

buniak_a_h wrote: Mon 24 Oct, 2022 05:15 Выпустил новую (последнюю, вроде) версию скрипта
Taciturn, Я перенёс всю тему (сообразно своему разумению). buniak_a_h, если вы готовы оформить шапку, я организую для вас заглавное сообщение. Хотя, пожалуй, лучше просто добавлю в первое сообщение ссылку на процитированный релиз.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Содержимое командной строки в редактор и обратно

Post by buniak_a_h »

HaRT, я думал опубликовать скрипт в "обсуждениях" в случае, если кто-нить про последнюю версию что-то напишет. Ну и для публикации оформил бы (вызов Info для Macro browser alt, hlf и lng). Просто не было реакции, я и забросил. Просто для меня полезность этого скрипта остаётся сомнительной. Теоретически - да, а практически как-то обходился…
User avatar
Alexander84
Posts: 150
Joined: Fri 01 May, 2009 06:38
Has thanked: 17 times
Been thanked: 2 times

Содержимое командной строки в редактор и обратно

Post by Alexander84 »

buniak_a_h wrote: Sat 29 Oct, 2022 17:51 Просто для меня полезность этого скрипта остаётся сомнительной.
У меня экран в ширину небольшой, кегль шрифта в ConEmu+Far 14–15.
Часто пользуюсь утилитами вроде ffmpeg, imagemagick, ripgrep и т.п.
Со всеми командами набегает пара-тройка экранов в ширину, особенно с цепочками |
Чтобы где-то поправить, надо елозить по строке ввода с помощью Ctrl+стрелки.
Поэтому, конечно, хочется иметь альтернативный способ ввода, чтобы видеть всё разом.
Last edited by Alexander84 on Fri 25 Nov, 2022 10:52, edited 3 times in total.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Содержимое командной строки в редактор и обратно

Post by buniak_a_h »

Alexander84, объяснили. Я забыл, что кроме компа бывают всякие гаджеты типа планшетов-смартфонов.
Вам для работы хватит того, что уже есть, или действительно стоит оформить хелп и опубликовать в обсуждениях?
Last edited by buniak_a_h on Fri 25 Nov, 2022 11:27, edited 1 time in total.
Post Reply

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