Conky/技巧与提示
透明度
Conky 支持两种不同类型的透明度:伪透明和真透明。真透明需要安装并运行合成管理器。如果您启用真透明但没有运行合成管理器,则 Conky 将不会是 Alpha 透明的,字体、图像以及背景的透明度都将无法启用。
伪透明
Conky 默认启用伪透明。伪透明的工作原理是从根窗口复制背景图像,并将相关部分用作 Conky 的背景。某些窗口管理器将背景壁纸设置在高于根窗口的级别,这可能导致 Conky 出现灰色背景。要解决此问题,您需要手动设置。以下是使用 feh 的示例:
在 ~/.xinitrc
中
sleep 1 && feh --bg-center ~/background.png &
启用真透明
要启用真透明,您必须运行合成管理器,并将以下行添加到 .conkyrc
的 conky.config 数组中
conky.config = { own_window = true, own_window_transparent = true, own_window_argb_visual = true, own_window_type = 'desktop', }
如果窗口类型 “desktop” 不起作用,请尝试将其更改为 normal
。如果仍然不起作用,请尝试其他选项:dock
、panel
或 override
。
半透明
要在真透明模式下实现半透明,必须在 Conky 配置文件中使用以下设置
conky.config = { own_window = true, own_window_transparent = false, own_window_argb_visual = true, own_window_argb_value = 90, own_window_type = 'desktop', }
要降低 Conky 窗口的透明度,可以将 own_window_argb_value
的值增加到 255。
显示软件包更新信息
pacman-contrib 提供了一个名为 checkupdates
的脚本,用于显示来自官方仓库的软件包更新。使用 ${execi 3600 checkupdates | wc -l}
来显示软件包总数。
tail 文本文件
conky 能够将 conky(1) § tail 文件输出到您的桌面,这对于文本文件非常有用。例如,读取 /var/log/
文件以显示各种日志消息。这些文件中的大多数只能由 root
读取,但不建议以 root
身份运行 conky,因此您需要将自己添加到 log
用户组。此外,由于 systemd 日志文件是二进制文件,因此此功能不如以前那么有用。但是,可以使用 lua 脚本来实现。
显示天气预报
这可以通过读取外部网页来实现,通常是专门用于天气预报的页面。请参阅此帖。另一个 Lua 天气脚本:这里
显示倒计时器
ConkyTimer 是一个简单的倒计时器,用于显示已定义任务的剩余时间。
使用 conkytimer "<任务描述>" <分钟>
启动计时器。
显示 RSS 订阅
Conky 具有原生显示 RSS 订阅的功能,无需外部脚本运行并输出到 Conky 中。例如,要显示最近十个 Planet Arch 更新的标题并每分钟刷新订阅,您可以将以下内容放入 conky.conf
的 TEXT
部分
${rss https://planet.archlinux.org/rss20.xml 300 item_titles 10 }
如果您想显示 Arch 论坛 RSS 订阅,请添加此行
${rss https://bbs.archlinux.org/extern.php?action=feed&type=rss 300 item_titles 4}
其中 300 是刷新间隔(以秒为单位,默认为 15 分钟),4 是您希望显示的条目数。
显示当月日历
您可以使用以下 Lua 脚本来显示日历。它使用 color1
和您配置中的默认颜色。使用等宽字体效果最佳。
#!/usr/bin/env lua conky_color = "${color1}%2d${color}" t = os.date('*t', os.time()) year, month, currentday = t.year, t.month, t.day daystart = os.date("*t",os.time{year=year,month=month,day=01}).wday month_name = os.date("%B") days_in_month = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } -- check for leap year -- Any year that is evenly divisible by 4 is a leap year -- Any year that is evenly divisible by 100 is a leap year if -- it is also evenly divisible by 400. LeapYear = function (year) return year % 4 == 0 and (year % 100 ~= 0 or year % 400 == 0) end if LeapYear(year) then days_in_month[2] = 29 end title_start = (20 - (string.len(month_name) + 5)) / 2 title = string.rep(" ", math.floor(title_start+0.5)) .. -- add padding to center the title (" %s %s\n Su Mo Tu We Th Fr Sa\n"):format(month_name, year) io.write(title) function seq(a,b) if a > b then return else return a, seq(a+1,b) end end days = days_in_month[month] io.write( string.format( string.rep(" ", daystart-1) .. string.rep(" %2d", days), seq(1,days) ):gsub(string.rep(".",21),"%0\n") :gsub(("%2d"):format(currentday), (conky_color):format(currentday) ) .. "\n" )
在您的 conky.conf
中,您可以放置以下内容,确保路径与您保存脚本的位置匹配。
conky.text = [[ ${execpi 3600 ~/.config/conky/cal.lua} ]]
显示 rTorrent 统计信息
请参阅此帖。
显示 WordPress 博客统计信息
这可以通过使用名为 ConkyPress 的 Python 编写的扩展来实现。
显示新邮件数量
Conky 内置支持 IMAP 和 POP3,但不支持通过 SSL 访问。Conky 的 FAQ 建议为此使用 stunnel,并在此处提供了一个示例配置 这里。
按如下方式修改 /etc/stunnel/stunnel.conf
,然后启动 stunnel.service
- TLS 服务器的服务级别配置
[imap] client = yes accept = 143 connect = imap.gmail.com:143 protocol = imap sslVersion = TLSv1 # Service-level configuration for SSL server [imaps] client = yes accept = 993 connect = imap.gmail.com:993
然后将以下内容添加到 conky.conf
conky.config = { imap = "localhost username password [-i 120] [-f 'inbox'] [-p 993]", }
conky.text { Inbox: ${imap_unseen}/${imap_messages} }
Gmail
如果您使用两步验证,则需要使用应用密码。
对于方法 1、2 和 3
在方便的位置(例如在 ~/.scripts/
中)创建以下文件之一。
然后将以下字符串添加到您的 conky.conf
中,以便每五分钟(300 秒)检查您的 Gmail 帐户是否有新邮件并显示
${execi 300 python ~/.scripts/gmail.py}
方法 1
此脚本使用 Gmail 的 Atom API 检索新邮件的数量。
gmail.py
#!/usr/bin/env python3 import urllib.request email = 'your email' password = 'your password' # Set up authentication for gmail auth_handler = urllib.request.HTTPBasicAuthHandler() auth_handler.add_password(realm='mail.google.com', uri='https://mail.google.com/', user=email, passwd=password) opener = urllib.request.build_opener(auth_handler) # ...and install it globally so it can be used with urlopen. urllib.request.install_opener(opener) gmailurl = 'https://mail.google.com/gmail/feed/atom' with urllib.request.urlopen(gmailurl) as page: contents = page.read().decode('utf-8') ifrom = contents.index('<fullcount>') + 11 ito = contents.index('</fullcount>') fullcount = contents[ifrom:ito] print('{} new emails'.format(fullcount))
方法 2
与方法 1 相同,但执行正确的 XML 解析。
gmail.py
#!/usr/bin/env python3 import urllib.request from xml.etree import ElementTree as etree email = 'your email' password = 'your password' # Set up authentication for gmail auth_handler = urllib.request.HTTPBasicAuthHandler() auth_handler.add_password(realm='mail.google.com', uri='https://mail.google.com/', user=email, passwd=password) opener = urllib.request.build_opener(auth_handler) # ...and install it globally so it can be used with urlopen. urllib.request.install_opener(opener) gmailurl = 'https://mail.google.com/gmail/feed/atom' NS = '{http://purl.org/atom/ns#}' with urllib.request.urlopen(gmailurl) as source: tree = etree.parse(source) fullcount = tree.find(NS + 'fullcount').text print('{} new emails'.format(fullcount))
方法 3
相同的方式,但使用 curl
、grep
和 sed
gmail.sh
#!/usr/bin/sh curl -s -u email:password https://mail.google.com/mail/feed/atom | grep fullcount | sed 's/<[^0-9]*>//g'
将 email 和 password 替换为您的数据。
使用 Perl 的 IMAP + SSL
Conky 内置支持 IMAP 帐户,但不支持 SSL。这可以使用来自 此论坛帖子 的脚本来提供。这需要 Perl/CPAN 模块 Mail::IMAPClient 和 IO::Socket::SSL,它们分别在 perl-mail-imapclient 和 perl-io-socket-ssl 软件包中
在 conky 可以读取的位置(例如在 ~/.scripts/
中)创建一个名为 imap.pl
的文件。在此文件中,添加(进行适当的更改)
imap.pl
#!/usr/bin/perl # by gxmsgx # description: get the count of unread messages on imap use strict; use Mail::IMAPClient; use IO::Socket::SSL; my $username = 'example.username'; my $password = 'password123'; my $socket = IO::Socket::SSL->new( PeerAddr => 'imap.server', PeerPort => 993 ) or die "socket(): $@"; my $client = Mail::IMAPClient->new( Socket => $socket, User => $username, Password => $password, ) or die "new(): $@"; if ($client->IsAuthenticated()) { my $msgct; $client->select("INBOX"); $msgct = $client->unseen_count||'0'; print "$msgct\n"; } $client->logout();
添加到 conky.conf
${execi 300 ~/.scripts/imap.pl}
或者您保存文件的任何位置。
如果您使用 Gmail,您可能需要生成一个应用程序专用密码。
或者,您可以像上面所示使用 stunnel:#Gmail
使用 PHP 的 IMAP
另一种使用 PHP 的替代方案。需要安装 PHP,并且必须在 /etc/php/php.ini
中取消注释 extension=imap
。
然后在 conky 可以读取的位置(例如在 ~/.scripts/
中)创建一个名为 imap.php
的文件。使该文件可执行。
在此文件中,添加(进行适当的更改)
imap.php
#!/usr/bin/php <?php // See https://php.ac.cn/manual/function.imap-open.php for more information about // the mailbox string in the first parameter of imap_open. // This example is ready to use with Office 365 Exchange Mails, // just replace your username (=email address) and the password. $mbox = imap_open("{outlook.office365.com:993/imap/ssl/novalidate-cert}", "username", "password"); // Total number of emails $nrTotal = imap_num_msg($mbox); // Number of unseen emails. There are other ways using imap_status to count // unseen messages, but they don't work with Office 365 Exchange. This one does. $unseen = imap_search($mbox, 'UNSEEN'); $nrUnseen = $unseen ? count($unseen) : 0; // Display the result, format as you like. echo $nrUnseen.'/'.$nrTotal; // Not needed, because the connection is closed after the script end. // For the sake of clean public available scripts, we are nice to // the imap server and close the connection manually. imap_close($mbox);
添加到 conky.conf
${execi 300 ~/.scripts/imap.php}
或者您保存文件的任何位置。
此脚本显示 A/B,其中 A 是未见邮件的数量,B 是邮箱中邮件的总数。还有很多其他信息可以通过许多 PHP 函数获得,例如 imap_Status (https://php.ac.cn/manual/function.imap-status.php)。只需查看有关 IMAP 的 PHP 文档:https://php.ac.cn/manual/ref.imap.php。
显示活动网络接口图形
要测试网络接口当前是否处于活动状态,您可以在接口的 operstate
上使用测试 Conky 变量 if_existing
。以下是 wlo1 的示例
draw_graph_borders yes ${if_existing /sys/class/net/wlo1/operstate up} ${color #0077ff}Net Down:$color ${downspeed wlo1} ${color #0077ff}Net Up:$color ${upspeed wlo1} ${color #0077ff}${downspeedgraph wlo1 32,155 104E8B 0077ff} $alignr${color #0077ff}${upspeedgraph wlo1 32,155 104E8B 0077ff} ${endif}
这是预期结果
https://i.imgur.com/pQQbsP6.png
用户贡献的配置示例
- 带有 NVIDIA 支持的示例 rings 脚本 - gist