Индицировать привязку шортката к нативной команде Фара.
Posted: Wed 02 Aug, 2017 21:47
by sToLp
Latest post of the previous page:
Shmuel wrote: ↑Wed 02 Aug, 2017 20:53Если вызывать макрос "напрямую", например, ShiftF5, и в появившемся меню нажать Enter, то работает.
Если же вызвать одно из "предыдущих" меню, например, ShiftF4 и переходить к следующим двойными нажатиями RCtrl, то переходы осуществляются, но при нажатии Enter ничего, кроме закрытия меню не происходит.
Действительно. Похоже, что я таки поспешил. Если в "новом" меню нажать AltF4, то редактор открывается на нужном макрофайле. Но там банальная Keys"Akey". А ведь после перехода это уже не то... Буду думать сам и уповаю на Вашу помощь.
Индицировать привязку шортката к нативной команде Фара.
Posted: Thu 03 Aug, 2017 04:31
by sToLp
Частично вопрос решён переделкой таблицы макросов, эмулирующих НАТИВНЫЕ (внутренние) команды Far.
В соответствующем посте код макроса и вложенный файл обновлены.
Индицировать привязку шортката к нативной команде Фара.
Posted: Fri 04 Aug, 2017 22:23
by sToLp
В вышеприведённой комбинации групп макросов, эмулирующих нативные команды Far, сделал следующие косметические изменения:
а) участки кода mf.print("lua:mf.postmacro(eval,") mf.print(replace) mf.print(",2)") заменил на print('"lua:mf.postmacro(eval,'..replace..',2)"') ;
б) макрос с ключом, не назначенным на внутреннюю команду, теперь при активации выдаёт сообщение об этом с возможностью возврата в меню;
в) теперь роль метки диапазона прокрутки меню вместо вычурной формы {esc{F12 исполняет хоткей &q.
В соответствующем посте код макросов и вложенный файл обновлены.
Кстати по поводу пользовательских горячих клавиш в меню выбора макросов. Сейчас после их назначения пользователем порядковые номера/литеры таких пунктов затеняется, деактивируются. Но лично мне как пользователю было бы удобнее, чтобы они всё также оставались бы активными. Если это практически возможно.
Индицировать привязку шортката к нативной команде Фара.
Posted: Sat 05 Aug, 2017 02:13
by Shmuel
sToLp wrote: ↑Fri 04 Aug, 2017 22:23Кстати по поводу пользовательских горячих клавиш в меню выбора макросов. Сейчас после их назначения пользователем порядковые номера/литеры таких пунктов затеняется, деактивируются. Но лично мне как пользователю было бы удобнее, чтобы они всё также оставались бы активными. Если это практически возможно.
Активными их можно было бы оставить (путём назначения на каждый из них AccelKey). Но выделяться другим цветом они при этом не будут. Реализация функции Menu в Фаре (как она есть на текущий момент) не позволяет подсветить более одного символа в тексте пункта.
Индицировать привязку шортката к нативной команде Фара.
Posted: Sat 05 Aug, 2017 05:38
by sToLp
Shmuel
А раз так, то не целесообразнее ли было бы порядковые обозначения пунктов не подсвечивать вовсе? И пусть бы они были постоянно активными. В Главном меню, например, множество вполне активных не подсвеченных хоткеев/шорткатов.
Добавлено: И поскольку, если будете вносить корректировку в форму меню "Исполнить макрос", посмотрите, пожалуйста, ещё насчёт вывода в заголовок указаний макрообласти, из которой вызвано меню, и вызвавшего его ключа. Хотелось бы воспользоваться этим уже при составлении данных макросов.
Индицировать привязку шортката к нативной команде Фара.
Posted: Sat 05 Aug, 2017 07:36
by Shmuel
sToLp, можете поместить виш на мантис.
Индицировать привязку шортката к нативной команде Фара.
Индицировать привязку шортката к нативной команде Фара.
Posted: Sun 06 Aug, 2017 14:59
by sToLp
При анонсировании прототипа группы макросов, которые путём эмулирования отображают наличие или отсутствие нативных (внутренних) команд Far, по поводу их возможного пересечения с другими макросами мною было сделано следующее предположение:
sToLp wrote: ↑Wed 02 Aug, 2017 17:49По идее, их применение не должно бы препятствовать имеющимся уже у пользователя макросам.
Однако возможны случаи, когда пользователь переопределяет ключи внутренних команд для задействования других команд. Как пример тому, известные переназначения ключа F8. Команду "Удалить" коллеги запускают ключом Del, а на F8 навешивают запуск браузера.
И подобные ключи могут пересекаться с ключами группы макросов, индицирующих нативные команды Far.
Для сглаживания возможного неудобства предполагаю сделать следующее. Поле sortptiority в подготавливаемых мню макросах выстаить равным 10, а не 100 как пока что. И таким образом индицирующие макросы переместятся с первой позиции в меню на предпоследнюю, чтобы вывести наверх возможные макросы пользователя. А также, наверное, составляю дополнительный макрос.
Дополнительный вспомогательный макрос нужен для исключения воспрепятствования работе макроса пользователя, назначенного на ключ, задействованный также и в группе макросов, преднамеренно эмулирующих нативные команды. Предполагаю, что он будет активировать в меню 'Исполнить макрос' первую позицию. В расчёте на то, что она предположительно соответствует макросу, запускаемому ключом нативной команды, который переназначен пользователем под предусмотренную им команду.
И тогда при повторном нажатии того же ключа будет активироваться макрос пользователя, а не макрос вышеозначенной группы.
Для составления допмакроса желательна реализация виша, ссылка на который приведена в предыдущем посте. Поэтому пока что подожду его реализации.
Добавлено: указанный виш реализован, и теперь, вероятно, дополнительный макрос не потребуется, т.к. новая, более совершенная, форма меню "Исполнить макрос" позволяет, кажется, обойтись и без него. Но посмотрим, что покажет практика.
Индицировать привязку шортката к нативной команде Фара.
Posted: Sun 06 Aug, 2017 20:00
by sToLp
С ранее опубликованными макросами обнаружилась пока что совсем не понятная мне заноза. При наличии в них флагов flags="NoPluginPanels EmptyCommandLine"; и непустой комстроке Far после их активации зависает. Если флаги из макросов убрать, то макросы срабатывают нормально и зависания Far не случаются.
Macro {
area="shell";
key="ShiftEsc";
description="she &q Внутренняя команда Far не назначена ShiftEsc";
id="BE3064C4-A336-40A8-8228-5E68A21507BE";
sortpriority=100;
flags="NoPluginPanels EmptyCommandLine";
action=function()
local cmd = far.Message("Нативная (внутренняя) команда Far на ключ ShiftEsc не назначена.\n\nДа -- продолжить. Нет -- вернуться в меню.","ВНИМАНИЕ !",";YesNo","FMSG_LEFTALIGN")
if cmd==1 then Keys("ShiftEsc") end if cmd==2 then
mf.print('"lua:mf.postmacro(eval,"Shell/ShiftEsc",2)"') Keys("Enter") end
end;
}
Macro {
area="Shell"; sortpriority=0;
key="/(ShiftEsc)|(ShiftF1?\\d)/";
description="дважды LCtrl к предыдущему меню ПЕРЕЙТИ → к следующему меню RCtrl дважды";
id="55FF38F1-2D7E-42D2-BEF1-65D1FD36D6E1";
action=function()
local res=akey(1,1)
msgbox("ВНИМАНИЕ!","Для выполнения команды: \n\"к предыдущему меню ПЕРЕЙТИ → к следующему меню\"\n следует дважды подряд нажимать соответственно\n LCtrl или RCtrl",0x00010000)
mf.postmacro(eval,res,2)
end;
}
Индицировать привязку шортката к нативной команде Фара.
Posted: Sun 06 Aug, 2017 21:26
by Shmuel
sToLp wrote: ↑Sun 06 Aug, 2017 20:00При наличии в них флагов flags="NoPluginPanels EmptyCommandLine"; и непустой комстроке Far после их активации зависает
У вас там происходит зацикливание - из макроса запускается снова макрос, из того снова запускается макрос и т.д. Где-то у вас ошибка в логике этих макросов.
Попутно замечу, что аргумент Flags в функции far.Message указан не в соответствии с описанием данного параметра в документации.
Индицировать привязку шортката к нативной команде Фара.
Posted: Mon 07 Aug, 2017 00:04
by sToLp
Shmuel wrote: ↑Sun 06 Aug, 2017 21:26У вас там происходит зацикливание - из макроса запускается снова макрос, из того снова запускается макрос и т.д. Где-то у вас ошибка в логике этих макросов.
Попутно замечу, что аргумент Flags в функции far.Message указан не в соответствии с описанием данного параметра в документации.
Благодарю Вас за подсказку!
Умозрительно оба момента осознал и убедился в том, что верно осознал, попробовав на черновом макросе.
Индицировать привязку шортката к нативной команде Фара.
Posted: Tue 08 Aug, 2017 21:33
by sToLp
Блок макросов, эмулирующих НАТИВНЫЕ команды Far, назначенные на ключи линейки функциональных клавиш с модификатором Shift в области Shell в диапазоне ShiftEsc — ShiftF12.
Макросы составлены с учётом обновлённой формы заголовка меню: ╔══ Исполнить макрос: макрообласть | ключ ══╗.
(см. shmuel 07.08.2017 15:25:23 +0200 - build 611).
-------------------------------------------------------------------------
--- Блок макросов, эмулирующих НАТИВНЫЕ (внутренние) команды Far, ---
--- назначенные на ключи линейки функциональных клавиш ---
--- (в диапазоне ShiftEsc - ShiftF12) ---
--- они демонстрируют нативные (внутренние) команды Far ---
--- и ключи, на которые таковые не назначены ---
-------------------------------------------------------------------------
-- Нативная команда Far (либо сообщение о незадействовании ключа)
-- в меню выбора макросов может активироваться также клавишей 'N' ('Т' - в русской раскладке)
-- как и порядковой цифрой/литерой или Enter
Macro { area="shell"; key="ShiftEsc"; description="&Native: Внутренняя команда Far не назначена ShiftEsc"; id="BE3064C4-A336-40A8-8228-5E68A21507BE"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function()
local cmd = far.Message("Нативная (внутренняя) команда Far на ключ ShiftEsc не назначена.\n\nДа -- продолжить. Нет -- вернуться в меню.","ВНИМАНИЕ !",";YesNo","FMSG_LEFTALIGN")
if cmd==1 then Keys("ShiftEsc") end if cmd==2 then mf.print('"lua:mf.postmacro(eval,"Shell/ShiftEsc",2)"') Keys("Enter") exit() end end;}; -- Keys"ShiftEsc"
Macro { area="shell"; key="ShiftF1"; description="&Native: Добавить файлы к архиву ShiftF1"; id="56C3BC91-A62F-4962-A89B-C4A55372CC5E"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF1" end;};
Macro { area="shell"; key="ShiftF2"; description="&Native: Извлечь файлы из архива ShiftF2"; id="97AB13E7-14B6-4D7A-A967-992A1E730D6C"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF2" end;};
Macro { area="shell"; key="ShiftF3"; description="&Native: Выполнить команды управления архивом ShiftF3"; id="1F6E2EC1-1438-43D3-93E7-208FDC15DB1A"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF3" end;};
Macro { area="shell"; key="ShiftF4"; description="&Native: Редактировать новый файл ShiftF4"; id="C5D859F4-A4BD-4D16-AA53-FDEECD094228"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF4" end;};
Macro { area="shell"; key="ShiftF5"; description="&Native: Копирование файла под курсором ShiftF5"; id="0E5B1C6E-6D06-4773-AD04-CB5239D52280"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF5" end;};
Macro { area="shell"; key="ShiftF6"; description="&Native: Переименование или перенос файла под курсором ShiftF6"; id="0C292EA4-1755-4672-ADEB-70A5064F54C4"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF6" end;};
Macro { area="shell"; key="ShiftF7"; description="&Native: Внутренняя команда Far не назначена ShiftF7"; id="D2D681FB-084C-4914-95AB-B8E8D95DD401"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function()
local cmd = far.Message("Нативная (внутренняя) команда Far на ключ ShiftF7 не назначена.\n\nДа -- продолжить. Нет -- вернуться в меню.","ВНИМАНИЕ !",";YesNo","FMSG_LEFTALIGN")
if cmd==1 then Keys("ShiftF7") end if cmd==2 then mf.print('"lua:mf.postmacro(eval,"Shell/ShiftF7",2)"') Keys("Enter") exit() end end;}; -- Keys"ShiftF7" end;};
Macro { area="shell"; key="ShiftF8"; description="&Native: Удаление файла под курсором ShiftF8"; id="A77C0774-6B30-4469-8E68-2858E3DE99DE"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF8" end;};
Macro { area="shell"; key="ShiftF9"; description="&Native: Сохранить конфигурацию ShiftF9"; id="5BF40D75-3E45-44FA-8280-59147839E637"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF9" end;};
Macro { area="shell"; key="ShiftF10"; description="&Native: Выбрать последний выполненный пункт меню ShiftF10"; id="4D7FFD2A-F96B-4AAB-B542-BB61202C80CC"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF10" end;};
Macro { area="shell"; key="ShiftF11"; description="&Native: Использовать сортировку по группам ShiftF11"; id="74A6A7FB-086B-4133-BB03-0960DCE0C999"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF11" end;};
Macro { area="shell"; key="ShiftF12"; description="&Native: Показывать помеченные файлы первыми ShiftF12"; id="BC6D88EC-539D-474D-B449-59005A299BE7"; sortpriority=1; flags="NoPluginPanels EmptyCommandLine"; action=function() Keys"ShiftF12" end;};
--- пример макросов, эмулирующих нативные (внутренние) команды Far --- КОНЕЦ ---
--- Пример МАКРОСОВ переходов по кругу меню 'Исполнить макрос' (к следующему → / ← к предыдущему) --- НАЧАЛО ---
--- Макросы переходов используют свойство макросов, назначенных на один ключ, выводить меню:
-- %FarHome%\plugins\luamacro\changelog shmuel 29.12.2012 15:09:01 +0200 - build 54:
-- 4. Допустимо более одного макроса на сочетание (key,area) ...
-- Если есть более одного макроса с одинаковым приоритетом - выводится меню.
-- и работают с новой формой заголовка меню 'Исполнить макрос: макрообласть | ключ'
-- см. там же shmuel 07.08.2017 15:25:23 +0200 - build 611
Macro {
description="дважды LCtrl к предыдущему меню ← ПЕРЕЙТИ → к следующему меню RCtrl дважды";
area="Shell"; sortpriority=0; id="7670A32D-48F5-4738-B5BA-3CA931AF2AB9";
key="/(ShiftEsc)|(ShiftF1?\\d)/"; -- регекс на ключи диапазона ShiftEsc - ShiftF12
-- макрос выводит строку содержания своего description в самой нижней строке меню выбора макросов
-- и если её активировать хоткеем, мышкой или по Enter, то будет вывыведено предупреждение и затем возврат к исходному меню
action=function()
local res=akey(1,1)
msgbox("ВНИМАНИЕ!","Для выполнения команды: \n\"к предыдущему меню ПЕРЕЙТИ → к следующему меню\"\n следует дважды подряд нажимать соответственно\n LCtrl или RCtrl",0x00010000)
mf.postmacro(eval,res,2) exit()
end;
}
--- в следующем макросе (собственно переходов) также применены способы, показанные:
-- John Doe Tue 14 Oct 2014 18:17 http://forum.farmanager.com/viewtopic.php?p=124279#p124279
-- John Doe Wed 13 Jul 2016 19:50 http://forum.farmanager.com/viewtopic.php?p=139385#p139385
local maxDelay = 500 -- промежуток времени между двумя нажатиями пусковой клавиши (в миллисекундах)
local bundle = {"ShiftEsc","ShiftF1","ShiftF2","ShiftF3","ShiftF4","ShiftF5","ShiftF6","ShiftF7","ShiftF8","ShiftF9","ShiftF10","ShiftF11","ShiftF12"}
-- перечень ключей диапазона, в котором работает макрос
local mdpznr = "Исполнить макрос: Shell | Shift" -- метка диапазона работы макроса в русском интерфейсе
local mdpzni = "Execute a macro: Shell | Shift" -- метка диапазона работы макроса для англоязычного интерфейса
local pdstr = "Shift" -- метка подстроки для последовательного определения следующего по порядку ключа
-- по кругу вправо "ShiftEsc → "ShiftF12"
local cycler = {}
for i,v in ipairs(bundle) do
cycler[v] = bundle[i+1] or bundle[1]
end
-- по кругу влево "ShiftEsc" ← "ShiftF12"
local cyclel = {}
for i,v in ipairs(bundle) do
cyclel[v] = bundle[i-1] or bundle[13]
end
local t = 0
Macro {
description="в меню 'Исполнить макрос' диапазона ключей ShiftEsc-ShiftF12 переход к следующему ← или → меню по порядку по кругу (sToLp) дважды-LRCtrl";
area="Menu"; priority = 100; key="LCtrl RCtrl";
id="71B12621-5857-4482-A6DC-CCDD9587CD73";
condition=function()
local t1 = Far.UpTime
local delay = t1-t
t = t1
return (mf.substr(Object.Title,0,31)==mdpznr or mf.substr(Object.Title,0,30)==mdpzni) and delay<maxDelay
-- данный condition обеспечивает срабатывание ключа на двойное нажатие
-- и работу макросов только в меню выбора макросов и только в заведомо заданном диапазоне ключей
end;
action=function()
local sdr=Object.Title -- msgbox("Содержание заголовка меню",sdr,0x00010000)
local pln=mf.len(sdr) -- msgbox("Длина заголовка в символах",pln,0x00010000)
local pzc=mf.rindex(sdr,pdstr,1) -- msgbox("Позиция подстроки pdstr ближайшей с конца строки",pzc,0x00010000)
local l=(pln - pzc) -- msgbox("Длина ключа (шортката), которым вызвано меню",l,0x00010000)
local bnd=mf.substr(sdr,-l) -- msgbox("Ключ, которым вызвано меню",bnd,0x00010000)
local k=akey(1,0) -- msgbox("LCtrl или RCtrl - ключ активации данного макроса ",k,0x00010000)
if k=="RCtrl" then
replace = cycler[bnd] -- msgbox("Следующий по порядку ключ из bundle → вправо",replace,0x00010000) -- следующий по порядку ключ из перечня ключей bundle
if replace then
Keys("F10") mf.print('"lua:mf.postmacro(eval,\"Shell/'..replace..'",2)"') Keys("Enter") exit() -- msgbox("Проверка","Всё то! Перешли в 'соседнее' меню.",0x00010000)
else
msgbox("Проверка","Что то не то с макросом на дважды-RCtrl ...",0x00010000)
end
else
replace = cyclel[bnd] -- msgbox("Следующий по порядку ключ из bundle ← влево",replace,0x00010000) -- следующий по порядку ключ из перечня ключей bundle
if replace then
Keys("F10") mf.print('"lua:mf.postmacro(eval,\"Shell/'..replace..'",2)"') Keys("Enter") exit() -- msgbox("Проверка","Всё то! Перешли в 'соседнее' меню.",0x00010000)
else
msgbox("Проверка","Что то не то с макросом на дважды-LCtrl ...",0x00010000)
end
end
end;
}
--- пример МАКРОСОВ переходов по кругу меню 'Исполнить макрос' (к следующему → / ← к предыдущему) --- КОНЕЦ ---
Теперь это уже не прототип, а один из тех блоков, из которых предполагается составить комплект макросов, индицирующих (демонстрирующих) нативные (внутренние) команды Far, а также ключи (хоткеи и шорткаты), на которые такие команды не назначены в макрообласти Shell.
Индицировать привязку шортката к нативной команде Фара.
Posted: Wed 09 Aug, 2017 06:26
by Shmuel
Нажимаю ShiftEsc, появляется меню. Нажимаю дважды RCtrl или LCtrl - ничего не меняется.
Индицировать привязку шортката к нативной команде Фара.
Posted: Wed 09 Aug, 2017 13:39
by sToLp
Shmuel,
Публикации макросов делаю в т.ч. чтобы, по возможности, оперативно выявлять и решать неожиданные проблемы с ними. Но в данном случае я пока ума не приложу в чём может быть причина того, о чём Вы сообщили.
А как с ShiftF3, например, или другим подобными ключами? Из вызываемых ими меню переходы осуществляются?
Сам я попросился на чужую машину (правда, система та же — десятка x64, других пока у нас нет под руками) и установил на ней свежескачанную рубордовскую сборку FarUE3 от уважаемого Victor_VG. Затем убрал из "C:\Program Files (x86)\Far3\Far\Profile\Macros\scripts"\ все макросы и положил туда скачанный с моего предыдущего поста файл. Загрузил Far, вызвал макрос по ShiftEsc и убедился, что по двойным RCtrl и LCtrl переходы нормально работают.
Индицировать привязку шортката к нативной команде Фара.
Posted: Wed 09 Aug, 2017 14:04
by Shmuel
sToLp wrote: ↑Wed 09 Aug, 2017 13:39Но в данном случае я пока ума не приложу в чём может быть причина того, о чём Вы сообщили.
Причина - некорректная работа, если в Фаре выбран английский язык интерфейса.
Индицировать привязку шортката к нативной команде Фара.
Posted: Wed 09 Aug, 2017 19:08
by sToLp
Shmuel wrote: ↑Wed 09 Aug, 2017 14:04Причина - некорректная работа, если в Фаре выбран английский язык интерфейса.