Conky — Lua Config — Пользовательские переменные

Я хочу использовать пользовательские переменные в моей конфигурации Lua conky, чтобы обмениваться конфигурацией между компьютерами. Почему следующее не работает, он использует простой код Lua:

conky.config={..}

-- set variables
work = "COMPUTERNAME"
lan  = "wlp9s0"
-- compare with current host name (conky's global variable)
if work == nodename then
  lan = "enp3s0"
end 

-- use $lan in conky's text
conky.text = [[${color yellow}$lan ${alignr}${addr wlp9s0}]]

Я не нашел никакой документации или примера использования настраиваемых переменных. $lan не разрешается и печатается как ${lan}


person Jens Peters    schedule 02.11.2016    source источник
comment
Я отредактировал вопрос, указал, что значит не работает   -  person Jens Peters    schedule 03.11.2016
comment
Я новичок в Conky, но разве это не должно быть conky.text = [[${color yellow}${lan} ${alignr}${addr wlp9s0}]] с дополнительными {} вокруг lan?   -  person Danil Gaponov    schedule 03.11.2016
comment
Нет, {} требуется только тогда, когда задействованы параметры, тем не менее, он имеет тот же эффект, со скобками и без них.   -  person Jens Peters    schedule 03.11.2016


Ответы (1)


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

Мне кажется, что 'variables' используется в поле conky.text, и другие поля шаблона не являются частью среды Lua. То есть синтаксис $ и ${}, вероятно, не выполняет поиск в среде для интерполяции значений. Это может также означать, что переменная nodename, с которой вы сравниваете, на самом деле равна nil.

В любом случае, если ваша переменная lan не интерполируется, быстрое решение состоит в том, чтобы просто объединить ваши строки:

conky.text = [[${color yellow}]] .. lan.. [[ ${alignr}${addr wlp9s0}]]

Или рассмотрите возможность написания собственной функции итерполяции строк, если вам нужна более чистая строка:

local function interp (s, t)
    return s:gsub('(#%b{})', function (w)
        return t[w:sub(3, -2)] or w
    end)
end

conky.text = interp([[${color yellow}#{lan} ${alignr}${addr wlp9s0}]], {
    lan = lan
})

Обратите внимание: если nodename не является частью среды Lua, вы можете попробовать использовать io.popen для запуска hostname вручную, а затем прочитать из дескриптора файла, который он возвращает.

person Oka    schedule 03.11.2016
comment
Да, подсказка интерполяции сделала свое дело. Я новичок в LUA, возможно, это было фундаментальное непонимание самого себя. Спасибо. Чтобы завершить ваш ответ, первое имя узла является частью Conky и разрешается в правильное значение. Объединение строк внутри conky,text не работало по неизвестной причине. Что сработало для меня. Я помещаю свой оператор if в начало conkyrc, определяю шаблон template0=[[${color yellow}]] .. lan .. [[${alignr}${addr wlp9s0}]] и использую его в conky.text. Следующая проблема — решить ${addr wlp9s0}, так как ${addr $lan} не работает. - person Jens Peters; 04.11.2016
comment
@JensPeters Является ли nodename фактической переменной в том смысле, что она предоставляется средой Lua, или это просто «переменная» Conky в том смысле, что ее можно разрешить с помощью строки шаблона? И снова $lan не сработает, потому что Conky не выполняет поиск в вашей среде Lua для переменных. Вы можете сделать '${addr' .. lan .. '}' или какое-либо другое решение конкатенации. Я могу немного обновить свой вопрос, чтобы дать вам более четкое представление об окружающей среде. - person Oka; 04.11.2016