diff --git a/conky.conf b/conky.conf index 0511ea3..a3875e6 100644 --- a/conky.conf +++ b/conky.conf @@ -39,10 +39,11 @@ conky.config = { conky.text = [[\ -RAM:${lua_parse fmt %3.0f%% ${memperc}} \ -Swap:${lua_parse fmt %3.0f%% ${swapperc}} \ -CPU:${lua_parse fmt %3.0f%% ${cpu cpu0}} \ +RAM:${lua_parse printf %3.0f%% ${memperc}} \ +Swap:${lua_parse printf %3.0f%% ${swapperc}} \ +CPU:${lua_parse printf %3.0f%% ${cpu cpu0}} \ / ${fs_used /}/${fs_size /} \ +${loadavg} \ ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1} \ -Net: ${lua_parse fmt2 %10s▲%10s▼ ${upspeed wlp4s0} ${downspeed wlp4s0}} +Net: ${lua_parse printf %10s▲%10s▼ ${upspeed wlp4s0} ${downspeed wlp4s0}} \ ]]; diff --git a/scripts.lua b/scripts.lua index 9e9831e..5fd84c8 100644 --- a/scripts.lua +++ b/scripts.lua @@ -2,13 +2,127 @@ function trim(s) return (s:gsub("^%s*(.-)%s*$", "%1")) end -function conky_fmt(format, a) - return string.format(format, tonumber(trim(conky_parse(a)))) +function split_fmt(f) + if not type(f) == "string" then + io.stderr:write("ERROR! Argument '" .. format .. "' is not a string.") + return nil + end + + local ret = {} + local curr = "" + local in_spec = false + for char in string.gmatch(f, ".") do + if in_spec then + if string.match(char, '[cdEefgiouXx]') then + curr = curr .. char + table.insert(ret, curr) + in_spec = false + curr = "" + elseif string.match(char, '[qs]') then + if string.match(curr, '^%%[0-9]*$') then + curr = curr .. char + table.insert(ret, curr) + in_spec = false + curr = "" + else + io.stderr:write("Invalid format: '" .. curr .. char .. "'\n") + return nil + end + elseif string.match(char, '[0-9%.]') then + curr = curr .. char + elseif string.match(char, '%%') then + if string.match(curr, '^%%') then + curr = curr .. char + table.insert(ret, curr) + in_spec = false + curr = "" + else + io.stderr:write("Invalid format: '" .. curr .. char .. "'\n") + return nil + end + else + io.stderr:write("Invalid format: '" .. curr .. char .. "'\n") + return nil + end + else + if char == '%' then + in_spec = true + if curr ~= "" then + table.insert(ret, curr) + end + curr = char + else + curr = curr .. char + end + end + end + if curr ~= "" then + table.insert(ret, curr) + end + return ret end -function conky_fmt2(format, a, b) - as = conky_parse(a) - bs = conky_parse(b) - - return string.format(format, as, bs) +function table_length(t) + local count = 0 + for _ in pairs(t) do + count = count + 1 + end + return count +end + +function count_formats(formats) + if type(formats) ~= 'table' then + io.stderr:write("ERROR! formats is not a table.\n") + return nil + end + + local count = 0 + for i,v in ipairs(formats) do + if string.match(v, '^%%') and not string.match(v, '%%$') then + count = count + 1 + end + end + return count +end + +function is_fmt_spec(str) + return string.match(str, "^%%") +end + + +function conky_printf(format, ...) + formats = split_fmt(format) + values = {...} + + if count_formats(formats) ~= table_length(values) then + io.stderr:write("ERROR! Number of format specifiers to printf doesn't match the number of values passed.\n") + return nil + end + + local parsed_values = {} + for i,v in ipairs(values) do + parsed_values[i] = conky_parse(v) + end + for i,fs in ipairs(formats) do + if is_fmt_spec(fs) then -- we have a format specifier + if string.match(fs, '[dEefgiouXx]$') then -- we have a numeric format specifier, convert value to number + parsed_values[i] = tonumber(trim((parsed_values[i]))) + end + end + end + local formatted_output = "" + local idx = 1 + for i,fs in ipairs(formats) do + if is_fmt_spec(fs) then + if not string.match(fs, '%%$') then + formatted_output = formatted_output .. string.format(fs, parsed_values[idx]) + idx = idx + 1 + else + formatted_output = formatted_output .. '%' + end + else + formatted_output = formatted_output .. fs + end + end + return formatted_output end