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, ще дам отговор въз основа на някои предположения, които направих, след като прочетох различните секции за конфигурация, намерени на wiki.

Струва ми се, че 'променливите', използвани в полето 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