Jon_Dow Касательно усовершенствованной версии
CtrlAlt.lua.
Испытал данный набор макросов на нескольких машинах с системой Win10x64entRu из-под одного и того же портабельного Far 4745x64, запускаемого с флеш-диска.
Для того, чтобы макросы, назначенные на разовые нажатия CtrlAlt, RCtrlRAlt, LRCtrl и LRAlt, срабатывали, надо было приноровиться одномоментно отпускать обе клавиши. А это не во всех случаях получалось. Причём, на одних машинах правильно жать и отпускать клавиши получалось почти всегда, а на других — через раз и реже. А это для пользователя не очень-то удобно.
Таким образом макросы срабатывали почти во всех областях. Кроме редактора. В редакторе же на всех машинах "поймать момент" удавалось и вовсе один раз из нескольких нажатий, а иногда и из нескольких десятков нажатий. То есть в редакторе Фара практически не получалось нормально запустить эти макросы ни на одной из машин.
Проявился также странный нюанс с использованием меню "Исполнить макрос".
При том, что область Menu из поля area каждого из испытываемых макросов мною была исключена: area="Other Shell Viewer Editor Dialog Search Disks MainMenu Help Info QView Tree FindFolder UserMenu ShellAutoCompletion DialogAutoCompletion"; а в поле key выставлялся только один ключ.
Дело в следующем. Если поверх меню "Исполнить макрос", вызванного из какой-либо области (для примера — из диалога) нажать тот же шорткат ещё раз, то появляется сообщение, соответствующее области, из которой изначально вызывались макросы (в данном случае — из диалога). И после гашения этого сообщения иногда вновь появлялось прежнее меню "Исполнить макрос".
Цитата: (с двойным нажатием скомбинируйте самостоятельно, я не проверял)
[more=Попытался]
Код: local maxDelay = 500
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 keys = {
[bor(F.LEFT_CTRL_PRESSED,F.LEFT_ALT_PRESSED)] ="CtrlAlt",
[bor(F.LEFT_CTRL_PRESSED,F.RIGHT_ALT_PRESSED)] ="CtrlRAlt",
[bor(F.RIGHT_CTRL_PRESSED,F.LEFT_ALT_PRESSED)] ="RCtrlAlt",
[bor(F.RIGHT_CTRL_PRESSED,F.RIGHT_ALT_PRESSED)]="RCtrlRAlt",
[bor(F.LEFT_ALT_PRESSED,F.RIGHT_ALT_PRESSED)] ="LRAlt",
[bor(F.LEFT_CTRL_PRESSED,F.RIGHT_CTRL_PRESSED)]="LRCtrl",
}
local wait
Event{
group="ConsoleInput";
description="CtrlAlt";
id="158AEACD-3677-4D2E-ABEA-C73DE378A745";
action=function(r)
if not r.EventType==F.KEY_EVENT then
return
elseif mods[r.VirtualKeyCode] then
if r.KeyDown then
wait = band(mask,r.ControlKeyState)
elseif wait then
mf.postmacro(mf.eval,keys[wait],2)
wait = false
end
else
wait = false
end
end;
}
local t = 0
Macro { description="CtrlAlt тест на двойное нажатие (JD)";
-- area="Common";
-- Menu - временно отключена
area="Other Shell Viewer Editor Dialog Search Disks MainMenu Help Info QView Tree FindFolder UserMenu ShellAutoCompletion DialogAutoCompletion";
key="CtrlAlt"; -- key="CtrlAlt LRCtrl LRAlt";
id="99CA87C8-005B-431B-B967-3AC07CC9B16C";
condition=function()
local t1 = Far.UpTime
local delay = t1-t
t = t1
return delay<maxDelay
end;
action=function()
far.Message"tada!" -- far.Message(mf.akey(1,1),Area.Current)
end;
}
local t = 0
Macro { description="LRCtrl тест на двойное нажатие (JD)";
-- area="Common";
-- Menu - временно отключена
area="Other Shell Viewer Editor Dialog Search Disks MainMenu Help Info QView Tree FindFolder UserMenu ShellAutoCompletion DialogAutoCompletion";
key="LRCtrl"; -- key="CtrlAlt LRCtrl LRAlt";
id="99CA87C8-005B-431B-B967-3AC07CC9B16C";
condition=function()
local t1 = Far.UpTime
local delay = t1-t
t = t1
return delay<maxDelay
end;
action=function()
far.Message"tada!" -- far.Message(mf.akey(1,1),Area.Current)
end;
}
local t = 0
Macro { description="LRAlt тест на двойное нажатие (JD)";
-- area="Common";
-- Menu - временно отключена
area="Other Shell Viewer Editor Dialog Search Disks MainMenu Help Info QView Tree FindFolder UserMenu ShellAutoCompletion DialogAutoCompletion";
key="LRAlt"; -- key="CtrlAlt LRCtrl LRAlt";
id="99CA87C8-005B-431B-B967-3AC07CC9B16C";
condition=function()
local t1 = Far.UpTime
local delay = t1-t
t = t1
return delay<maxDelay
end;
action=function()
far.Message"tada!" -- far.Message(mf.akey(1,1),Area.Current)
end;
}
--[=[
John Doe Thu 28 Jul 2016 23:09
http://forum.farmanager.com/viewtopic.php?p=139646#p139646 Усовершенствованная версия.
Теперь различаются все комбинации правых и левых Ctrl/Alt, включая LCtrl+RCtrl (LRCtrl) и LAlt+RAlt (RAlt)
P.S.
Аналогичным образом и Shift можно добавить, но.. полноценной реализации в фаре данный скрипт не заменит.
Например по waitkey получить всё ещё ничего невозможно..
]=]--