Como fazer manipulação matemática com variáveis em conky?

1

Isso faz parte do meu código 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}

Observe como, com o gráfico da CPU, você pode usar a variável $minimum_width . Eu gostaria de render metade desse valor para cada uma das downspeedgraph e upspeedgraph (juntamente com o deslocamento necessário para fazer o espaçamento entre elas).

O operador de divisão / não tem efeito quando eu tentei. Existe uma maneira de aplicar operações matemáticas a variáveis em conky para alcançar o efeito pretendido?

    
por Ébe Isaac 21.05.2018 / 06:03

1 resposta

1

Como o conky geralmente é construído para usar lua , pode haver uma solução mais limpa envolvendo esse idioma, mas aqui está um script de pré-processamento rápido escrito em perl . Ele espera um arquivo de configuração simples e extrai da parte conky.config={...} as variáveis que estão sendo definidas. Por exemplo, minimum_width = 230, criará uma variável perl com o mesmo nome e a configurará para esse valor.

Em seguida, ele passa pela parte conky.text=[[...]] e procura expressões dentro de @...@ . Isso pressupõe que você não use o caractere @ para qualquer outra coisa. Em seguida, ele avalia a expressão perl que você colocou dentro dela. Perl também usa $ na frente de variáveis simples, então você pode usar expressões como @$minimum_width/5@ e ele será substituído por 230/5, ou seja, 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;

Coloque esse script em um arquivo, diga conkyparse , e torne-o executável com chmod +x conkyparse . Mova o arquivo ~/.conkyrc para o valor preconky e edite-o conforme indicado acima. Em seguida, antes de executar o conky, execute conkyparse <preconky >~/.conkyrc para que as expressões sejam calculadas e substituídas.

Note que você também pode inventar e usar seus próprios nomes de variáveis. Para evitar um erro de conky, você precisa ocultar sua definição dentro de um comentário (uma linha iniciando -- ). Aqui está um exemplo de preconky file:

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

e o arquivo de saída resultante

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

Tags