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

Здесь обсуждается всё, что касается макросов.
User avatar
buniak_a_h
Posts: 4268
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 162 times
Last edited by buniak_a_h on Fri 02 Jul, 2021 16:46, edited 9 times in total.
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

ujos wrote: Thu 24 Jun, 2021 10:43 В редакторе Midnight Commander есть удобная фича. Когда редактируешь файл и нажимаешь Ctrl+O, то видишь консоль и получаешь еще командную строку. Удобно когда, к примеру, редактируешь какой-то конфиг или коммент к коммиту, нажимаешь Ctrl+O чтобы что-то проверить и запустить команду (напр git diff --staged), а потом по окончанию выполнения команды нажимаешь Ctrol+O и возвращаешься обратно в редактор.

В ФАРе чтобы такое провернуть, нужно нажать "F12, 1, Ctrl+O" - получаешь командную строку. Потом, чтобы вернуться, нужно жать "F12" и тут надо искать твое окно редактора - больше движений и поиска глазами.
ujos wrote: Thu 24 Jun, 2021 10:43 тут надо искать твое окно редактора - больше движений и поиска глазами.
Макросы же.
Но согласен, было бы круто иметь комстроку и в редакторе, со своими фишками, уже были такие пожелания (не помню зафиксировано ли на мантисе)
https://t.me/FarManager — Telegram чат
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

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

Post by ujos »

Макросами такое сделать даже не знаю как.

В редакторе (Ctrl+O)
1. Запомнить номер окна, из которого уходим в панели
2. Перейти в панели (F12 1)
3. Если панели включены, то отключить (Ctrl+O уже занято)

