Latest post of the previous page:
При быстрых нажатиях эти "отпущенные" клавиши будут постоянно меняться... А потом кто-то будет ругаться что не тот макрос срабатывает.Странности активации макросов при удерживании Ctrl/Alt/Shift
- HaRT
- Moderator
- Posts: 10806
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 220 times
- Been thanked: 357 times
LuaMacro — Lua как язык макросов
Вариантов не так много, т.ч. когда без разницы, несложно назначить все.
Фар есть инструмент, а не нянька. © 2009 DrKnS
- HaRT
- Moderator
- Posts: 10806
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 220 times
- Been thanked: 357 times
LuaMacro — Lua как язык макросов
По какому вопросу?
Я могу попытаться ответить на несколько. Притом не факт, что сейчас для меня важно то же, что было важно когда-то.
Фар есть инструмент, а не нянька. © 2009 DrKnS
- John Doe
- Бюрократ
- Posts: 13801
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 72 times
- Been thanked: 425 times
- Contact:
LuaMacro — Lua как язык макросов
Стоит ли придавать значение порядку нажатия/отпускания отдельных клавиш комбинации?
- John Doe
- Бюрократ
- Posts: 13801
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 72 times
- Been thanked: 425 times
- Contact:
MacroEx — запуск макросов нетрадиционными способами
Предлагаю быстрый и грязный 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;
}
- John Doe
- Бюрократ
- Posts: 13801
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 72 times
- Been thanked: 425 times
- Contact:
MacroEx — запуск макросов нетрадиционными способами
Усовершенствованная версия.
Теперь различаются все комбинации правых и левых Ctrl/Alt, включая
P.S.
Аналогичным образом и Shift можно добавить, но.. полноценной реализации в фаре данный скрипт не заменит.
Например по waitkey получить всё ещё ничего невозможно..
Update
Добавлена обработка всех комбинаций с Shift.
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;
}
LRCtrl
(LCtrl+RCtrl) и LRAlt
(LAlt+RAlt)P.S.
Аналогичным образом и Shift можно добавить, но.. полноценной реализации в фаре данный скрипт не заменит.
Например по waitkey получить всё ещё ничего невозможно..
Update
Добавлена обработка всех комбинаций с Shift.