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. 나는 이 양의 절반을 각 합계에 할당하고 싶습니다 downspeedgraph( upspeedgraph그리고 그 사이의 공간에 필요한 오프셋).

/나누기 연산자는 내가 시도할 때 아무 작업도 수행하지 않습니다. 원하는 효과를 얻기 위해 conky의 변수에 대해 수학적 연산을 수행할 수 있는 방법이 있습니까?

답변1

conky는 일반적으로 사용하도록 만들어졌기 때문에 lua해당 언어와 관련된 더 깔끔한 솔루션이 있을 수 있지만 여기에는 perl간단한 구성 파일이 필요하며 conky.config={...}설정되는 변수에서 일부를 추출합니다. 예를 들어, minimum_width = 230,동일한 이름을 가진 Perl 변수가 생성되어 해당 값으로 설정됩니다.

그런 다음 해당 섹션을 반복하여 conky.text=[[...]]내부의 표현식을 찾습니다 @...@. 이는 @캐릭터를 다른 용도로 사용하지 않는다고 가정합니다 . 그런 다음 입력한 Perl 표현식을 평가합니다. Perl은 $단순 변수 앞에 도 사용되므로 비슷한 식을 사용하면 @$minimum_width/5@46인 230/5로 대체됩니다.

#!/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말할 파일을 이동 하고 편집한 다음 conky를 실행하기 전에 실행하여 표현식을 평가하고 교체합니다.preconkyconkyparse <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}
]]

관련 정보