Page 1 of 2

Шаблон макроса

Posted: Thu 25 Aug, 2016 08:13
by Majestio
Здравствуйте!

Нужна ваша консультация. С Lua познакомился пару дней назад, еще плаваю. Написал простенький макрос - вроде работает. Однако, нашел странный баг/фича, не знаю ... короче

Code: Select all

local TabSize = Editor.Set(0)
... мне только один раз вернул нормальное значение размера табуляции из настроек, остальные попытки - получаю нуль. Потом Фар вообще свалился по ошибке (деление на нуль где-то в его недрах). Вот я и подумал, а "законно" ли а оформил свой макрос. Посмотрите пожалуйста шаблон, который я сконструировал. Можно ли так:

Code: Select all

--[[
    Testo for Far Manager
    Version: 1.0
    Copyright (C) 2016 Majestio
--]]

local Majestio = {}

Macro {
  area = "Editor"; 
  key = "CtrlAltT"; 
  description = "Testo Macros"; 
  action = function() Majestio.Testo() end;
}

Majestio.Testo = function ()
  if Editor.Sel(0,4) == 1 then
    local BlockLineUp = Editor.Sel(0,0)
    local BlockLineDn = Editor.Sel(0,2)
    local BlockPosOne = Editor.Sel(0,1)
    local BlockPosTwo = Editor.Sel(0,3)
    local CursorLine  = Editor.Pos(0,1)
    local CursorPos   = Editor.Pos(0,2)
    --local TabSize = Editor.Set(0)
    local TabSize = editor.GetInfo().TabSize
    msgbox('Info',
     ' Cursor: '..CursorPos..':'..CursorLine..'\n'..
     ' BlockUp: '..BlockPosOne..':'..BlockLineUp..'\n'..
     ' BlockDn: '..BlockPosTwo..':'..BlockLineDn..'\n'..
     ' TabSize: '..TabSize,
     0x20008
    )
  end
end

Шаблон макроса

Posted: Thu 25 Aug, 2016 08:21
by Shmuel
Majestio, вот мой шаблон для вставки макроса.
Кажется у SimSU есть более навороченный.

Шаблон макроса

Posted: Thu 25 Aug, 2016 08:28
by Majestio
Не не не ... я не соревнуюсь в навороченности) Мне важно/хочется чтобы "интерфейснаая" часть Macro {} была в начале. Поэтому и извратился с локальной таблицей local Majestio = {} ... но в Lua у меня не то, что первые шаги, а, скорее, заглядывание в приоткрытую дверь)))

Посему, мне важно знать - косячу я в своем шаблоне, и ли так прокатит.

Шаблон макроса

Posted: Thu 25 Aug, 2016 08:34
by John Doe
Majestio wrote: Можно ли так:
Конечно
Majestio wrote: остальные попытки - получаю нуль. Потом Фар вообще свалился по ошибке (деление на нуль где-то в его недрах).
См. Поведение при обнаружении ошибок

P.S.
Сейчас для макросов доступно 2 АПИ, функционально несколько перекрывающие друг друга.
И при прочих равных условиях следует отдавать предпочтение апи плагинов (см. шапку темы luamacro)

Шаблон макроса

Posted: Thu 25 Aug, 2016 08:42
by Majestio
John Doe wrote:И при прочих равных условиях следует отдавать предпочтение апи плагинов (см. шапку темы luamacro)
Хм... Странно, заменил local TabSize = Editor.Set(0) на local TabSize = editor.GetInfo().TabSize — все работает без сбоев :wacko:

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

Шаблон макроса

Posted: Thu 25 Aug, 2016 08:50
by John Doe

Code: Select all

local TabSize = Editor.Set(0,-1)
Вот так работает. И именно это описано в Энциклопедии
Но я согласен, что опуская второй параметр ожидаешь что он будет принят как -1.
Ошибка или нет, вопрос к Shmuel.

Но уж точно падать ничего не должно, убедитесь именно Editor.Set(0) вызывает падение.

Шаблон макроса

Posted: Thu 25 Aug, 2016 08:53
by Majestio
Понял. Пасип, запишу)

Шаблон макроса

Posted: Thu 25 Aug, 2016 09:12
by Shmuel
John Doe wrote: Но я согласен, что опуская второй параметр ожидаешь что он будет принят как -1.
Ошибка или нет, вопрос к Shmuel.
Поскольку документация об этом умалчивает, то (формально) это не ошибка. То, что падает, естественно - баг.

Шаблон макроса

Posted: Thu 25 Aug, 2016 09:16
by John Doe
Опущенный Value сейчас принимается за 0. Но корректное ли это значение для табуляции?
Сказано "Возвращает предыдущее значение опций или -1, если данные указаны некорректно"

Просто мысли вслух.
Очевидно что это значение фар считает корректным, раз позволяет установить.

Update
Но да, падает после этого при нажатии Tab, значит значение всё же некорректно

Шаблон макроса

Posted: Thu 25 Aug, 2016 09:30
by Majestio
John Doe wrote:Сейчас для макросов доступно 2 АПИ, функционально несколько перекрывающие друг друга.
И при прочих равных условиях следует отдавать предпочтение апи плагинов (см. шапку темы luamacro)
Т.е. (в моем случае) предпочтительнее использовать local TabSize = Editor.Set(0,-1), я правильно понял?

Шаблон макроса

Posted: Thu 25 Aug, 2016 09:33
by John Doe
Majestio wrote: я правильно понял?
Наоборот, предпочтительнее апи плагинов, т.е. editor.GetInfo().TabSize

Шаблон макроса

Posted: Thu 25 Aug, 2016 09:34
by Majestio
John Doe wrote:Опущенный Value сейчас принимается за 0
Согласно докам по Lua, вроде nil, а не нуль?

Шаблон макроса

Posted: Thu 25 Aug, 2016 09:38
by John Doe
Согласно докам по Lua, вроде nil, а не нуль?
Для макроапи (существовашего и до внедрения луа) нет понятия nil, поэтому и 0.
Хотя в доках нет, наверно стоит упомянуть в статье "Изменения API в сравнении с макроязыком"

Шаблон макроса

Posted: Thu 25 Aug, 2016 09:39
by John Doe
John Doe wrote: Опущенный Value сейчас принимается за 0. Но корректное ли это значение для табуляции?
Сказано "Возвращает предыдущее значение опций или -1, если данные указаны некорректно"
Для сравнения

Code: Select all

editor.SetParam(nil,"ESPT_TABSIZE",0)
В результате значение выставляется в 8 (всё верно, т.к. сказано "Значение размера табуляции, выходящее за указанные границы, выставляется равным 8.")

Но тут ещё возникает вопрос к luafar: в Энциклопедии сказано "iParam содержит новое значение - от 1 до 512.", но editor.SetParam возвращает только true.

Шаблон макроса

Posted: Thu 25 Aug, 2016 09:45
by Shmuel
John Doe wrote: Но тут ещё возникает вопрос к luafar: в Энциклопедии сказано "iParam содержит новое значение - от 1 до 512.", но editor.SetParam возвращает только true.
И кто мешает глянуть в код LuaFAR, прежде, чем предъявлять к нему претензии?