Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Sun 24 Sep, 2017 18:29

Latest post of the previous page:

sToLp wrote:
Sun 24 Sep, 2017 17:53
правильные условия в condition подобрать.

Code: Select all

return mf.waitkey(1)~=""

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Sun 24 Sep, 2017 19:17

Code: Select all

Macro {
  area="Common"; key="Shift";
  condition=function()
    local key = mf.waitkey(1)
    if key~="" then
      mf.postmacro(far.Show("Shift+"..key))
      return 100
    end
  end;
  action=function() end;
}

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Sun 24 Sep, 2017 22:07

Code: Select all

local key
Macro { description="Shift-<NumPad> heuristics";
  area="Common"; key="Shift CtrlShift CtrlAltShift";
  id="2520EA89-3211-4D00-B552-AB0D000442DB";
  condition=function()
    key = mf.waitkey(1)
    return key~=""
  end;
  action=function()
    local akey = mf.akey(1,1)
    local numkey = key:sub(akey:len()-4,-1)
    if -2==mf.eval(akey..numkey,2) then
      if -2==mf.eval(key,2) then
        Keys(key)
      end
    end
  end;
}
--[[
Macro {
  area="Common"; key="ShiftNum7";
  action=function()
    far.Show("ShiftNum7")
  end;
}

Macro {
  area="Common"; key="Num1";
  action=function()
    far.Show("Num1")
  end;
}
Macro {
  area="Common"; key="ShiftNumDel";
  action=function()
    far.Show("ShiftNumDel")
  end;
}
Macro {
  area="Common"; key="NumDel";
  action=function()
    far.Show("NumDel")
  end;
}
--]]
Макрос обеспечивает одинаковую работу клавиш Shift+<NumPad> независимо от того включен ли NumLock.

Edit
Или иначе, по типу того как было в far 1.75:

Code: Select all

local NumLock,get = 0,-1
local busy
Macro { description="Shift-<NumPad> heuristics";
  area="Common"; key="/Num[\\dD].*/";
  id="2EB425EA-751B-431F-8DD8-25E82F3F2C28";
  condition=function()
    return not busy and 0~=band(1,mf.flock(NumLock,get)) and 100
  end;
  action=function()
    local key = mf.akey(1,1)
    if -2==mf.eval("Shift"..key,2) then
      busy = true
      if -2==mf.eval(key,2) then
        Keys(key)
      end
      busy = false
    end
  end;
}
Last edited by John Doe on Tue 26 Sep, 2017 13:23, edited 1 time in total.

User avatar
sToLp
Posts: 766
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 57 times
Been thanked: 5 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp » Mon 25 Sep, 2017 03:16

John Doe

Приведённые Вами примеры мне чрезвычайно интересны. Однако по причине всё же не очень-то высокого уровня моей компетентности требуют времени для их освоения. И, возможно, даже немалого.

При этом мне бы желательно по возможности более-менее понятным для меня способом решить вопрос о том, как включить показ шорткатов, состоящих из нампадовских цифр с модификаторами, в составе которых модификатор Shift, при включённом NumLock, в макросы-справки о задействовании ключей нативными командами Far. Изначально ведь вопрос по теме возник у меня в ходе их разработки. Поскольку она застопорилась, натолкнувшись на данную проблему. А для большей ясности привожу проект макроса-справки по макрообласти Shell .

