如何在 conky 中对变量进行数学运算?

如何在 conky 中对变量进行数学运算?

这是我的 conky 代码的一部分。

conky.config = {
    alignment = 'top_right',
    background = true,
    color2 = '2ECC71',
    cpu_avg_samples = 2,
    default_color = 'FFFFFF',
    double_buffer = true,
    font = 'Bitstream Vera Sans:size=8',
    gap_x = 25,
    gap_y = 13,
    minimum_width = 230,
    no_buffers = true,
    own_window = true,
    own_window_type = 'override',
    own_window_transparent = true,
    update_interval = 1.0,
    use_xft = true,
}

${voffset 20}${goto 40}${color e19e19}${cpugraph 14, $minimum_width e19e19 ffffff}
${goto 40}${color}CPU${font Bitstream Vera Sans:bold:size=8}$alignr$cpu%

${voffset 15}${goto 40}${color}${membar 14, $minimum_width}
${goto 40}${color}RAM${font Bitstream Vera Sans:bold:size=8}$alignr $mem / $memmax   $memperc%$font

${voffset 15}${goto 40}${color}${downspeedgraph eno1 14, 115 55ff55 55ff55} $alignr${upspeedgraph eno1 14, 115 554455 ff55ff}

请注意如何在 CPU 图表中使用变量$minimum_width。我想将这个金额的一半分配给每个 和downspeedgraphupspeedgraph以及必要的偏移量以在之间进行间距)。

/当我尝试时,除法运算符没有任何作用。有没有办法对conky中的变量进行数学运算来达到预期的效果?

答案1

由于 conky 通常是为了使用而构建的,lua因此可能有一个涉及该语言的更干净的解决方案,但这里是一个用perl.它需要一个简单的配置文件,并从conky.config={...}正在设置的变量中提取部分。例如,minimum_width = 230,将创建一个同名的 perl 变量并将其设置为该值。

然后它会遍历该conky.text=[[...]]部分并寻找内部的表达式@...@。这假设您不将该@角色用于其他任何用途。然后它会评估您放入其中的 perl 表达式。 Perl 也在$简单变量前面使用,因此您可以使用类似 的表达式@$minimum_width/5@,它将被替换为 230/5 即 46。

#!/usr/bin/perl
# https://unix.stackexchange.com/a/445140/119298
# parse conky 1.10 vars in conky.config and eval @expression@ in .text part
use strict;
use Safe;
my $pack = new Safe();
sub replace{
    my ($a,$body,$c) = @_;
#    $body =~ s/@(.*?)@/eval($1)/gse;
    $body =~ s/@(.+?)@/$pack->reval($1)/gse; # evaluate @expression@ using vars
    return $a.$body.$c;
}
my $config = join('',<>);
if($config =~ m/conky\.config\s*=\s*\{(.*?)\}/s){
    my $vars = "$1,";
    while($vars =~ m/\s*([a-z0-9_]+)\s*=\s*(.+?)\s*,/gs){
        ${$pack->varglob($1)} = $2;
    }
}
$config =~ s/(conky\.text\s*=\s*\[\[)(.*?)(\]\])/replace($1,$2,$3)/se;
print $config;

将此脚本放入一个文件中,例如conkyparse,并使其可执行chmod +x conkyparse。将文件移动~/.conkyrc到 say,preconky并按照上面给出的方式对其进行编辑,然后在运行 conky 之前,运行conkyparse <preconky >~/.conkyrc以计算和替换表达式。


请注意,您还可以发明和使用自己的变量名称。为了避免 conky 错误,您需要将它们的定义隐藏在注释中(以 开头的行--)。这是一个示例preconky文件:

conky.config = {
    minimum_width = 230,
 -- myvar = 22,
}
conky.text = [[
  ${goto @3*$myvar@} ${cpugraph 14,@$minimum_width/2@ e19e19 ffffff}
]]

以及生成的输出文件

conky.config = {
    minimum_width = 230,
 -- myvar = 22,
}
conky.text = [[
  ${goto 66} ${cpugraph 14,115 e19e19 ffffff}
]]

相关内容