View Issue Details

IDProjectCategoryView StatusLast Update
0002309Far ManagerMacropublic2015-01-14 13:41
ReporterJohnDoeAssigned Toshmuel 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version3.0 
Target VersionFixed in Version3.0 
Summary0002309: В Far 3 поломалась функция akey(1,1)
Descriptionakey(1,1) должна вернуть имя клавиши, на которую реально назначен макрос.
Это нужно для случая, когда макрос вызывается из другого макроса.

В Far 2 1807 работает как и заявлено.
В Far 3 3212 не работает, т.е. возвращает то же, что и akey(1,0)
Steps To ReproduceMacro {area="Common"; key="F2"; action=function() mf.eval("F1",2) end;}

Macro {area="Common"; key="F1"; action=function() msgbox(akey(1,0),akey(1,1) end;}

При вызове макроса, назначенного на F2 ожидается
akey(1,0)=="F1".
akey(1,1)=="F2".

В реальности оба вызова вернут "F2"
Additional InformationV=akey(Mode[,Type])
Возвращает название или код клавиши, вызвавшей макропоследовательность.
Mode = 0 - возвращается код клавиши, Mode = 1 - возвращается наименование клавиши.
Type = 0 - возвращает реально нажатое сочетание, которым вызывался макрос, Type = 1 - возвращает клавишу, на которую назначен макрос.
TagsNo tags attached.
BuildLMb472

Activities

shmuel

2013-02-21 11:52

developer   bugnote:0010359

Хотелось бы увидеть пример полезности и необходимости данной фичи. Ибо затрачивать время "просто чтобы работало" не хочется.

JohnDoe

2013-02-21 12:18

updater   bugnote:0010360

Есть макрос, key="Up Down", в action в зависимости от key выполняет разные действия.

Есть другой макрос (назначенный совсем на другую клавишу), и в нём есть вызов eval("Up",2).

В результате вызываемые макрос получает akey вызывающего макроса, и соответственно не может выполнить нужное действие.

JohnDoe

2013-02-21 12:35

updater   bugnote:0010361

Но вообще в современных условиях я считаю что akey() это неправильное средство.


У нас Lua, и макросы это функции, поэтому клавишу лучше передавать параметром.
Это прямее, и понятнее.
Предлагаю подкрутить Eval.

shmuel

2013-02-21 13:49

developer   bugnote:0010362

> У нас Lua, и макросы это функции, поэтому клавишу лучше передавать параметром.
> Это прямее, и понятнее.
> Предлагаю подкрутить Eval.

Мне кажется, что eval(str,2) - это просто пережиток прошлого, когда не было функций и таблиц. Культивировать это сейчас, и тем более расширять, зачем?

Можно, например, в макрофайлах создавать псевдо-модули (глобальные таблицы с функциями) и вызывать эти функции откуда угодгно. eval(str,2) вообще не нужен.

-- file 1.lua
_G.JohnDoe = _G.JohnDoe or {}
function JohnDoe.Foo (param1, param2, ......)
  ......
  return ret1, ret2, ......
end

function JohnDoe.Bar (param1, param2, ......)
  ......
  return ret1, ret2, ......
end

Таких файлов, таблиц, функций можно создать сколько угодно. Вызов функций из любых макросов в любом файле будет работать, с любым количеством параметров и возвратов любого типа. Это сильно отличается от убогого вызова eval(str,2), не так ли? Так зачем продолжать ковыряться с eval ?

2useven10

2013-07-02 23:34

developer   bugnote:0011241

@shmuel
Если не собираешься делать как в far2, просто оставь у akey() только один параметр и задокументируй это, чтобы не возникало лишних вопросов.

shmuel

2013-07-03 00:05

developer   bugnote:0011242

Этот вопрос всего лишь один из многих. Может быть так и сделаем, как ты говоришь.

JohnDoe

2014-01-23 12:52

updater   bugnote:0011738

Last edited: 2014-01-27 19:33

View 3 revisions

Тикет можно полностью решить, передавая в action параметр - имя клавиши, как сейчас делается для condition.

То же самое предложено в другом (несвязанном) тикете: 0002310:0011737

Update:
Связанный тикет: 0002580

JohnDoe

2015-01-05 12:17

updater   bugnote:0013386

Last edited: 2015-01-05 12:31

View 4 revisions

После LuaMacro build 465 проблема видоизменилась: в результате и akey(1,0) и akey(1,1) возвращают "F1" (клавишу, на которую назначен макрос).

Т.е. сейчас невозможно получить клавишу, вызвавшую изначальный макрос.
Скорее всего это сейчас и не нужно.

Но!!!
Присутствует баг, если клавиша задана регэкспом:
Macro {area="Common"; key="F2"; action=function() mf.eval("F1",2) end;}

Macro {area="Common"; key="/.1/"; action=function() far.Show(akey(1,0),akey(1,1)) end;}

При нажатии F2 видно, что akey(1,0) возвращает смайл ☺, а akey(1,1) ничего.

P.S.
>Присутствует баг, если клавиша задана регэкспом:
Аналогично в случаях если макрос назначен более чем на 1 клавишу, или если клавиша с таким имененем не существует.

JohnDoe

2015-01-05 12:33

updater   bugnote:0013388

Ещё один баг: если нажать F2 два раза (второй раз получается в меню), то это приводит к ошибке:

Step: called on macro in dead status

Причём при закрытии сообщения оно сразу появляется вновь, пока не прибьёшь фар.

JohnDoe

2015-01-07 14:11

updater   bugnote:0013390

build 467 - осталась только одна проблема, при вызове "ненастоящей" клавиши.
На примере вышеприведённого макроса: mf.eval("A1",2)

JohnDoe

2015-01-13 10:27

updater   bugnote:0013400

build 470 - проблем с akey(1,1) больше нет, тикет решён.

akey(1,0) сейчас равнозначно akey(1,1), но практических проблем я из этого пока не вижу.

JohnDoe

2015-01-14 10:35

updater   bugnote:0013402

Last edited: 2015-01-14 10:36

View 2 revisions

build 472 - есть небольшая проблема с akey(1,0):

Macro {area="Common"; key="abc"; action=function() far.Show(akey(1,0),akey(1,1) end;}

lua:eval("abc",2)

В результате akey(1,0) не работает.

shmuel

2015-01-14 11:24

developer   bugnote:0013404

> В результате akey(1,0) не работает.

Из справки: "Type = 0 - возвращает реально нажатое сочетание, которым вызывался макрос".
Реально нажатого сочетания здесь нет, возвращается пустая строка. Что не так?

JohnDoe

2015-01-14 11:31

updater   bugnote:0013405

Вы правы, действительно всё работает согласно Энциклопедии.

Issue History

Date Modified Username Field Change
2013-02-20 18:54 JohnDoe New Issue
2013-02-21 01:41 shmuel Summary В Far 3 поломалась функция akey(1,0) => В Far 3 поломалась функция akey(1,1)
2013-02-21 11:52 shmuel Note Added: 0010359
2013-02-21 12:18 JohnDoe Note Added: 0010360
2013-02-21 12:35 JohnDoe Note Added: 0010361
2013-02-21 13:49 shmuel Note Added: 0010362
2013-07-02 23:34 2useven10 Note Added: 0011241
2013-07-03 00:05 shmuel Note Added: 0011242
2014-01-23 12:52 JohnDoe Note Added: 0011738
2014-01-27 19:32 JohnDoe Note Edited: 0011738 View Revisions
2014-01-27 19:33 JohnDoe Note Edited: 0011738 View Revisions
2015-01-05 12:17 JohnDoe Note Added: 0013386
2015-01-05 12:18 JohnDoe Note Edited: 0013386 View Revisions
2015-01-05 12:19 JohnDoe Note Edited: 0013386 View Revisions
2015-01-05 12:31 JohnDoe Note Edited: 0013386 View Revisions
2015-01-05 12:33 JohnDoe Note Added: 0013388
2015-01-07 14:11 JohnDoe Note Added: 0013390
2015-01-13 10:27 JohnDoe Note Added: 0013400
2015-01-14 10:35 JohnDoe Note Added: 0013402
2015-01-14 10:36 JohnDoe Note Edited: 0013402 View Revisions
2015-01-14 11:24 shmuel Note Added: 0013404
2015-01-14 11:31 JohnDoe Note Added: 0013405
2015-01-14 13:41 shmuel Build => LMb472
2015-01-14 13:41 shmuel Status new => closed
2015-01-14 13:41 shmuel Assigned To => shmuel
2015-01-14 13:41 shmuel Resolution open => fixed
2015-01-14 13:41 shmuel Fixed in Version => 3.0