В панелях (Ctrl+O)
1. Если мы сюда пришли не из редатора, то тогда включаем панели (обычная реакция на Ctrl+O)
2. Иначе, если панели выключены и мы пришли из редактора
а. Вернуть состояние панелей (включить их, если они были выключены в пункте 3 выше)
б. Вернуться в окно редактора, из которого пришли
Last edited by ujos on Fri 25 Jun, 2021 18:58, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4268
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: Fri 25 Jun, 2021 12:53 Если мы сюда пришли не из редактора
1. Факт, что мы сюда пришли из редактора, проверить (запомнить) легко. НО! После этого можно было многократно вернуться в редактор, открыть другой, и даже вернуться в тот самый стандартным способом (CtrlTab) и закрыть его. Хотя можно, конечно, такие ситуации игнорировать, а при закрытии редактора вычёркивать его из стека возврата. Вроде, безопасно; в крайнем случае потеряется возможность возврата по CtrlO.
2. После перезагрузки макросов возможность возврата также потеряется. Не фатально…
Думаю, завтра сделаю. Может, и удобно будет…
User avatar
buniak_a_h
Posts: 4268
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. 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.      local ALeft = APanel.Left
  38.  
  39.      EdiStack[#EdiStack].ALeft = ALeft
  40.  
  41.      EdiStack[#EdiStack].LVis = (ALeft and APanel or PPanel).Visible
  42.  
  43.      EdiStack[#EdiStack].RVis = (ALeft and PPanel or APanel).Visible
  44.  
  45.      local phKeys = {}
  46.  
  47.      if EdiStack[#EdiStack].LVis then phKeys[#phKeys+1] = 'CtrlF1' end
  48.  
  49.      if EdiStack[#EdiStack].RVis then phKeys[#phKeys+1] = 'CtrlF2' end
  50.  
  51.      Keys(table.concat(phKeys, ' '))
  52.  
  53.      return
  54.  
  55.     end
  56.  
  57.    end
  58.  
  59.   end;
  60.  
  61. }
  62.  
  63. ------------------ Восстановление в редактор ------------------
  64.  
  65. Macro{
  66.  
  67.   id="4AF3D4C8-5A89-40ED-8407-F7EBFAA3C416";
  68.  
  69.   area="Shell";
  70.  
  71.   key="CtrlO";
  72.  
  73.   description="Восстановление редактора по CtrlO";
  74.  
  75.   condition=function() return not not next(EdiStack) end;
  76.  
  77.   action=function(data)
  78.  
  79.    -- 1. Восстановление видимости панелей
  80.  
  81.    local phKeys = {}
  82.  
  83.    if EdiStack[#EdiStack].LVis ~= (APanel.Left and APanel or PPanel).Visible then phKeys[#phKeys+1] = 'CtrlF1' end
  84.  
  85.    if EdiStack[#EdiStack].RVis ~= (APanel.Left and PPanel or APanel).Visible then phKeys[#phKeys+1] = 'CtrlF2' end
  86.  
  87.    -- 2. Восстановление активной панели (левая-правая)
  88.  
  89.    if EdiStack[#EdiStack].ALeft ~= APanel.Left then phKeys[#phKeys+1] = 'Tab' end
  90.  
  91.    Keys(table.concat(phKeys, ' '))
  92.  
  93.    -- 3. Возврат к редактору
  94.  
  95.    local wi
  96.  
  97.    for i=1,far.AdvControl(F.ACTL_GETWINDOWCOUNT) do
  98.  
  99.     wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  100.  
  101.     if wi.Type == EdiStack[#EdiStack].Type and
  102.  
  103.        wi.Id == EdiStack[#EdiStack].Id then
  104.  
  105.      far.AdvControl(F.ACTL_SETCURRENTWINDOW, wi.Pos)
  106.  
  107.      break
  108.  
  109.     end
  110.  
  111.    end
  112.  
  113.    table.remove(EdiStack)
  114.  
  115.   end;
  116.  
  117. }
  118.  
  119. ----------------- Обработка закрытия редактора --------------------------
  120.  
  121. NoEvent {
  122.  
  123.   id = "AA556FB4-5DF7-42D4-8CD6-DD177A725A7F";
  124.  
  125.   group       = "EditorEvent";
  126.  
  127.   description = "Закрытие редактора";
  128.  
  129.   action      = function(EditorID, Event, Param)
  130.  
  131.    for i,v in ipairs(EdiStack) do
  132.  
  133.     if v.Type == F.WTYPE_EDITOR and
  134.  
  135.        v.Id == EditorID then
  136.  
  137.      table.remove(EdiStack, i)
  138.  
  139.      break
  140.  
  141.     end
  142.  
  143.    end
  144.  
  145.   end;
  146.  
  147. }
Проверяйте…
User avatar
buniak_a_h
Posts: 4268
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

Хотя я бы, наверно, сделал немного не так… Создавал бы диалог в одну строку ввода и с одной кнопкой [ Run! ].
Но для такого очень не хватает Always on Top диалогов… Тогда появится возможность, например, копировать из редактора в комстроку…
Last edited by buniak_a_h on Fri 25 Jun, 2021 19:15, edited 1 time in total.
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

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

Post by ujos »

Вышло суперски! Спасибо больше!

Есть мелкое одно замечание - после закрытия редактора теряется фокус панели, т.е. фокус переходит с левой панели на правую.

Шаги воспроизведения

0. На левой панеле папка с файлами. На правой панеле корень диска С
1. На левой панеле открываем файл по F4
2. Нажимаем Ctrl+O - появляется командная строка
3. Нажимаем Ctrl+O - возвращаемся редактор
4. Нажимаем Esc - возвращаемся в панели

Результат: На выходе курсор уже стоит не на левой панеле, а на правой панели

Похоже, что "far.AdvControl(F.ACTL_SETCURRENTWINDOW, wi.Pos)" в макросе "Командная строка в редакторе по Ctrl+O" не просто показывает панели, а еще переинициализирует их
Last edited by ujos on Fri 25 Jun, 2021 22:54, edited 5 times in total.
User avatar
buniak_a_h
Posts: 4268
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: Fri 25 Jun, 2021 22:46 Похоже, что …, а еще переинициализирует их
Не, я там, скорее всего, лишнюю Tab засылаю. Я проверю, спасибо.
User avatar
buniak_a_h
Posts: 4268
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. 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.      local ALeft = APanel.Left
  38.  
  39.      EdiStack[#EdiStack].ALeft = ALeft
  40.  
  41.      EdiStack[#EdiStack].LVis = (ALeft and APanel or PPanel).Visible
  42.  
  43.      EdiStack[#EdiStack].RVis = (ALeft and PPanel or APanel).Visible
  44.  
  45.      local phKeys = {}
  46.  
  47.      if EdiStack[#EdiStack].LVis then phKeys[#phKeys+1] = 'CtrlF1' end
  48.  
  49.      if EdiStack[#EdiStack].RVis then phKeys[#phKeys+1] = 'CtrlF2' end
  50.  
  51.      Keys(table.concat(phKeys, ' '))
  52.  
  53.      return
  54.  
  55.     end
  56.  
  57.    end
  58.  
  59.   end;
  60.  
  61. }
  62.  
  63. ------------------ Восстановление в редактор ------------------
  64.  
  65. Macro{
  66.  
  67.   id="4AF3D4C8-5A89-40ED-8407-F7EBFAA3C416";
  68.  
  69.   area="Shell";
  70.  
  71.   key="CtrlO";
  72.  
  73.   description="Восстановление редактора по CtrlO";
  74.  
  75.   condition=function() return not not next(EdiStack) end;
  76.  
  77.   action=function(data)
  78.  
  79.    -- 1. Восстановление видимости панелей
  80.  
  81.    local phKeys = {}
  82.  
  83.    if EdiStack[#EdiStack].LVis ~= (APanel.Left and APanel or PPanel).Visible then phKeys[#phKeys+1] = 'CtrlF1' end
  84.  
  85.    if EdiStack[#EdiStack].RVis ~= (APanel.Left and PPanel or APanel).Visible then phKeys[#phKeys+1] = 'CtrlF2' end
  86.  
  87.    Keys(table.concat(phKeys, ' '))
  88.  
  89.    -- 2. Восстановление активной панели (левая-правая)
  90.  
  91.    if EdiStack[#EdiStack].ALeft ~= APanel.Left then Keys'Tab' end
  92.  
  93.    -- 3. Возврат к редактору
  94.  
  95.    local wi
  96.  
  97.    for i=1,far.AdvControl(F.ACTL_GETWINDOWCOUNT) do
  98.  
  99.     wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  100.  
  101.     if wi.Type == EdiStack[#EdiStack].Type and
  102.  
  103.        wi.Id == EdiStack[#EdiStack].Id then
  104.  
  105.      far.AdvControl(F.ACTL_SETCURRENTWINDOW, wi.Pos)
  106.  
  107.      break
  108.  
  109.     end
  110.  
  111.    end
  112.  
  113.    table.remove(EdiStack)
  114.  
  115.   end;
  116.  
  117. }
  118.  
  119. ----------------- Обработка закрытия редактора --------------------------
  120.  
  121. NoEvent {
  122.  
  123.   id = "AA556FB4-5DF7-42D4-8CD6-DD177A725A7F";
  124.  
  125.   group       = "EditorEvent";
  126.  
  127.   description = "Закрытие редактора";
  128.  
  129.   action      = function(EditorID, Event, Param)
  130.  
  131.    for i,v in ipairs(EdiStack) do
  132.  
  133.     if v.Type == F.WTYPE_EDITOR and
  134.  
  135.        v.Id == EditorID then
  136.  
  137.      table.remove(EdiStack, i)
  138.  
  139.      break
  140.  
  141.     end
  142.  
  143.    end
  144.  
  145.   end;
  146.  
  147. }
Ну, или для удобства скачивания
ComStr.lua
(2.83 KiB) Downloaded 85 times
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

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

Post by ujos »

Курсор теперь восстанавливается. Но похоже, что проблема в другом была, так как если в редакторе нажать Ctrl+O и потом в ком. строке ввести "dir", то выводится контент правой панели а не левой. Дело в том, как выключаются панели - сначала левая, потом правая. Надо одновременно, птому что выключение левой приводит к переносу курсора на правую, что приводит к смене текущей дериктории
Last edited by ujos on Sat 26 Jun, 2021 08:17, edited 2 times in total.
User avatar
buniak_a_h
Posts: 4268
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, да, я уже сообразил :-)
User avatar
buniak_a_h
Posts: 4268
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. 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. }
ComStr.lua
(2.17 KiB) Downloaded 90 times
ujos
Posts: 220
Joined: Fri 27 Apr, 2012 15:10
Has thanked: 10 times

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

Post by ujos »

Было бы хоршо в API FAR-a добавить команду выключения панелей напрямик, без использования Keys. Типа "far.Panels.Hide()". А то, мало ли что... кто-то возмет да поменяет сочетания клавишь.
User avatar
buniak_a_h
Posts: 4268
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

Есть таблица panel с кучей функций. Увы, SetVisible там нету :-(
Вообще я постоянно натыкаюсь на неполноту этих таблиц. Например, есть возможность получить ширину и высоту редактора, но нету левой и верхней границ. Хотя, казалось бы, проще было бы возвращать Rect. Есть panel.SetDirectoriesFirst (вкл/выкл режима "Каталоги впереди"), но нет SetSelectedFirst (отмеченные впереди), хотя функции просто из одной обоймы. Я когда-то просил, но опоздал - гуру перестал участвовать в разработке новенького.
User avatar
buniak_a_h
Posts: 4268
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

Ещё небольшое улучшение всё того же скрипта. Теперь если в исходном редакторе есть отмеченный текст, то по 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
Post Reply

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