IgorZ wrote: ↑Mon 10 Dec, 2018 05:33
Назначение макроса строго конкретное: реагировать на нажатие комбинации, состоящей из модификатора, заданного первичной комбинацией, и буквы.
Для меня приведённый Вами пример макроса очень интересен и полезен. Но такое его ограниченное назначение подходит едва ли не к единственному случаю, относящемуся к приведённому мною в данной теме в качестве примера набору макросов, вызываемых единым ключом, модификаторы которого AltShift также присутствуют и во всех других ключах макросов, вызываемых из меню выбора макроса.
Так уж случайно сложилось, что ключи подобрались единообразные. Это для упрощения восприятия примера. Практически же в большинстве остальных случаев наборы модификаторов в ключах, вызывающих макросы из меню, могут быть самыми разнообразными, вплоть до полного не повторения в них набора модификаторов базового ключа, формирующего меню выбора. А могут и вовсе отсутствовать в отдельных ключах, вызываемых однознаковыми хоткеями.
И вот поэтому то, что Вы вполне резонно указываете далее:
IgorZ wrote: ↑Mon 10 Dec, 2018 06:06
Проверить соответствие модификатора можно только динамически, и это делается в condition, поэтому отсекание служебных клавиш абсолютно излишне (кроме, разве что, CtrlC, но если эта комбинация входит в список вторичных, то лучше её не игнорировать, а если не входит, то и так отработет стандартный вариант). Разумеется, если не выбрасывать из condition проверку, как это сделали Вы.
относится лишь к данному узкоспециализированному случаю. Когда набор модификаторов в базовом ключе, на основе которого сформировано данное конкретное меню выбора макроса, полностью совпадает с набором модификаторов в каждом из ключей данного сборника макросов. Но стоит только дополнить этот сборник хотя бы одном макросом, в ключе которого иной набор модификаторов (что на практике вероятнее всего и случится), и ограниченность действия приведённого Вами примера макроса тут же сказывается на его результате.
Отсюда и те изменения, которые я произвёл с макросом-примером, чтобы попытаться приблизить его к сабжевому варианту. В котором целенаправленно предусматривается активация любого макроса (из их перечня в меню выбора макроса) путём нажатия именно того шорката, который указан в конце строки — позиции данного макроса, не зависимо от того, каков в нём конкретный набор модификаторов. И опыт апробирования получившегося у меня варианта сабжевого макроса для меня очень ценен. Но об этом несколько позже и особняком.
.
Универсальность - это хорошо. Но в данном случае, по моему мнению, она не нужна. Поскольку комбинация из двух клавиатурных комбинаций, в которой вторая имеет не те же модификаторы, что и первая, теряет главное преимущество: удобство и скорость последовательного нажатия. В этом случае после первого нажатия приходится отпускать клавиши-модификаторы, и в результате нажатие одной только быстрой клавиши удобнее, чем вместе с модификатором. Иначе говоря, CtrlK CtrlF удобно, CtrlK F менее удобно, но CtrlK AltF совершенно неудобно.
Возможно, предлагаемый Вами подход был оправдан, когда вторая клавиатурная комбинация тоже находилась в key, из-за её попадания в число активных, но после вынесения в key2 она вообще перестаёт существовать для LuaMacro вне конкретного локального меню, что предоставляет полную свободу для выбора удобных вариантов. И наиболее удобными являются те, в которых префиксы первой и второй комбинаций совпадают.
Кстати, ранее Вы действовали, исходя именно из этих соображений (выделил жирным):
John Doe wrote: ↑Mon 03 Dec, 2018 22:03 возможно для автора ценность не в запуске последовательностями
По моему убеждению, основная ценность — в целокупности, в неразрывной и желательно гармоничной связи с тем, что происходит за пределами непосредственно самого меню выбора макроса, как я попытался изложить это выше.
И вопрос, какими именно последовательностями осуществлять запуск макросов из данного меню, к этому также всецело относится как существенный момент. А поскольку Вы верно указали на противоречия в ключах приведённого примера, то я в файле поменял CtrlShiftE на AltShiftV и CtrlShiftW на AltShiftO, и посмотрю, как это скажется на дееспособности данных макросов практически.
IgorZ wrote: ↑Mon 10 Dec, 2018 06:06С другой стороны, Ваш вариант имеет свои достоинства. Какой лучше — с ходу не скажу.
Полагаю, что целесообразнее сравнивать не варианты приведённого Вами примера между собой. А оба их с исходным сабжевым макросом.
На всякий случай решил уточнить. Это моё замечание относилось конкретно к разным вариантам функции action, а не ко всему макросу. А то мне показалось, что Вы неправильно меня поняли.
IgorZ wrote: ↑Tue 11 Dec, 2018 05:54
наиболее удобными являются те [варианты комбинаций клавиш], в которых префиксы первой и второй комбинаций совпадают
Это бесспорно. И теоретически, и эстетически, и практически.
IgorZ wrote: ↑Tue 11 Dec, 2018 05:54
ранее Вы действовали, исходя именно из этих соображений (выделил жирным):
я в файле поменял CtrlShiftE на AltShiftV и CtrlShiftW на AltShiftO, и посмотрю, как это скажется на дееспособности данных макросов практически
И вот посмотрел, и убедился в их полноценной дееспособности. И в тех случаях, когда целесообразно строго придерживаться данного замечательного способа подбора комбинаций клавиш, в которых префиксы первой, т.е. вызывающей меню выбора макроса, комбинации, и вторых комбинаций, т.е. указываемых в конце полей description макросов, совпадают, я стремлюсь и далее намерен стремиться так и делать.
И при этом, в своей практике (а этой теме почти 3,5 года и она продолжает оставаться для меня животрепещущей) я ещё более многократно убеждался в необходимости реализации и более универсального подхода тоже. И со временем я попытаюсь продемонстрировать то, что он необходим, на работающих примерах. И буду очень рад узнать их оценку и с Вашей точки зрения тоже.
local w,OldMacro = math.min(Far.Width-31,99),Macro
local rx = regex.new("(.*)(?<=LCtrl|.LAlt|RCtrl|.RAlt|.Ctrl|..Alt|Shift)(?!LCtrl|LAlt|RCtrl|RAlt|Ctrl|Alt|Shift)")
function _G.MMacro(m)
if type(m.key2)=="string" then
local mod =(rx:match(" "..m.key2)or""):sub(3)
local k = m.key2:sub(mod:len()+1)
m.description=("%-"..w.."."..w.."s %14s%s%s"):format(m.description:gsub("&",""),mod,k:len()>1 and "" or "&",k)
end
return OldMacro(m)
end
mf.postmacro(function() _G.MMacro= nil end)
Примечания:
Место под исходное описание выделяется, исходя из того, что при ширине экрана в 80 символов, максимальной длине комбинации модификаторов (RCtrlRAltShift) и имени клавиши в 5 символов результирующее описание должно полностью помещаться в строке меню. Для более широкого экрана, соответственно, и место под исходное описание выделяется больше.
Клавиатурные комбинации выравниваются по границе между модификатором и клавишей.
Клавиши вида F1, PgDn и т. д. не подсвечиваются (увы, способ подсветки в меню нескольких символов подряд мне неизвестен).
Естественно, для максимальной эффективности нужен и модифицированный макрос для меню выбора:
if Menu.Select(" "..mod..k,2,0)>0or(mod==""and Menu.Select(" "..GetMod(Object.Title:match("%S+$"))..k,2,0)>0)then
Keys("Enter")
else
Keys("AKey")
end
end;
}
Примечания:
Быстрые клавиши вида F1, PgDn и т. д. поддерживаются, как и буквенные.
Если модификатор первичной комбинации совпадает с модификатором вторичной, то можно нажимать вторичную как с модификаторами, так и без. Например, для первичной CtrlA и вторичной CtrlF1 можно нажать как CtrlF1, так и просто F1.
Если модификатор первичной комбинации НЕ совпадает с модификатором вторичной, и клавиша не буквенная, то необходимо нажимать вторичную ТОЛЬКО с модификаторами. Например, для первичной CtrlA и вторичной AltF1 можно нажать ТОЛЬКО AltF1.
Клавиши рассматриваются все без исключений, поскольку, если пользователь решил задействовать какую-то как вторичную для макроса, это его право, а если не задействовал, она отработает корректно.
P. S. В макрос для меню выбора вкраласть ошибка! Нечаянно не скопировал две последние строки. Макрос исправлен. Спасибо sToLp за обнаружение ошибки.
Last edited by IgorZ on Thu 13 Dec, 2018 06:16, edited 1 time in total.
IgorZ wrote: ↑Wed 12 Dec, 2018 07:49
функция MMacro для _macroinit.lua
и модифицированный макрос для меню выбора
Благодарю Вас за щедрый подарок! Приступил к освоению.
UPD: Для начала: общее впечатление — прекрасное! Далее — о первых существенных нюансах:
а) при нажатии AltF4 на любой позиции в меню выбора макроса в редактор попадает не соответствующий этой позиции макрос, а _macroinit.lua.
б) в отношении в целом весьма удачной, на мой взгляд, установки:
1. Место под исходное описание выделяется, исходя из того, что при ширине экрана в 80 символов, максимальной длине комбинации модификаторов (RCtrlRAltShift) и имени клавиши в 5 символов результирующее описание должно полностью помещаться в строке меню. Для более широкого экрана, соответственно, и место под исходное описание выделяется больше.
— желательно также в файлах с наборами макросов иметь возможность и дополнительной подстройки этих размеров тоже, поскольку ширина размеров меню в разных случаях может существенно варьироваться.
в) касательно же:
2. Клавиатурные комбинации выравниваются по границе между модификатором и клавишей.
— весьма желательно выравнивание сделать просто по правой границе меню, поскольку тогда меню в целом будет смотреться гораздо лучше.
Last edited by sToLp on Wed 12 Dec, 2018 22:36, edited 1 time in total.
sToLp wrote: ↑Wed 12 Dec, 2018 11:45а) при нажатии AltF4 на любой позиции в меню выбора макроса в редактор попадает не соответствующий этой позиции макрос, а _macroinit.lua.
Повторить не удаётся. Возможно, из-за того, что я уже кое-что переделал.
sToLp wrote: ↑Wed 12 Dec, 2018 11:45б) в отношении в целом весьма удачной, на мой взгляд, установки:
1. Место под исходное описание выделяется, исходя из того, что при ширине экрана в 80 символов, максимальной длине комбинации модификаторов (RCtrlRAltShift) и имени клавиши в 5 символов результирующее описание должно полностью помещаться в строке меню. Для более широкого экрана, соответственно, и место под исходное описание выделяется больше.
— желательно также в файлах с наборами макросов иметь возможность и дополнительной подстройки этих размеров тоже, поскольку ширина размеров меню в разных случаях может существенно варьироваться.
Могу, разве что, добавить параметр в Macro, в пару к key2.
sToLp wrote: ↑Wed 12 Dec, 2018 11:45а) при нажатии AltF4 на любой позиции в меню выбора макроса в редактор попадает не соответствующий этой позиции макрос, а _macroinit.lua.
Повторить не удаётся.
УТОЧНЕНИЕ: переход по AltF4 в _macroinit.lua происходит с позиций только тех макросов, определение которых MMacro, а с тех, у которых традиционное Macro, переход происходит по-старому — в соответствующий им файл.
IgorZ wrote: ↑Thu 13 Dec, 2018 07:49
Могу, разве что, добавить параметр в Macro, в пару к key2.
В общем, я тут подумал, вспомнил, что я не первый окучиваю эту грядку (с расширением возможностей Macro), творчески позаимствовал кое-что из модуля rebind авторства John Doe и таки родил нечто пристойное.
- key2l: длина, отводимая под базовую часть описания.
Желательно бы не "под базовую часть описания", а под всю позицию в меню, включая указание клавиши/сочетания.
Для того чтобы:
a) можно было в начале файла с набором макросов задать переменную, указываемую затем в поле key2l каждого макроса, и при необходимости менять только одну эту величину, не лазая затем в этом файле по каждому из макросов отдельно.
б) попытаться сократить на данный момент чрезмерное (на мой взгляд) резервное расстояние между базовой частью описания и указанным сочетанием до 2-х знакомест; в своих опытах я экспериментировал (и, вроде бы, неплохо получалось) с функцией strpad, заполняя пробелами промежуток между базовой частью и сочетанием:
z = m.key2:sub(-1) --msgbox("condition: обозначенная конечная буква/знак:",z,0x00010000)
y = m.key2:sub(1,-2) --msgbox("condition: обозначенная комбинация модификаторов:",y,0x00010000)
x = mf.strpad(y,7," ",1) --msgbox("condition: обозначенная комбинация модификаторов выровненная:",y,0x00010000)
m.description = ("%-"..width.."s %s&%s"):format(m.description:gsub("&",""),x,z)
s = m.key2:len()
m.sortpriority = (100-s)
m.key=m.key.." "..m.key2
и мне казалось, что второй аргумент этой функции тоже можно попробовать задавать переменной в начале файла с набором макросов; а то, м.б. и как-то автоматически его высчитывать.
, см. объяснение в следующем посте.
Last edited by sToLp on Sat 15 Dec, 2018 05:17, edited 1 time in total.
IgorZ,
Практика показала, что я был не прав, когда просил:
sToLp wrote: ↑Fri 14 Dec, 2018 10:05
пожелание в отношении:
- key2l: длина, отводимая под базовую часть описания.
Желательно бы не "под базовую часть описания", а под всю позицию в меню, включая указание клавиши/сочетания.
Потому что при выключке (т.е. выравнивании) строк влево alignkey = "L" получаются вполне приемлемые результаты по сравнению с выключкой вправо alignkey = "R" и, тем более, по сравнению с выключкой по границе между модификаторами и клавишей в key2 alignkey = "C".
Выключка влево — "L".
Выключка вправо — "R".
Выключка по границе в ключе — "C".
этого приводится на примере подборки макросов разных способов удаления файлов/папок нажатием клавиши Del и далее в меню выбора макроса соответствующими клавишами/сочетаниями.
Поэтому полагаю, что усложнять в этом отношении ни чего не нужно. И, более того, возможно даже стоит чуток упростить key2Process.lua и оставить выключку только влево "вшитой".
На текущий момент единственный нюанс, который меня реально беспокоил в результатах работы key2Process.lua, это изъятие подсветки из предустановленных пометок Native: во множестве макросов, в которых содержание полей description начинается конкретно с этих пометок. Такие макросы либо дублируют внутренние команды Far`а, назначенные на соответствующие ключи, либо сообщают о том, что на данный ключ нативная команда не назначена. Они выполняют справочную функцию, являясь при этом вполне дееспособными. И мне очень не хотелось бы терять данную пометку в этих макросах.
Но всё, до чего я додумался, это сдвинуть строку 65
m.description = fmt:format(m.description:gsub("&",""),modk2,kk2:len()>1 and "" or "&",kk2)
с тем, чтобы обусловить её выполнение отсутствием наличия в качестве первых двух знаков в самом начале поля description амперсанта & и литеры N, идущих подряд. И вместо одной строки изобразил пять строк:
if m.description:sub(0,2)=="&N" then
m.description = fmt:format(m.description,modk2,kk2:len()>1 and "" or "",kk2)
else
m.description = fmt:format(m.description:gsub("&",""),modk2,kk2:len()>1 and "" or "&",kk2)
end
И таким образом то, что показано под спойлером [Демонстрация] в предыдущем посте, сохраняет свой вид и с полновесным применением ценных достоинств key2Process.lua в указанных макросах. А этого мне, собственно, и нужно было.
Посмотрите, пожалуйста, насколько это мною сделано корректно в принципе и нельзя ли этого же результата достичь более цивильно?
Last edited by sToLp on Sat 15 Dec, 2018 20:44, edited 1 time in total.
На текущий момент единственный нюанс, который меня реально беспокоил в результатах работы key2Process.lua, это изъятие подсветки из предустановленных пометок Native: во множестве макросов, в которых содержание полей description начинается конкретно с этих пометок. Такие макросы либо дублируют внутренние команды Far`а, назначенные на соответствующие ключи, либо сообщают о том, что на данный ключ нативная команда не назначена. Они выполняют справочную функцию, являясь при этом вполне дееспособными. И мне очень не хотелось бы терять данную пометку в этих макросах.
Вот здесь вопрос неоднозначный, на мой взгляд. Как вообще должен выглядеть такой пункт и на что именно реагировать? Сейчас можно не добавлять key2 к такому пункту, тогда он сохранит базовую быструю клавишу и, заодно, будет явно выделяться на фоне остальных. Можно добавить key2, тогда скрипт внесёт корректировки. А если базовая клавиша, допустим, CtrlV? На какую клавишу должна реагировать команда по умолчанию, что подсвечивать - N или V? А если среди других команд окажется одна с быстрой клавишей CtrlV или CtrlN? В общем, для начала, мне кажется, надо как-то формализовать подход. К примеру, запретить вторичную клавишу, идентичную первичной, для всех макросов, кроме Native. Или в макросе, если нажата повторно первичная клавиша, принудительно запускать пункт Native. В общем, как-то постараться снизить уровень возможного хаоса.
IgorZ wrote: ↑Mon 17 Dec, 2018 11:09
Вот здесь вопрос неоднозначный, на мой взгляд.
...
[вроде бы нужно] как-то постараться снизить уровень возможного хаоса
А вот по моему опыту о возможности хаоса при применении внутренних команд беспокоиться и вовсе не стоит. Т.к. его вероятность в данном случае крайне мала либо совсем не просматривается. А, напротив, просматривается весьма даже простая
1-ый вариант: — ключу сопоставлена внутренняя команда; и эта команда часто применяется;
в этом случае key2 не будет дублироваться в других макросах и при повторном нажатии на базовый ключ будет вызываться именно эта нативная команда (а также её можно будет вызвать, нажав на N или на соответствующий ключ в левом столбце нумерации-литерации меню выбора макроса).
2-ой вариант: — ключу сопоставлена внутренняя команда; но эта команда применяется не часто либо и вовсе на данный ключ переназначена другая команда;
в этом случае в меню выбора макроса будут выводиться два макроса с одинаковым ключом key2 и переназначенная команда будет помечена как selected=true;, а нативная команда — помечена пониженным приоритетом, и при повторном нажатии на базовый ключ вместо нативной команды будет вызываться переназначенная команда (а нативную команду можно будет вызвать, нажав на N или на соответствующий ключ в левом столбце нумерации-литерации меню выбора макроса).
3-ий вариант: — ключу не сопоставлена ни какая внутренняя команда;
в этом случае в меню выбора макроса опять же будут выводиться два макроса с одинаковым ключом key2 и команда, назначенная на данный ключ пользователем, будет помечена как selected=true;, а макрос, сообщающий об отсутствии на ключе нативной команды, — будет помечен пониженным приоритетом, и при повторном нажатии на базовый ключ будет вызываться назначенная пользователем команда (а сообщение об отсутствии на ключе нативной команды можно будет вызвать нажав на N или на соответствующий ключ в левом столбце нумерации-литерации меню выбора макроса).
Бывают, разумеется, ещё и смешанные варианты, но они являются лишь комбинациями первых трёх вариантов. Примером тому, кстати, является набор макросов с базовым ключом Del, приведённый под спойлером [Демонстрация], в одном из моих предыдущих постов. Там показаны две нативные команды, сопоставленные другим ключам, нежели базовый. При необходимости частого обращения к ним из данного меню выбора макроса их легко различить нажав на соответствующий ключ в левом столбце нумерации-литерации меню.
всего из трёх основных вариантов.
Как вообще должен выглядеть такой пункт ... ?
Для примера можно посмотреть картинки под спойлером [Демонстрация], в одном из моих предыдущих постов.
Сейчас можно не добавлять key2 к такому пункту, тогда он сохранит базовую быструю клавишу и, заодно, будет явно выделяться на фоне остальных.
Нет, это не лучший вариант.
Можно добавить key2, тогда скрипт внесёт корректировки.
Да, лучше добавить key2 по общему правилу. И, вместе с тем, скорректировать корректировку. И если Вы не возражаете против того варварского способа корректировки, который я
if m.description:sub(0,2)=="&N" then
m.description = fmt:format(m.description,modk2,kk2:len()>1 and "" or "",kk2)
else
m.description = fmt:format(m.description:gsub("&",""),modk2,kk2:len()>1 and "" or "&",kk2)
end
выше постом, то можно и совсем ничего не менять. А оставить в этом плане так, как есть. А я уже сам поправлю как мне представляется удобным. Тем более, что этот способ вполне меня устраивает, как я уже отмечал это
sToLp wrote: ↑Sat 15 Dec, 2018 20:36
А этого мне, собственно, и нужно было.
.
А если базовая клавиша, допустим, CtrlV? На какую клавишу должна реагировать команда по умолчанию, что подсвечивать - N или V?
В случаях нативных команд — подсвечивать однозначно N.
А если среди других команд окажется одна с быстрой клавишей CtrlV или CtrlN?
В этом плане, а также и во многих других случаях нужно будет подходить творчески, и заранее всё предусмотреть не получится.
В общем, для начала, мне кажется, надо как-то формализовать подход. К примеру, запретить вторичную клавишу, идентичную первичной, для всех макросов, кроме Native.
А вот этого точно делать не надо бы, а то нарушится гибкость возможности обособленного и комбинированного показа нативных команд.
Или в макросе, если нажата повторно первичная клавиша, принудительно запускать пункт Native.
И это тоже было бы лишним. Поскольку иногда нужно нативную команду сделать приоритетной, а иногда, напротив, — вторичной. А вот показывать целесообразно и ту, и ту. Т.е. обе выводить в меню выбора макроса.
И как резюме: ИМХО, у Вас уже получается чуть ли не идеальная комбинация скриптов (key2Process.lua плюс запись в _macroinit.lua) для решения изначально поставленной в настоящей теме задачи. И, как мне представляется, ещё немножко тонкой доводки и будет вполне готовый замечательный вариант.
IgorZ wrote: ↑Mon 17 Dec, 2018 11:09 Как вообще должен выглядеть такой пункт ... ?
Например, так:
И если есть желание или необходимость посмотреть на практике как подобные меню получаются на текущий момент, то можно скопировать в какую-либо папку ночнушку, начинить её файлами из приаттаченного
--[=[
IgorZ Fri 14 Dec 2018 05:54
https://forum.farmanager.com/viewtopic.php?p=152160#p152160
Скрипт, обеспечивающий запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса (тема sToLp`а).
Если key2Process.lua лежит не в каталоге "scripts", исправить путь.
]=]--
local Add_key2 = loadfile(win.GetEnv("FARPROFILE").."\\Macros\\scripts\\key2Process.lua")
if Add_key2 then Add_key2()() end
local l = 52
--[=[ John Doe Mon 20 Nov 2017 14:52
https://forum.farmanager.com/viewtopic.php?p=147442&sid=1a08a5d4f0ff5dba1576da68587bcf7d#p147442
макрос из энциклопедии со страницы примеров: https://api.farmanager.com/ru/macro/examples.html
приведен к актуальному состоянию (используя только апи макросов)
удаление файла/папки по клавише Del
если стояли на элементе .. то пытаемся удалить вышестоящую папку
если не в конце ком строки то удаляем символы в ней
]=]--
Macro {
description="Del файл/папку/'..' или знаки внутри комстроки (jd)"; --description="удаление файла/папки по клавише Del";
area="Shell"; key="Del"; key2="Del";
--alignkey="R";
key2l=l;
selected=true;
action=function()
-- если не в конце ком строки то удаляем символы в ней
if not CmdLine.Eof then
Keys("Del")
else
-- если стояли на элементе .. то пытаемся удалить вышестоящую папку
if not APanel.Selected and APanel.Bof and (not APanel.Root or APanel.Plugin) then
Keys("CtrlPgUp")
end
Keys("F8")
end
end;
}
--[=[ нижеследующий макрос 'Shell_DelEmptyDir.lua' взят из сборки Victor_VG на руборде
-- http://forum.ru-board.com/topic.cgi?forum=5&topic=49572&start=1380#11
-- Delete empty folder;
-- VictorVG @ VikSoft.Ru (Russia, Moscow, 1996 - 2018)
-- v1.0 , 12.12.2018 04:09:03 +0300 - Initial release.
-- v1.1 , 15.12.2018 06:22:27 +0300
-- Refactoring, fixed long patch error, screen echo off
Комментарий к макросу, данный VictorVG:
Макрос зовёт бинарник DelEmptyFolder.exe (DelEmptyFolder1.0.0.2.tar.xz
https://github.com/VictorVG/Software/releases/tag/DEF-v1002), который должен находиться в папке с Фаром [или в Path].
Утилита удалит все пустые подпапки в той папке, путь к которой ей передают в качестве первого аргумента запуска.
Если аргументов нет, то утилита удаляет все пустые подпапки, которые находятся в той папке, где она расположена сама.
Работает полностью незаметно, без консольного и графического окна, так и задумана что молча работает в фоне,
и если что не вышло так же молча завершается. Требует наличия .net 4.0]=]--
local CmdStr,dfl,sm,qt,at="",win.GetEnv("FARHOME").."\\DelEmptyFolder.exe",0,'"',"@";
local function rdef() mf.print(at..qt..dfl..qt.." "..qt..APanel.Current..qt) Keys("Enter"); end;
local function rst() Keys("ESC") mf.print(CmdStr) end;
Macro {
area = "Shell";
key = "CtrlShiftD Del"; key2="CtrlShiftD"; --key = "CtrlShiftD";
key2l=l;
--description = "Delete empty folder";
description="удалить порожние подпапки в указанной папке (vg)";
action = function() Far.DisableHistory(-1);
if (not CmdLine.Empty) then CmdStr=CmdLine.Value Keys("ESC") sm=1; end;
rdef()
if sm == 1 then rst() end;
end;
}
Macro {
description="удалить минуя корзину, показать имена (shmuel)";--70
-- удалить с подтверждением - показом имён
-- Shmuel Вт 21 май, 2013 10:41 http://forum.farmanager.com/viewtopic.php?p=110112#p110112
area="Shell"; key="Del"; key2="CtrlDel";
--alignkey="R";
key2l=l;
--key="ShiftDel";
flags="NoSendKeysToPlugins";
--sortpriority=80;
action=function()
local n = APanel.SelCount
if n > 1 then
local Title = "Удалить" -- "Delete"
local Text = "Вы намерены удалить " .. string.format("%d", n) .. " файл(а)(ов):\n" -- Text = "Do you wish to delete " .. string.format("%d", n) .. " items:\n"
local k = 3
if k > n then
k = n
end
for i = 1, k do
Text = Text .. " " .. panel.GetSelectedPanelItem(nil, 1, i).FileName .. "\n"
end
if k < n then
Text = Text .. " ..."
end
if msgbox(Title, Text, 0x00020008) == 1 then
Keys("ShiftDel Enter")
end
else
Keys("ShiftDel")
end
end;
}
Macro {
area="Shell";
id="2436EB73-5DEE-4562-A100-55687FC777B2";
key="Del"; --key="F5 F8 F18 CtrlX";
key2="Ctrl\\";
--alignkey="R";
key2l=l;
-- description="Clipboard: Cut selected text from CmdLine or selected files from APanel (DV) F8 CtrlX";
-- description="Clipboard: вырезать выделенный текст из CmdLine или выбранные файлы из APanel (DV) F8 CtrlX";
description="EMenu: вырезать помеченое из CmdLine, из APanel (DV)";-- --
priority=45;
flags="";
action = function()
if CmdLine.Empty and APanel.Visible then
-- if APanel.Current ~= ".." and APanel.Current ~= "." then
if APanel.Selected or (APanel.Current ~= ".." and APanel.Current ~= ".") then
-- DV Sat 06 Aug 2016 23:45 http://forum.farmanager.com/viewtopic.php?p=139797#p139797
EMenuCommand("cut")
end
else
if CmdLine.Selected then
Keys("CtrlIns Del")
elseif UseWholeCmdLineWhenNoSelection then
Keys("CtrlIns CtrlY")
end
end
end;
}
Macro { --
area="Shell";
description="вырезать как в Win (dv)";-- --
priority=45;
key="Del"; key2="W";
--alignkey="R";
key2l=l;
flags="";
action = function()
if CmdLine.Empty and APanel.Visible then
if APanel.Current ~= ".." and APanel.Current ~= "." then
EMenuCommand("cut")
end
else
if CmdLine.Selected then
Keys("CtrlIns Del")
elseif UseWholeCmdLineWhenNoSelection then
Keys("CtrlIns CtrlY")
end
end
end;
}
Macro { --
area="Info Shell Tree"; key="Del"; key2="CtrlShiftDel";
--alignkey="R";
key2l=l;
--sortpriority=70;
description="удалить только файл под курсором";--70
-- description="Call Far mainuser menu.";
action = function()
Keys("ShiftF8")
end;
}
Macro { -- &4
area="Info Shell Tree"; key="Del"; key2="AltDel"; key2l=l+1;
--sortpriority=70;
priority=40;
description="&Native: уничтожить файл или папку";--87 -
-- description="Call Far mainuser menu.";
action = function()
Keys("AltDel")
end;
}
Macro { --
area="Info Shell Tree"; key="Del"; key2="ShiftDel"; key2l=l+1; --key="Del ShiftDel"; --key2="ShiftDel"; alignkey="R"; key2l=51;
--sortpriority=80;
priority=40;
description="&Native: удалить объект минуя корзину"; --87 -
-- description="Call Far mainuser menu.";
action = function()
Keys("ShiftDel")
end;
}
local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
local nfo = Info {_filename or ...,
name = "key2 process";
description = "Обработка последовательности двух клавиатурных комбинаций (IgorZ)";
--IgorZ Fri 14 Dec 2018 05:54 https://forum.farmanager.com/viewtopic.php?p=152160#p152160
version = "0.9.0"; --http://semver.org/lang/ru/
author = "IgorZ";
-- url = "http://forum.farmanager.com/viewtopic.php?t=8465";
id = "F571989C-F7FA-4C55-B9AD-5E0974F1CDF5";
minfarversion = {3,0,0,4000,0};
-- files = "*Eng.hlf;*Rus.hlf;*Eng.lng;*Rus.lng";
helptxt = [[
Обрабатывает два дополнительных поля в определении Macro:
- key2: вторичная клавиатурная комбинация, работающая в меню выбора макроса;
- key2l: длина, отводимая под базовую часть описания.
Добавляет key2 в конец описания.
alignkey определяет, как выравнивать key2:
- L: по левому краю key2;
- C: по границе между модификаторами и клавишей в key2;
- R: по правому краю key2.
Для использования добавить в _macroinit.lua строки ниже.
Если данный файл лежит не в каталоге "scripts", исправить путь.
local Add_key2 = loadfile(win.GetEnv("FARPROFILE").."\\Macros\\scripts\\key2Process.lua")
if Add_key2 then Add_key2()() end
]];
history = [[
2018/12/14 v0.9.0 - Публичная бета.
]];
options = {
alignkey = "L",--"L","C","R" --alignkey = "C",--"L","C","R"
}
}
if not nfo then return end
-- +
--[[константы]]
-- -
local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B" -- гуид меню выбора макроса
local rx = regex.new("(.*)(?<=LCtrl|.LAlt|RCtrl|.RAlt|.Ctrl|..Alt|Shift)(?!LCtrl|LAlt|RCtrl|RAlt|Ctrl|Alt|Shift)")
-- +
--[[переменные]]
-- -
local w,OldAddRegularMacro,mod,k = math.min(Far.Width-32,99)
-- +
--[=[вспомогательные функции]=]
-- -
local function GetMod(key) return (rx:match(" "..key)or""):sub(3) end
local function getUpvalue(f,name)
for i=1,math.huge do
local n,v = debug.getupvalue (f,i)
if n==nil then error("unable to get upvalue: "..name) end
if n==name then return v,i end
end
end
--
local function AddRegularMacroNew(m,fp)
if type(m.key2)=="string" then
local modk2 = (rx:match(" "..m.key2)or""):sub(3)
local kk2 = m.key2:sub(modk2:len()+1)
local wk2 = type(m.key2l)=="number" and m.key2l or w
local fmt = "%-"..wk2.."."..wk2.."s %"..(({L="",C=14,R=(19-kk2:len())})[nfo.options.alignkey] or 14).."s%s%s"
-- sToLp: чтобы предотвартить замену пометки в description, начинающихся на '&Native:',
-- взамен строки
-- m.description = fmt:format(m.description:gsub("&",""),modk2,kk2:len()>1 and "" or "&",kk2)
-- приведены следующие 5 строк
if m.description:sub(0,2)=="&N" then
m.description = fmt:format(m.description,modk2,kk2:len()>1 and "" or "",kk2)
else
m.description = fmt:format(m.description:gsub("&",""),modk2,kk2:len()>1 and "" or "&",kk2)
end
end
return OldAddRegularMacro(m,fp)
end
--
local function ReplaceAddRegularMacro()
local LoadMacros = getUpvalue(eval,"utils").LoadMacros
local AddRegularMacro,iAddRegularMacro = getUpvalue(LoadMacros,"AddRegularMacro")
if not OldAddRegularMacro then OldAddRegularMacro = AddRegularMacro end
debug.setupvalue (LoadMacros,iAddRegularMacro,assert(AddRegularMacroNew))
end
-- +
--[=[Макрос]=]
-- -
if Macro then Macro{
id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC";
description="Обработка вторичной клавиатурной комбинации в меню выбора макроса (IgorZ)";
--IgorZ Fri 14 Dec 2018 05:54 https://forum.farmanager.com/viewtopic.php?p=152160#p152160
area="Menu"; key="/.+/"; priority=100;
condition=function(key)
mod = GetMod(key)
k = key:sub(mod:len()+1)
return Menu.Id==MSMenuGuid
end;
action=function()
if Menu.Select(" "..mod..k,2,0)>0 or (mod=="" and Menu.Select(" "..GetMod(Object.Title:match("%S+$"))..k,2,0)>0) then
Keys("Enter")
else
Keys("AKey")
end
end;
} end
--
return ReplaceAddRegularMacro
— файл мною чуток модифицирован, положить его в %FarHome%\Profile\Macros\scripts\
local _,Add_key2 = pcall(require,"key2Process")
if type(Add_key2)=="table" then Macro(Add_key2.macro) Add_key2.init() end
key2l переименован в bdsize: новое название более адекватно отражает суть поля;
добавлена глобальная настройка bdsize, аналогичная одноимённому параметру функции Macro и при наличии действующая на все макросы с key2, в которых отсутствует локальное поле bdsize;
если описание начинается с "Native", быстрая клавиша не изменяется.