Мне представляется то, что макрос-справку теперь нужно разделить на два, а м.б. и на три непересекающихся макроса, всё также навешиваемых на те же ключи CtrlAltShiftТочка и CtrlAltJ. В condition`е или другими способами в основном макросе предусмотреть, чтобы он срабатывал во всех случаях за исключением: 1) набора ключей, состоящих из нампадовских цифр 2) или ключа Clear 3) с модификаторами, 4) в составе которых модификатор Shift, 5) при включённом NumLock. А у другого (или других) макрос(а/ов) те условия в противоположном направлении — т.е. чтобы он/они срабатывал(и) только в случаях соблюдения заданных пяти условий.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Mon 25 Sep, 2017 09:41

sToLp wrote:
Mon 25 Sep, 2017 03:16
При этом мне бы желательно по возможности более-менее понятным для меня способом решить вопрос о том, как включить показ шорткатов, состоящих из нампадовских цифр с модификаторами, в составе которых модификатор Shift, при включённом NumLock, в макросы-справки о задействовании ключей нативными командами Far.
Я далёк от понимания, чего вы пытаетесь добиться.
У клавиш нумпада есть эта особенность. Хочет пользователь или нет, это придётся учитывать.
Если при включённом нумлоке нажать Shift-Num7, то это будет Num7, со всеми вытекающими последствиями. Сработают макросы на Num7, и пр.*
Значит (как я понимаю) надо ловить в вашем макросе этот Num7, и дальше работать с ним. Как именно ловить я вроде показал сразу. Вот ещё раз:

*Примечание:
Или пользователь может воспользоваться макросом выше.

User avatar
sToLp
Posts: 766
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 57 times
Been thanked: 5 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp » Tue 26 Sep, 2017 03:43

John Doe wrote:
Mon 25 Sep, 2017 09:41
Я далёк от понимания, чего вы пытаетесь добиться.
Всё дело в том, что сейчас на поставленный в теме вопрос мы смотрим с немного разных ракурсов.

Вы показываете (и за это Вам особое спасибо), как правильно использовать определённые шорткаты (те, которые составляются из нампадовских цифр с участием модификаторов, один из которых Shift, при включённом NumLock) в ключах, запускающих макросы.

А я, как это и отмечал постом выше, продолжаю решать задачу отображения в том числе этой группы шорткатов макросом-справкой.

И, похоже на то, что, задавшись вопросом "правильные условия в condition подобрать", я чуток перемудрил. Ведь непосредственно condition для решения вопроса вовсе не нужен. Поскольку приведённый Вами пример с двумя ключами сам по себе обеспечивает условия для решения задачи. А именно: если второго ключа нет (т.е. он пустой), то всё как обычно; а если он есть, то надо просто дополнить его недостающим в нём Shift`ом.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Tue 26 Sep, 2017 07:09

sToLp wrote:
Tue 26 Sep, 2017 03:43
если второго ключа нет (т.е. он пустой), то всё как обычно; а если он есть, то надо просто дополнить его недостающим в нём Shift`ом.
Всё так, но объясните, зачем дополнять его Shift'ом?
Да, Shift действительно был нажат, мы с вами знаем, и может определить.
Но что делать с этим знанием, если для системы (и для фара) этого нажатия Shift как-бы нет?

User avatar
sToLp
Posts: 766
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 57 times
Been thanked: 5 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp » Tue 26 Sep, 2017 10:08

John Doe wrote:
Tue 26 Sep, 2017 07:09
sToLp wrote:
Tue 26 Sep, 2017 03:43
если второго ключа нет (т.е. он пустой), то всё как обычно; а если он есть, то надо просто дополнить его недостающим в нём Shift`ом.
Всё так, но объясните, зачем дополнять его Shift'ом?
Исключительно в целях полноценного составления Справки о ключах, которые задействованы нативными командами Far`а, а также о "свободных" ключах и о тех, которые для Far`а недоступны.

Правильно определив шорткат, который нажал пользователь, мы первым делом в Справке об этом и указываем. Типа: "Нажато такое-то клавишесочетание". А дальше уже пытаемся насколько хватает разумения довести до пользователя известную нам информацию о том, что фактически для Far`а то нажатия Shift в составе определившегося шортката как-бы и нет. Например, следующим образом.

"Данное клавишесочетание, а также другие шорткаты, состоящие из цифр, нажимаемых при включённом NumLock на NumPad`е с применением модификаторов, одним из которых является Shift, для применения в Far`е недоступны. Это древняя уже фича Windows (см., например, https://blogs.msdn.microsoft.com/oldnew ... /?p=37953/)."

Ну или как-то ещё поточнее и, желательно, подоходчивее.

Да и в Помощи по Far`у, на мой взгляд, подобную информацию не помешало бы привести.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Tue 26 Sep, 2017 12:39

Теперь понятно, хотите пользователю всё максимально разжевать.
Я бы не стал.

И как я сейчас проверил: на XP наша эвристика не сработает, потому что последовательность событий другая
1. Нажатие Shift
2. Нажатие Num7
3. Отпускание Num7
4. Нажатие Shift
...
5. Отпускание Shift

Т.е. между 1 и 2 отсутствует отпускание Shift, а значит waitkey не отловит Shift.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Tue 26 Sep, 2017 13:11

Но можно применить эвристику из Far 1.75:

Code: Select all

local NumLock,get = 0,-1
local key = mf.waitkey()
if 0~=band(1,mf.flock(NumLock,get)) and key:match"^Num[%dD]" then
  key = "Shift"..key
end

User avatar
sToLp
Posts: 766
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 57 times
Been thanked: 5 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp » Wed 27 Sep, 2017 06:14

