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

Здесь обсуждается всё, что касается макросов.
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

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

Post by Maximus5 »

Latest post of the previous page:

При быстрых нажатиях эти "отпущенные" клавиши будут постоянно меняться... А потом кто-то будет ругаться что не тот макрос срабатывает.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

Maximus5 wrote: При быстрых нажатиях эти "отпущенные" клавиши будут постоянно меняться... А потом кто-то будет ругаться что не тот макрос срабатывает.
Вариантов не так много, т.ч. когда без разницы, несложно назначить все.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

HaRT, можете развёрнуто объяснить свою позицию?
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

John Doe wrote: можете развёрнуто объяснить свою позицию?
По какому вопросу?
Я могу попытаться ответить на несколько. Притом не факт, что сейчас для меня важно то же, что было важно когда-то.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

HaRT wrote: По какому вопросу?
Стоит ли придавать значение порядку нажатия/отпускания отдельных клавиш комбинации?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

sToLp wrote: Поэтому весьма желательно, чтобы макросы и на двойное нажатие на CtrlAlt, CtrlShift и AltShift тоже появились бы.
Предлагаю быстрый и грязный proof of concept

Code: Select all

local F = far.Flags
local mods = {}
for i,v in ipairs{"Ctrl","Alt"} do
  local r = far.NameToInputRecord(v)
  mods[r.VirtualKeyCode] = true
end
local mask = bor(F.LEFT_ALT_PRESSED,F.RIGHT_ALT_PRESSED,F.LEFT_CTRL_PRESSED,F.RIGHT_CTRL_PRESSED,F.SHIFT_PRESSED)
local CtrlAlt = bor(F.LEFT_ALT_PRESSED,F.LEFT_CTRL_PRESSED)
local wait
Event{
  group="ConsoleInput";
  description="CtrlAlt";
  id="2EEE56E1-228B-4087-B583-6E0612E6DF0B";
  action=function(r)
    if r.EventType~=F.KEY_EVENT then
      return
    elseif wait then
      if mods[r.VirtualKeyCode] then
        if not r.KeyDown then
          wait = false
          mf.postmacro(mf.eval,"CtrlAlt",2)
        end
      else
        wait = false
      end
    elseif mods[r.VirtualKeyCode] then
      if r.KeyDown and band(mask,r.ControlKeyState)==CtrlAlt then wait = true end
    end
  end;
}

Macro { description="CtrlAlt sample";
  area="Common"; key="CtrlAlt";
  id="D1A40884-785D-4996-A71B-4FB05296A571";
  action=function()
    far.Message(mf.akey(1,1),Area.Current)
  end;
}
(с двойным нажатием скомбинируйте самостоятельно, я не проверял)
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Усовершенствованная версия.

Code: Select all

local F = far.Flags
local mods = {[0x11]="Ctrl",[0x12]="Alt",[0x10]="Shift"}
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
local mask = bor(A,rA,C,rC,S)

local keys = {

  --[[
  [c]="Ctrl",
  [rC]   ="RCtrl",
  [A]    ="Alt",
  [rA]   ="RAlt",
  [S]    ="Shift",
  --]]

  [C+A]  ="CtrlAlt",
  [C+rA] ="CtrlRAlt",
  [rC+A] ="RCtrlAlt",
  [rC+rA]="RCtrlRAlt",
  [A+rA] ="LRAlt",
  [C+rC] ="LRCtrl",

  [C+S]  ="CtrlShift",
  [rC+S] ="RCtrlShift",
  [A+S]  ="AltShift",
  [rA+S] ="RAltShift",

  [C+A+S]  ="CtrlAltShift",
  [C+rA+S] ="CtrlRAltShift",
  [rC+A+S] ="RCtrlAltShift",
  [rC+rA+S]="RCtrlRAltShift",
  [A+rA+S] ="LRAltShift",
  [C+rC+S] ="LRCtrlShift",
}

local wait
Event{
  group="ConsoleInput";
  description="CtrlAlt";
  id="2EEE56E1-228B-4087-B583-6E0612E6DF0B";
  action=function(r)
    if r.EventType~=F.KEY_EVENT then
      return
    elseif mods[r.VirtualKeyCode] then
      if r.KeyDown then
        wait = band(mask,r.ControlKeyState)
        if not keys[wait] then wait = false end --to filter single mods
      elseif wait then
        mf.postmacro(mf.eval,keys[wait],2)
        wait = false
      end
    else
      wait = false
    end
  end;
}

Macro { description="CtrlAlt sample";
  area="Common"; key="CtrlAlt LRCtrl LRAlt CtrlShift AltShift CtrlAltShift LRCtrlShift LRAltShift";
  id="D1A40884-785D-4996-A71B-4FB05296A571";
  action=function()
    far.Message(mf.akey(1,1),Area.Current)
  end;
}
Теперь различаются все комбинации правых и левых Ctrl/Alt, включая LRCtrl (LCtrl+RCtrl) и LRAlt (LAlt+RAlt)

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

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

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