Как реализовать базовую функцию Lua в Conky?

Я пытаюсь добавить в свой Conky функцию, которая печатает длину строки для целей отладки. Код внутри файла с именем test.lua довольно тривиален:

function test(word)
return string.len(word)
end

... и я загружаю его так. В моем разделе conky.config у меня есть:

lua_load = '/home/xvlaze/test.lua',
lua_draw_hook_pre = 'test'

... в разделе conky.text у меня есть:

${lua test "fooo"}

...где test — имя функции, а fooo — строка для проверки.

Ожидаемый результат должен быть печатным 4 в Conky, но вместо этого я получаю:

conky: llua_do_call: function conky_test execution failed: /home/xvlaze/test.lua:2: attempt to index a nil value (local 'string')
conky: llua_getstring: function conky_test didn't return a string, result discarded

Я просмотрел документацию, но ничего не нашел. Кто-нибудь знает, где провал?


person xvlaze    schedule 28.07.2017    source источник
comment
Откровенно говоря, назвать свой параметр string, как и обычную библиотеку string, добром закончиться не может.   -  person Bartek Banachewicz    schedule 28.07.2017
comment
В этом случае он даже должен работать. Но да. Это плохая идея.   -  person moteus    schedule 28.07.2017
comment
Обновлено. Выглядит хуже.   -  person xvlaze    schedule 28.07.2017
comment
@xvlaze Это весь твой сценарий? Похоже, у вас есть переменная с именем string, которая переопределяет библиотеку строк (может быть, вы сделали string = 'this')?   -  person DavisDude    schedule 29.07.2017
comment
@DavisDude да, это весь мой сценарий.   -  person xvlaze    schedule 30.07.2017
comment
ОБНОВЛЕНИЕ: нашел решение и написал небольшое пояснение. Я обновлю, когда смогу.   -  person xvlaze    schedule 06.08.2017


Ответы (1)


Несколько рекомендаций по реализации функций в Conky:

  • Прежде всего: ВЫ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ conky_ ПЕРЕД НАЗВАНИЕМ ВАШЕЙ ФУНКЦИИ. В противном случае вы получите следующую ошибку при запуске Conky:

    attempt to call a nil value
    
  • Во-вторых: ВЫ ДОЛЖНЫ ВСЕГДА ВОЗВРАЩАТЬ ЗНАЧЕНИЕ. Я не против повторить это — это важно. В противном случае вы получите:

    function foobar didn't return a string, result discarded
    function_result
    

    ...в вашем терминале, и ваш Conky останется пустым от значений, связанных с вашим дополнительным кодом. Ничего не будет напечатано о вашей функции.

  • И последнее, но не менее важное: ВЫ ДОЛЖНЫ ВСЕГДА ВЫЗЫВАТЬ СВОЮ ФУНКЦИЮ ТАК:

    lua_load = '/path/to/function.lua',
    -- Whatever content...
    ${lua function_name function_parameter1 function_parameterN} -- In case you use more than one parameter.
    

Таким образом, шаблон фиктивной функции может быть:

  • ГЛАВНЫЙ ФАЙЛ (conky.conf):

    conky.config = {
        -- Whatever content... Lua styled comments.
        lua_load = '/path/to/function.lua',
    }
    
    conky.text = [[
        # Whatever content... In this section comments are started with '#'!    
        ${lua function_name parameter}
    ]]
    
  • ФУНКЦИОНАЛЬНЫЙ ФАЙЛ:

    function conky_function_name(parameter)
        -- Whatever content... Remember this is Lua, not conky.text syntax. Always use '--' comments!
        return whatever -- No return, no party. A function MUST always return something!
    end
    
person xvlaze    schedule 16.08.2017
comment
сейчас не работает, чего-то не хватает?? должен ли function.lua быть исполняемым? - person nyxee; 08.03.2021