John Doe wrote:
Tue 26 Sep, 2017 12:39
хотите пользователю всё максимально разжевать
Но, прежде всего, для себя. А касательно полноты разжёвывания для пользователя там ещё посмотрим. Возможно, что получится и кратко.

Макросы, приведённые Вами выше, продолжаю изучать. И на текущий момент у меня что-то получается, а что-то нет. По результатам доложусь.

Что касается составляемой Справки, то совсем же ведь не обязательно заставлять пользователя нажимать клавишесочетания именно при включённом или именно при выключенном NumLock. Пусть нажимает шорткаты с нампадовскими цифрами с Shift`ом при выключенном. А в сообщениях Справки по данным шорткатам мы дадим ему соответствующую информацию про оба варианта возможных нажатий. И про результаты нажатий при включённом NumLock, и про при выключенном. Этот подход существенно облегчает код макроса-справки, обеспечивая при этом выдачу полноценной информации. А додумался я об этом только после того, как Вы напомнили про функцию flock(). Т.е. строчка

Code: Select all

local NumLock,get = 0,0; mf.flock(NumLock,get) -- погасить NumLock
по сути решает долго не решавшуюся мною проблему адекватной подачи макросом информации о недоступных для Far шорткатах с Shift`ом при включённом NumLock.


User avatar
sToLp
Posts: 766
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 57 times
Been thanked: 5 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp » Thu 28 Sep, 2017 19:37

John Doe

Продолжаю осваивать приведённые Вами в теме макросы. Но пока что процесс идёт с трудом. Основная причина этого — текущая нехватка свободного времени.

