Улучшение макросов из поставки фара

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

Latest post of the previous page:

sToLp wrote: Mon 27 Nov, 2017 22:58однозначно лучше
Почему?
sToLp wrote: Mon 27 Nov, 2017 22:58было бы предпочтительнее привести комментарии
Вы можете поучаствовать, если есть желание.
sToLp wrote: Mon 27 Nov, 2017 22:58м.б. даже ко всем строкам кода.
Ко всем точно не надо, но улучшить читаемость можно, используя "говорящие" константы вместо числовых значений.
Last edited by John Doe on Tue 28 Nov, 2017 08:50, edited 1 time in total.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Улучшение макросов из поставки фара

Post by sToLp »

John Doe wrote: Tue 28 Nov, 2017 08:33
sToLp wrote: Mon 27 Nov, 2017 22:58однозначно лучше
Почему?
В предыдущей версии макроса погашенная панель может включиться даже если пользователь не намерен этого делать. А просто пощёлкает Tab`ом в меню и, не производя ни каких действий в панелях, выйдет из него.

Альтернативный же макрос включит погашенную панель только в том случае, когда пользователь выберет для данной панели действие, предусмотренное в меню дисков (сменить текущий диск, открыть панель плагина, выполнить помещённый в меню макрос). И это, по-моему, гораздо более дружественное поведение по отношению к пользователю.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

John Doe wrote: Tue 28 Nov, 2017 08:33Ко всем точно не надо, но улучшить читаемость можно, используя "говорящие" константы вместо числовых значений.

Code: Select all

	local APANEL = 0
	local CUR_ITEM = 0
	local MOD_TIME = 17
	local SELECT = 1
	local IDX = 1
	Macro { description="выделить все файлы/папки новее текущего";
	  area="Shell"; key="CtrlShiftAdd";
	  action=function()
	    local d = Panel.Item(APANEL,CUR_ITEM,MOD_TIME)
	    for i=1,APanel.ItemCount do
	      if Panel.Item(APANEL,i,MOD_TIME)>d then
	        Panel.Select(APANEL,SELECT,IDX,i)
	      end
	    end
	  end;
	}

Code: Select all

	local APANEL = 0
	local FILENAME,ATTRIB,SIZE,SELECTED = 0,2,6,8
	local DIRECTORY = 0x00000010
	local function isFolder(panel,idx)
	  return band(DIRECTORY,Panel.Item(panel,idx,ATTRIB))==DIRECTORY
	end
	local PUT,ADD = 1,2
	Macro { description="поместить в Clipboard список отмеченных файлов в формате CSV (имя и размер)";
	  area="Shell"; key="CtrlShiftIns";
	  action=function()
	    mf.clip(PUT,"Name;Size\r\n")
	    for i=1,APanel.ItemCount do
	      if not isFolder(APANEL,i) and Panel.Item(APANEL,i,SELECTED) then
	        mf.clip(ADD,Panel.Item(APANEL,i,FILENAME)..";"..Panel.Item(APANEL,i,SIZE).."\r\n")
	      end
	    end
	  end;
	}
Last edited by John Doe on Tue 28 Nov, 2017 19:38, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Улучшение макросов из поставки фара

Post by zg »

John Doe wrote: Tue 28 Nov, 2017 17:15Если перейти в панели QView (т.е. она будет на активной панели), и нажать CtrlQ, то панель станет файловой, но макрообласть не изменится!!
линейка функциональных клавиш тоже не изменится. и возможно что-то ещё. пишите на мантис.
Last edited by zg on Tue 28 Nov, 2017 19:39, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

https://github.com/FarGroup/FarManager/ ... creens.lua

Code: Select all

Macro {
  description="Use Alt-digit to switch between screens";
  area="Editor Viewer Shell QView Tree Info Desktop"; key="/[LR]Alt[0-9]/";
  flags="NoSendKeysToPlugins";
  action=function()
    local key = mf.akey(1,1):sub(-1)
    Keys("F12", Object.CheckHotkey(key)~=0 and key or "Esc")
  end;
}
  1. Учитывается случай, когда нажат хоткей, не имеющий соответствия в Screens
  2. Добавления/исправления в area
  3. Форматирование
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

Code: Select all

local APANEL = 0
local EXT,NAME = 8,4 --fsplit
local SELECTED = 8   --Panel.Item
local NAMES = 2      --Panel.Select
-- При непустой командной строке макрос не вызывается чтобы можно пользоваться первоначальной
-- функцией сочетания CtrlShiftIns - Поместить помеченные имена в Буфер Обмена
Macro { description="Пометить вместе с htm-файлом и парную ему папку";
  area="Shell"; key="CtrlShiftIns"; flags="EmptyCommandLine";
  action=function()
    local Current = APanel.Current
    local len = ("_files"):len()
    local Ext = Current:sub(-len)
    local Name
    if Ext=="_files" then
      Name = Current:sub(1,-len)
    else
      Ext = mf.fsplit(Current,EXT)
      Name = mf.fsplit(Current,NAME)
    end
    local pair1,pair2
    if Ext==".htm" or Ext==".html" then
      pair1,pair2 = ".files","_files"
    elseif Ext==".files" or Ext=="_files" then
      pair1,pair2 = ".htm",".html"
    end
    if pair1 then
      local action = Panel.Item(APANEL,0,SELECTED) and 0 or 1
      local items = { APanel.Current, Name..pair1, Name..pair2}
      Panel.Select(APANEL,action,NAMES,table.concat(items,"\n"))
    end
  end;
}
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

Code: Select all

	Macro {
	  description="Продолжить поиск/замену в обратном направлении [S&R]";
	  area="Editor"; key="AltF7";
	  action=function()
	    Keys("F11")
	    if Object.CheckHotkey("7")~=0 then
	      Keys("7 1")
	    else
	      Keys("Esc AKey")
	    end
	  end;
	}
Пример по нынешним временам не очень.
Как бы иначе проиллюстрировать Object.CheckHotkey?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

Планирую оформить все предложения в виде пуллреквеста.
Как лучше это сделать:
1. каждый макрос отдельно
2. все скопом
3. небольшие изменения - скопом, а те что могут вызвать вопросы - отдельно
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Улучшение макросов из поставки фара

Post by zg »

3.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

https://github.com/FarGroup/FarManager/ ... trlF10.lua

Code: Select all

if not panel.CheckPanelsExist() then return end -- far.exe -v -e
local F6_SWITCH_ALLOWED = 0x00000002
Macro {
  description="Quit from editor/viewer and position to the current file";
  area="Editor Viewer"; key="CtrlF10";
  flags="NoSendKeysToPlugins";
  condition=function()
    return band(Editor.State,F6_SWITCH_ALLOWED)~=0 -- check if CtrlF10 function is available
  end;
  action=function()
    Keys"CtrlF10 Esc"
    if Area.Editor or Area.Viewer or Area.Desktop then
      Keys"F12 1"
    end
  end;
}
  1. Если фар запущен в режиме редактора/вьюера, то не грузим макрос (не имеет смысла, панелей нет)
  2. Ctrl+F10 в некоторых случаях не работает, добавлен condition для проверки.
  3. После закрытия редактора/вьювера не всегда сразу попадаем в панели, добавлена обработка этого случая
Last edited by John Doe on Wed 05 Sep, 2018 16:34, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Улучшение макросов из поставки фара

Post by zg »

а почему не if not Area.Shell? хотя вообще проверка не нужна.
Last edited by zg on Wed 05 Sep, 2018 17:32, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

Нужна, потому что не факт что по Esc мы вообще выйдем, если например редактор не сохранён.

А вот пункт 2 мне помниться правили в фаре, но почему-то не работает.. Завтра перепроверю (может в модальности дело)
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Улучшение макросов из поставки фара

Post by zg »

не учтён случай немодального диалога.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

Это сознательно, поскольку довольно громоздко проверять (с привлечением апи плагинов), случай же в настоящий момент исключительно гипотетический.

Можно конечно жать F12 и по факту проверять открылся ли список экранов..
Last edited by John Doe on Wed 05 Sep, 2018 18:26, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

CtrlF10.lua
  1. if not panel.CheckPanelsExist() then return end -- far.exe -v -e
  2.  
  3.  
  4.  
  5. local F6_ALLOWED,MODAL = 0x00000002,0x00000800
  6.  
  7. local function CtrlF10_enabled()
  8.  
  9.   local State = Area.Viewer
  10.  
  11.             and band(Viewer.State,MODAL)
  12.  
  13.              -- CtrlF10 is forbidden in modal viewer
  14.  
  15.              or band(Editor.State,bor(F6_ALLOWED,MODAL))
  16.  
  17.              -- CtrlF10 is forbidden in modal editor,
  18.  
  19.              -- unless it opened with explicit EF_ENABLE_F6 flag
  20.  
  21.   return State~=MODAL                          
  22.  
  23. end
  24.  
  25.  
  26.  
  27. Macro {
  28.  
  29.   description="Quit from editor/viewer and position to the current file";
  30.  
  31.   area="Editor Viewer"; key="CtrlF10";
  32.  
  33.   flags="NoSendKeysToPlugins";
  34.  
  35.   condition=CtrlF10_enabled;
  36.  
  37.   action=function()
  38.  
  39.     Keys"CtrlF10 Esc F12"
  40.  
  41.     if Menu.Id==far.Guids.ScreensSwitchId then Keys"1" end
  42.  
  43.   end;
  44.  
  45. }
  1. Уточнена проверка доступности функции CtrlF10
  2. Вместо проверки макрообласти попытка переключения через Screens производится всегда (для упрощения кода)
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Улучшение макросов из поставки фара

Post by John Doe »

Немного обновлён Panel.AltBS.lua
Post Reply

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