Командная строка в редакторе по Ctrl+O

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

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »


Реализовано:
1. В редакторе Ctrl+O не просто показывает экран консоли, а переключает в область панелей, при необходимости гася их.
2. Повторное нажатие Ctrl+O возвращает управление в редактор. Вернуться также можно клавишей Esc при пустой командной строке. При этом набранная командная строка сохраняется.
3. Если в "исходном" редакторе есть отмеченный текст, то по клавише Ctrl+V он вставляется в командную строку

В этой версии:
Версия 1.0.5:
  1. Для раскраски неизменённого текста использована "прозрачность" :-)
  2. Исправлена ошибка, из-за которой в команду помещался заголовок диалога.


Скрипт:
EditorToCmdLine.lua.1_0_5.7z
Версия 1.0.5.
(4.22 KiB) Downloaded 161 times
Last edited by buniak_a_h on Fri 02 Jul, 2021 16:46, edited 9 times in total.
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »

Latest post of the previous page:

Ещё небольшое улучшение всё того же скрипта. Теперь если в исходном редакторе есть отмеченный текст, то по Alt+C он вставляется в командную строку.
*)Исходный редактор - редактор, из которого вызвано окно Shell с командной строкой
  1. local F = far.Flags
  2.  
  3. local EdiStack = {}
  4.  
  5. ----------------- Переключение на панели ------------------
  6.  
  7. Macro{
  8.  
  9.   id="FD02076B-828F-475A-A19E-95B99199DE5D";
  10.  
  11.   area="Editor";
  12.  
  13.   key="CtrlO";
  14.  
  15.   description="Командная строка в редакторе по Ctrl+O";
  16.  
  17.   url=[[https://forum.farmanager.com/viewtopic.php?p=166999#p166999]];
  18.  
  19.   flags="";
  20.  
  21.   condition = function() return not next(EdiStack) end;
  22.  
  23.   action=function(data)
  24.  
  25.    local wi = far.AdvControl(F.ACTL_GETWINDOWINFO)
  26.  
  27.    EdiStack[#EdiStack+1] = {Type=wi.Type; Id=wi.Id}
  28.  
  29.    for i=1,far.AdvControl(F.ACTL_GETWINDOWCOUNT) do
  30.  
  31.     wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  32.  
  33.     if wi.Type == F.WTYPE_PANELS then
  34.  
  35.      far.AdvControl(F.ACTL_SETCURRENTWINDOW, wi.Pos)
  36.  
  37.      EdiStack[#EdiStack].NeedOnOff = APanel.Visible or PPanel.Visible
  38.  
  39.      if EdiStack[#EdiStack].NeedOnOff then Keys"CtrlO" end
  40.  
  41.      return
  42.  
  43.     end
  44.  
  45.    end
  46.  
  47.   end;
  48.  
  49. }
  50.  
  51. ------------------ Восстановление в редактор ------------------
  52.  
  53. Macro{
  54.  
  55.   id="4AF3D4C8-5A89-40ED-8407-F7EBFAA3C416";
  56.  
  57.   area="Shell";
  58.  
  59.   key="CtrlO";
  60.  
  61.   description="Восстановление редактора по CtrlO";
  62.  
  63.   condition=function() return not not next(EdiStack) end;
  64.  
  65.   action=function(data)
  66.  
  67.    -- 1. Восстановление видимости панелей
  68.  
  69.    if EdiStack[#EdiStack].NeedOnOff then Keys"CtrlO" end
  70.  
  71.    -- 2. Возврат к редактору
  72.  
  73.    local wi
  74.  
  75.    for i=1,far.AdvControl(F.ACTL_GETWINDOWCOUNT) do
  76.  
  77.     wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  78.  
  79.     if wi.Type == EdiStack[#EdiStack].Type and
  80.  
  81.        wi.Id == EdiStack[#EdiStack].Id then
  82.  
  83.      far.AdvControl(F.ACTL_SETCURRENTWINDOW, wi.Pos)
  84.  
  85.      break
  86.  
  87.     end
  88.  
  89.    end
  90.  
  91.    table.remove(EdiStack)
  92.  
  93.   end;
  94.  
  95. }
  96.  
  97. ----------------- Обработка закрытия редактора --------------------------
  98.  
  99. NoEvent {
  100.  
  101.   id = "AA556FB4-5DF7-42D4-8CD6-DD177A725A7F";
  102.  
  103.   group       = "EditorEvent";
  104.  
  105.   description = "Закрытие редактора";
  106.  
  107.   action      = function(EditorID, Event, Param)
  108.  
  109.    for i,v in ipairs(EdiStack) do
  110.  
  111.     if v.Type == F.WTYPE_EDITOR and
  112.  
  113.        v.Id == EditorID then
  114.  
  115.      table.remove(EdiStack, i)
  116.  
  117.      break
  118.  
  119.     end
  120.  
  121.    end
  122.  
  123.   end;
  124.  
  125. }
  126.  
  127. ------------- Вставка отмеченного в комстроку -------------
  128.  
  129. -- Функция получения строки отмеченного
  130.  
  131. local function GetSel(EdId)
  132.  
  133.  local aSel = editor.GetSelection(EdId)
  134.  
  135.  if not aSel then return end
  136.  
  137.  if aSel.BlockType == F.BTYPE_COLUMN then
  138.  
  139.   local asSel = {}
  140.  
  141.   for i=aSel.StartLine, aSel.EndLine do
  142.  
  143.    asSel[#asSel+1] = editor.GetString(EdId, i, 3):sub(aSel.StartPos, aSel.EndPos)
  144.  
  145.   end
  146.  
  147.   return table.concat(asSel, '\n') .. '\n'
  148.  
  149.  elseif aSel.BlockType == F.BTYPE_STREAM then
  150.  
  151.   if aSel.EndLine == aSel.StartLine then
  152.  
  153.    return editor.GetString(EdId, aSel.StartLine, 3):sub(aSel.StartPos, aSel.EndPos)
  154.  
  155.   else
  156.  
  157.    local asSel = {editor.GetString(EdId, aSel.StartLine, 3):sub(aSel.StartPos)}
  158.  
  159.    for i=aSel.StartLine+1, aSel.EndLine-1 do
  160.  
  161.     asSel[#asSel+1] = editor.GetString(EdId, i, 3)
  162.  
  163.    end
  164.  
  165.    asSel[#asSel+1] =  editor.GetString(EdId, aSel.EndLine, 3):sub(1,aSel.EndPos)
  166.  
  167.    return table.concat(asSel, '\n')
  168.  
  169.   end
  170.  
  171.  else return
  172.  
  173.  end
  174.  
  175. end -- GetSel
  176.  
  177.  
  178.  
  179. Macro{
  180.  
  181.   id="5D5C23EA-097D-4416-A8F6-B448AD491111";
  182.  
  183.   area="Shell";
  184.  
  185.   key="AltC";
  186.  
  187.   description="Вставка отмеченного из редактора в комстроку";
  188.  
  189.   flags="";
  190.  
  191.   condition=function(key, data)
  192.  
  193.    if next(EdiStack) then
  194.  
  195.     local SelStr = GetSel(EdiStack[#EdiStack].Id)
  196.  
  197.     if SelStr then
  198.  
  199.      data.SelStr = SelStr
  200.  
  201.      return true
  202.  
  203.     end
  204.  
  205.    end
  206.  
  207.   end;
  208.  
  209.   action=function(data)
  210.  
  211.    print(data.SelStr)
  212.  
  213.   end;
  214.  
  215. }
ComStr.lua
(3.59 KiB) Downloaded 103 times
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

Командная строка в редакторе по Ctrl+O

Post by ujos »

Интересный кейс выплыл. Если попробовать внутри архива отредактировать файл и в редакторе нажать Ctrl+O, то консоль не появится.

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

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »

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

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »

С первым оказалось тоже просто: из архивов редактор открывается модально. Т.е. не даёт переключать на другие окна. В этом Вы можете убедиться просто открыв файл в архиве на редактирование и попробовав перейти н другое окно через список F12 или по CtrlTab. Так что вариантов нет - просто запрещу, если редактор модальный.
Last edited by buniak_a_h on Sat 26 Jun, 2021 16:56, edited 1 time in total.
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

Командная строка в редакторе по Ctrl+O

Post by ujos »

buniak_a_h wrote: Sat 26 Jun, 2021 16:55 Так что вариантов нет - просто запрещу, если редактор модальный.
Да, это как раз то, что нужно. Первый кейс абсолютно не мешает. Это ограничения самого ФАРа.
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

Командная строка в редакторе по Ctrl+O

Post by ujos »

buniak_a_h wrote: Sat 26 Jun, 2021 14:48 Теперь если в исходном редакторе есть отмеченный текст, то по Alt+C он вставляется в командную строку.
Почему Alt+C? Может Alt+V по аналогии с Ctrl+V?
Last edited by ujos on Sat 26 Jun, 2021 17:11, edited 2 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:

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »

ujos wrote: Sat 26 Jun, 2021 16:45 Если попробовать внутри архива отредактировать файл и в редакторе нажать Ctrl+O, то консоль не появится.
Возьмите скрипт, игнорируемый для модальных окон:
  1. local F = far.Flags
  2.  
  3. local EdiStack = {}
  4.  
  5. ----------------- Переключение на панели ------------------
  6.  
  7. Macro{
  8.  
  9.   id="FD02076B-828F-475A-A19E-95B99199DE5D";
  10.  
  11.   area="Editor";
  12.  
  13.   key="CtrlO";
  14.  
  15.   description="Командная строка в редакторе по Ctrl+O";
  16.  
  17.   url=[[https://forum.farmanager.com/viewtopic.php?p=166999#p166999]];
  18.  
  19.   flags="";
  20.  
  21.   condition = function(key, data)
  22.  
  23.    return not next(EdiStack) and band(far.AdvControl(F.ACTL_GETWINDOWINFO).Flags, F.WIF_MODAL) == 0
  24.  
  25.   end;
  26.  
  27.   action=function(data)
  28.  
  29.    local wi = far.AdvControl(F.ACTL_GETWINDOWINFO)
  30.  
  31.    EdiStack[#EdiStack+1] = {Type=wi.Type; Id=wi.Id}
  32.  
  33.    for i=1,far.AdvControl(F.ACTL_GETWINDOWCOUNT) do
  34.  
  35.     wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  36.  
  37.     if wi.Type == F.WTYPE_PANELS then
  38.  
  39.      far.AdvControl(F.ACTL_SETCURRENTWINDOW, wi.Pos)
  40.  
  41.      EdiStack[#EdiStack].NeedOnOff = APanel.Visible or PPanel.Visible
  42.  
  43.      if EdiStack[#EdiStack].NeedOnOff then Keys"CtrlO" end
  44.  
  45.      return
  46.  
  47.     end
  48.  
  49.    end
  50.  
  51.   end;
  52.  
  53. }
  54.  
  55. ------------------ Восстановление в редактор ------------------
  56.  
  57. Macro{
  58.  
  59.   id="4AF3D4C8-5A89-40ED-8407-F7EBFAA3C416";
  60.  
  61.   area="Shell";
  62.  
  63.   key="CtrlO";
  64.  
  65.   description="Восстановление редактора по CtrlO";
  66.  
  67.   condition=function() return not not next(EdiStack) end;
  68.  
  69.   action=function(data)
  70.  
  71.    -- 1. Восстановление видимости панелей
  72.  
  73.    if EdiStack[#EdiStack].NeedOnOff then Keys"CtrlO" end
  74.  
  75.    -- 2. Возврат к редактору
  76.  
  77.    local wi
  78.  
  79.    for i=1,far.AdvControl(F.ACTL_GETWINDOWCOUNT) do
  80.  
  81.     wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  82.  
  83.     if wi.Type == EdiStack[#EdiStack].Type and
  84.  
  85.        wi.Id == EdiStack[#EdiStack].Id then
  86.  
  87.      far.AdvControl(F.ACTL_SETCURRENTWINDOW, wi.Pos)
  88.  
  89.      break
  90.  
  91.     end
  92.  
  93.    end
  94.  
  95.    table.remove(EdiStack)
  96.  
  97.   end;
  98.  
  99. }
  100.  
  101. ----------------- Обработка закрытия редактора --------------------------
  102.  
  103. NoEvent {
  104.  
  105.   id = "AA556FB4-5DF7-42D4-8CD6-DD177A725A7F";
  106.  
  107.   group       = "EditorEvent";
  108.  
  109.   description = "Закрытие редактора";
  110.  
  111.   action      = function(EditorID, Event, Param)
  112.  
  113.    for i,v in ipairs(EdiStack) do
  114.  
  115.     if v.Type == F.WTYPE_EDITOR and
  116.  
  117.        v.Id == EditorID then
  118.  
  119.      table.remove(EdiStack, i)
  120.  
  121.      break
  122.  
  123.     end
  124.  
  125.    end
  126.  
  127.   end;
  128.  
  129. }
  130.  
  131. ------------- Вставка отмеченного в комстроку -------------
  132.  
  133. -- Функция получения строки отмеченного
  134.  
  135. local function GetSel(EdId)
  136.  
  137.  local aSel = editor.GetSelection(EdId)
  138.  
  139.  if not aSel then return end
  140.  
  141.  if aSel.BlockType == F.BTYPE_COLUMN then
  142.  
  143.   local asSel = {}
  144.  
  145.   for i=aSel.StartLine, aSel.EndLine do
  146.  
  147.    asSel[#asSel+1] = editor.GetString(EdId, i, 3):sub(aSel.StartPos, aSel.EndPos)
  148.  
  149.   end
  150.  
  151.   return table.concat(asSel, '\n') .. '\n'
  152.  
  153.  elseif aSel.BlockType == F.BTYPE_STREAM then
  154.  
  155.   if aSel.EndLine == aSel.StartLine then
  156.  
  157.    return editor.GetString(EdId, aSel.StartLine, 3):sub(aSel.StartPos, aSel.EndPos)
  158.  
  159.   else
  160.  
  161.    local asSel = {editor.GetString(EdId, aSel.StartLine, 3):sub(aSel.StartPos)}
  162.  
  163.    for i=aSel.StartLine+1, aSel.EndLine-1 do
  164.  
  165.     asSel[#asSel+1] = editor.GetString(EdId, i, 3)
  166.  
  167.    end
  168.  
  169.    asSel[#asSel+1] =  editor.GetString(EdId, aSel.EndLine, 3):sub(1,aSel.EndPos)
  170.  
  171.    return table.concat(asSel, '\n')
  172.  
  173.   end
  174.  
  175.  else return
  176.  
  177.  end
  178.  
  179. end -- GetSel
  180.  
  181.  
  182.  
  183. Macro{
  184.  
  185.   id="5D5C23EA-097D-4416-A8F6-B448AD491111";
  186.  
  187.   area="Shell";
  188.  
  189.   key="AltV";
  190.  
  191.   description="Вставка отмеченного из редактора в комстроку";
  192.  
  193.   flags="";
  194.  
  195.   condition=function(key, data)
  196.  
  197.    if next(EdiStack) then
  198.  
  199.     local SelStr = GetSel(EdiStack[#EdiStack].Id)
  200.  
  201.     if SelStr then
  202.  
  203.      data.SelStr = SelStr
  204.  
  205.      return true
  206.  
  207.     end
  208.  
  209.    end
  210.  
  211.   end;
  212.  
  213.   action=function(data)
  214.  
  215.    print(data.SelStr)
  216.  
  217.   end;
  218.  
  219. }
ujos wrote: Sat 26 Jun, 2021 17:10 Почему Alt+C? Может Alt+V по аналогии с Ctrl+V?
Мне на самом деле всё равно. Поначалу вообще хотел повесить на CtrlV, но будет путаться со вставкой из буфера.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »

P/S. Забыл указать, что заменил CtrlC на CtrlV
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

Командная строка в редакторе по Ctrl+O

Post by ujos »

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

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »

ujos wrote: Sat 26 Jun, 2021 18:03 Песня :-)
Работает очень круто
Я попробовал, мне тоже понравилось. Посему:
Может, имеет смысл оформить скрипт по правилам и образовать в подфоруме "обсуждение скриптов тему? А то я уже немного изменил, а в своей теме я был бы "хозяином" первого сообщения и мог бы в нём версии обновлять.
P/S. Администраторам. А вы можете сделать такой фокус: перенести эту тему в "обсуждение скриптов" и образовать первое сообщение (хоть пустое) от моего имени?
Last edited by buniak_a_h on Sun 27 Jun, 2021 08:47, edited 1 time in total.
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

Командная строка в редакторе по Ctrl+O

Post by ujos »

На Gitlab/Github надо бы залить еще.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »

ujos wrote: Sun 27 Jun, 2021 10:20 На Gitlab/Github надо бы залить еще.
Это (а) я не умею и (б) не зарегистрирован.
Если сообщение прочтут админы: закрепите, пож., первую запись. Она, вроде, лаконичная.
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

Командная строка в редакторе по Ctrl+O

Post by ujos »

buniak_a_h wrote: Sun 27 Jun, 2021 13:55 Это (а) я не умею и (б) не зарегистрирован.
Тут: https://github.com/ujos/farmanager-macros
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »

ujos, спасибо. НО …
Стал смотреть, и сразу наткнулся на выключенный мёртвый код (NoEvent …). Вспомнил, что кусок нужный, но не доделанный, а в том виде, что записан в скрипте, вызывал падение. Доделан и исправлен.
Кроме того у меня что-то с кодировкой. На экране - кракозябры в русских текстах.
А ещё на подходе аналогичное, но совершенно на других принципах: по Ctrl+Shift+O под редактором открывается диалог высотой в одну строку, в который можно писать собс-но командную строку (в перспективе - лист с несколькими командами) и по кнопке переход в панели, гашение и выполнение введённых команд.
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

Командная строка в редакторе по Ctrl+O

Post by ujos »

buniak_a_h wrote: Sun 27 Jun, 2021 17:33 Доделан и исправлен
Обновил файл.
ujos wrote: Sun 27 Jun, 2021 16:25(а) я не умею
Там особо ничего не нужно уметь. Достаточно зарегиться и файл можно редактировать прям в браузере.
buniak_a_h wrote: Sun 27 Jun, 2021 17:33 Кроме того у меня что-то с кодировкой
Нужно файл в формате UTF-8 сохранять. ФАР умеет открывать UTF8. Поправил.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Командная строка в редакторе по Ctrl+O

Post by buniak_a_h »

ujos wrote: Sun 27 Jun, 2021 19:04 Достаточно зарегиться
Вот этого-то и неохота.
ujos wrote: Sun 27 Jun, 2021 19:04 Нужно файл в формате UTF-8 сохранять. ФАР умеет открывать UTF8.
Я, вообще-то, закачивал файл в кодировке UTF-8. Если после закачивания файл перекодировался, я буду архивировать. Не проверял пока.
Post Reply

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