И поэтому для своего более глубокого понимания того, как работают шорткаты, составляемые из нампадовских цифр и модификатора Shift самого по себе, а также и в комбинациях с другими штатными модификаторами, опытным путём сконструировал . Раздельно для тестов с комбинациями с одиночным Shift`ом, с CtrlShift, с AltShift и с CtrlAltShift. В надежде добиться, чтобы эти макросы выдавали объективные объяснимые результаты. Объяснимые с учётом информации, получаемой в ходе обсуждения настоящей темы. И по большей части это удаётся. Однако кое-что в работе этих макросов пока что продолжает оставаться для меня загадочным.

В частности, понятно почему при включенном NumLock функция waitkey() после нажатия активирующего макрос шортката не ждёт следующего нажатия клавиш как обычно, а сразу же выдаёт результат. Теперь это уже не кажется странным. Потому что согласуется с изложенной в теме информацией о том, что в данном конкретном случае waitkey() получает от системы возврат не одного нажатия, а как бы целых двух подряд.

А также кажется понятным почему нампадовские клавиши-цифры, вкупе со спаренными модификаторами AltShift, при включённом NumLock работают так, как будто бы это один Alt. Ведь система при этом условии не замечает Shift. При этом мне никак не удаётся заставить тестовый макрос с AltShiftNum-цифрами при включенном NumLock отображать фактически нажатые шорткаты.

Предполагаю, что, скорее всего, тем же упомянутым обстоятельством разделения подачи в макрос соответствующих нажатий и отпусканий составляющих шорткаты клавиш вызвана и необходимость включать в поле key тестовых макросов порожние модификаторы. Без присутствия которых в этом поле данные макросы не работают. Но толком объяснить себе механизм такой необходимости не умею.

И совершенно не могу понять, почему CtrlAltShiftNum3 и CtrlAltShiftNum9 при выключенном NumLock не опознаются. Тогда как другие клавиши-цифры в таком же сочетании и при том же условии опознаются нормально. Перепроверил даже на машинах разной комплектации, предположив вероятность аппаратного сбоя. Однако непонятная неопознаваемость данных комбинаций повторилась.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Thu 28 Sep, 2017 20:07

sToLp wrote:
Thu 28 Sep, 2017 19:37
И совершенно не могу понять, почему CtrlAltShiftNum3 и CtrlAltShiftNum9 при выключенном NumLock не опознаются.
У меня распознаются. Ваш макрос не пробовал, просто запустил waitkey.
sToLp wrote:
Thu 28 Sep, 2017 19:37
При этом мне никак не удаётся заставить тестовый макрос с AltShiftNum-цифрами при включенном NumLock отображать фактически нажатые шорткаты.
Нажатия и у меня не приходят.
sToLp wrote:
Thu 28 Sep, 2017 19:37
Предполагаю, что, скорее всего, тем же упомянутым обстоятельством разделения подачи в макрос соответствующих нажатий и отпусканий составляющих шорткаты клавиш вызвана и необходимость включать в поле key тестовых макросов порожние модификаторы. Без присутствия которых в этом поле данные макросы не работают. Но толком объяснить себе механизм такой необходимости не умею.
Механизм простой: при включенном NumLock первым приходит отдельно модификатор, а потом уже нажатая клавиша.

Code: Select all

Macro {
  area="Shell"; key="/(Shift)|(ShiftNum[0-9])|(ShiftClear)/";
  action=function()
    local key2 = mf.waitkey(1)
    local key = a=="" and akey(1,0) or "Shift"..key2.." (NumLock)"
    far.Show(key)
  end;
}

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Thu 28 Sep, 2017 20:31

John Doe wrote:
Thu 28 Sep, 2017 20:07
Нажатия и у меня не приходят.
И вот этого теперь я объяснить не могу.
Смотрю в ProcessConsoleInput всё приходит .
А waitkey не ловит.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe » Thu 28 Sep, 2017 22:13

В общем, дело в том, что NumLock+AltShift == Alt.
А комбинация Alt+Num-цифры служит для ввода символа по коду.

И тут меня больше всего заинтересовал тот факт, что значение, возвращаемое far.InputRecordToName() зависит не от её аргумента.
Выше под спойлером можно увидеть для каждой клавиши наборы VK+FarName+InputRecord.

Исходя из InputRecord нажатие HOME должно быть распознано как AltNum7, но функция возвращает nil
Зато по InputRecord, соответствующему отпусканию Alt, функция возвращает символ с кодом 7.
Last edited by John Doe on Thu 28 Sep, 2017 22:14, edited 1 time in total.

User avatar
sToLp
Posts: 766
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 57 times
Been thanked: 5 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp » Fri 29 Sep, 2017 16:31

John Doe wrote:
Thu 28 Sep, 2017 20:07
sToLp wrote:
Thu 28 Sep, 2017 19:37
И совершенно не могу понять, почему CtrlAltShiftNum3 и CtrlAltShiftNum9 при выключенном NumLock не опознаются.
У меня распознаются. Ваш макрос не пробовал, просто запустил waitkey.
1) фантастика! по запуску waitkey из комстроки у меня тоже распознаются;

2) попробовал макросом в Win7x32 — при загрузке Far`а не загрузились несколько плагинов, со ссылкой на нехватку тех или иных DLL`ок, а вот клавиши распознались;

3) попробовал макросом в свежеустановленной Win10x64, но ещё до добавления в систему набора DLL-библиотек — повторилась практически та же история, что и в семёрке; и тогда я предположил: то ли у меня в системе какая-то библиотека чудит, то ли плагин какой-то мешается;

4) а поскольку плагин вычислить значительно проще, чем библиотеку, то решил сначала поискать виновника среди плагинов; и нашёл-таки; позор на мою седую голову — им оказался ConEmu; а я ему так доверял! и за многие годы никогда раньше не встречал, чтобы для набора внутренних команд ConEmu или для вызова его макросов применялись какие-либо нампадовские клавиши; и вот надо же — где то, похоже, зашкерились-таки.

User avatar
sToLp
Posts: 766
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 57 times
Been thanked: 5 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp » Sat 30 Sep, 2017 21:37

В процессе ознакомления с (за которые ещё раз Вас благодарю) мне, к сожалению, не удалось запустить их в исходном виде или . И поэтому осваивал я их по большей части тем способом, что перенимал из них отдельные блоки и пробовал применять эти блоки в своих экспериментах. А о тех результатах данных опытов, которые представляются мне достоверными, изложу здесь далее. Предположительно, тремя частями.

1) Когда, при включённом NumLock, команда lua: far.Show(mf.waitkey(),mf.waitkey(1)) запускается из комстроки, то на выходе мы получаем нажатый шорткат, разделённый на два аргумента. Например:

Code: Select all

1│ Shift
2│ Num7
2 arguments
Но, будучи, при том же условии, запущенной из макроса, far.Show(mf.waitkey(),mf.waitkey(1)) выдаёт нам только вторую часть нажатого шорката:

Code: Select all

1│ Num7
2│
2 arguments
На всякий случай привожу здесь полный текст простого тестового макроса:

Code: Select all

Macro { area="Shell"; 
key="Shift ShiftNum7"; -- если первый Shift из поля убрать, то макрос не запустится
action=function()
  far.Show(mf.waitkey(),mf.waitkey(1))
end;}

Post Reply

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