Странности активации макросов при удерживании Ctrl/Alt/Shift

Здесь обсуждается всё, что касается макросов.
User avatar
HaRT
Moderator
Posts: 8048
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

LuaMacro — Lua как язык макросов

Post by HaRT » Wed 29 Oct, 2014 15:55

Latest post of the previous page:

Maximus5 wrote: При быстрых нажатиях эти "отпущенные" клавиши будут постоянно меняться... А потом кто-то будет ругаться что не тот макрос срабатывает.
Вариантов не так много, т.ч. когда без разницы, несложно назначить все.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 11125
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 71 times

LuaMacro — Lua как язык макросов

Post by John Doe » Thu 30 Oct, 2014 16:11

HaRT, можете развёрнуто объяснить свою позицию?

User avatar
HaRT
Moderator
Posts: 8048
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

LuaMacro — Lua как язык макросов

Post by HaRT » Thu 30 Oct, 2014 16:21

John Doe wrote: можете развёрнуто объяснить свою позицию?
По какому вопросу?
Я могу попытаться ответить на несколько. Притом не факт, что сейчас для меня важно то же, что было важно когда-то.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 11125
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 71 times

LuaMacro — Lua как язык макросов

Post by John Doe » Thu 30 Oct, 2014 17:29

HaRT wrote: По какому вопросу?
Стоит ли придавать значение порядку нажатия/отпускания отдельных клавиш комбинации?

User avatar
John Doe
Бюрократ
Posts: 11125
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 71 times

MacroEx — запуск макросов нетрадиционными способами

Post by John Doe » Thu 28 Jul, 2016 20:19

sToLp wrote: Поэтому весьма желательно, чтобы макросы и на двойное нажатие на CtrlAlt, CtrlShift и AltShift тоже появились бы.
Предлагаю быстрый и грязный proof of concept
  1. local F = far.Flags
  2. local mods = {}
  3. for i,v in ipairs{"Ctrl","Alt"} do
  4.   local r = far.NameToInputRecord(v)
  5.   mods[r.VirtualKeyCode] = true
  6. end
  7. local mask = bor(F.LEFT_ALT_PRESSED,F.RIGHT_ALT_PRESSED,F.LEFT_CTRL_PRESSED,F.RIGHT_CTRL_PRESSED,F.SHIFT_PRESSED)
  8. local CtrlAlt = bor(F.LEFT_ALT_PRESSED,F.LEFT_CTRL_PRESSED)
  9. local wait
  10. Event{
  11.   group="ConsoleInput";
  12.   description="CtrlAlt";
  13.   id="2EEE56E1-228B-4087-B583-6E0612E6DF0B";
  14.   action=function(r)
  15.     if r.EventType~=F.KEY_EVENT then
  16.       return
  17.     elseif wait then
  18.       if mods[r.VirtualKeyCode] then
  19.         if not r.KeyDown then
  20.           wait = false
  21.           mf.postmacro(mf.eval,"CtrlAlt",2)
  22.         end
  23.       else
  24.         wait = false
  25.       end
  26.     elseif mods[r.VirtualKeyCode] then
  27.       if r.KeyDown and band(mask,r.ControlKeyState)==CtrlAlt then wait = true end
  28.     end
  29.   end;
  30. }
  31.  
  32. Macro { description="CtrlAlt sample";
  33.   area="Common"; key="CtrlAlt";
  34.   id="D1A40884-785D-4996-A71B-4FB05296A571";
  35.   action=function()
  36.     far.Message(mf.akey(1,1),Area.Current)
  37.   end;
  38. }
(с двойным нажатием скомбинируйте самостоятельно, я не проверял)

User avatar
John Doe
Бюрократ
Posts: 11125
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 71 times

MacroEx — запуск макросов нетрадиционными способами

Post by John Doe » Thu 28 Jul, 2016 23:09

Усовершенствованная версия.
  1. local F = far.Flags
  2. local mods = {[0x11]="Ctrl",[0x12]="Alt",[0x10]="Shift"}
  3. local A,rA,C,rC,S = F.LEFT_ALT_PRESSED,F.RIGHT_ALT_PRESSED,F.LEFT_CTRL_PRESSED,F.RIGHT_CTRL_PRESSED,F.SHIFT_PRESSED
  4. local mask = bor(A,rA,C,rC,S)
  5.  
  6. local keys = {
  7.  
  8.   --[[
  9.   [c]="Ctrl",
  10.   [rC]   ="RCtrl",
  11.   [A]    ="Alt",
  12.   [rA]   ="RAlt",
  13.   [S]    ="Shift",
  14.   --]]
  15.  
  16.   [C+A]  ="CtrlAlt",
  17.   [C+rA] ="CtrlRAlt",
  18.   [rC+A] ="RCtrlAlt",
  19.   [rC+rA]="RCtrlRAlt",
  20.   [A+rA] ="LRAlt",
  21.   [C+rC] ="LRCtrl",
  22.  
  23.   [C+S]  ="CtrlShift",
  24.   [rC+S] ="RCtrlShift",
  25.   [A+S]  ="AltShift",
  26.   [rA+S] ="RAltShift",
  27.  
  28.   [C+A+S]  ="CtrlAltShift",
  29.   [C+rA+S] ="CtrlRAltShift",
  30.   [rC+A+S] ="RCtrlAltShift",
  31.   [rC+rA+S]="RCtrlRAltShift",
  32.   [A+rA+S] ="LRAltShift",
  33.   [C+rC+S] ="LRCtrlShift",
  34. }
  35.  
  36. local wait
  37. Event{
  38.   group="ConsoleInput";
  39.   description="CtrlAlt";
  40.   id="2EEE56E1-228B-4087-B583-6E0612E6DF0B";
  41.   action=function(r)
  42.     if r.EventType~=F.KEY_EVENT then
  43.       return
  44.     elseif mods[r.VirtualKeyCode] then
  45.       if r.KeyDown then
  46.         wait = band(mask,r.ControlKeyState)
  47.         if not keys[wait] then wait = false end --to filter single mods
  48.       elseif wait then
  49.         mf.postmacro(mf.eval,keys[wait],2)
  50.         wait = false
  51.       end
  52.     else
  53.       wait = false
  54.     end
  55.   end;
  56. }
  57.  
  58. Macro { description="CtrlAlt sample";
  59.   area="Common"; key="CtrlAlt LRCtrl LRAlt CtrlShift AltShift CtrlAltShift LRCtrlShift LRAltShift";
  60.   id="D1A40884-785D-4996-A71B-4FB05296A571";
  61.   action=function()
  62.     far.Message(mf.akey(1,1),Area.Current)
  63.   end;
  64. }
Теперь различаются все комбинации правых и левых Ctrl/Alt, включая LRCtrl (LCtrl+RCtrl) и LRAlt (LAlt+RAlt)

P.S.
Аналогичным образом и Shift можно добавить, но.. полноценной реализации в фаре данный скрипт не заменит.
Например по waitkey получить всё ещё ничего невозможно..

Update
Добавлена обработка всех комбинаций с Shift.

Post Reply

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