Thunderbird/Lightning 提供 5 种不同的时间间隔来刷新远程日历,包括“每分钟”和“每 60 分钟”。
但是,我的工作要求我有十几个远程日历,其中大多数不会每周更改一两次以上。结果是,即使在最长的刷新间隔内,Thunderbird 也会花费大量时间重新下载和更新不需要更新的日历数据,并且在这样做时速度会变得非常慢。
是否可以调整 Lightning 以获得比默认允许的更长的刷新时间(例如每天一次)?
答案1
刷新间隔是在 Lightning 扩展的源代码中静态指定的,但 Thunderbird 扩展代码全部使用 Javascript 和 Gecko 用于指定用户界面的 XML 方言,因此添加所需的任何间隔并不特别困难。操作方法如下:
首先,如果你手边还没有,你需要下载副本Lightning 安装包。(以下假设 Lightning 1.9.1;兴趣点在几个版本中可能没有太大变化,但为了获得最佳效果,请确保您正在使用的版本。)
拿到 .xpi 文件后,找到一个方便的、空的目录来解压它 - XPI 安装程序只是一个重命名的 zip 文件,因此unzip
WinZip、WinRar 等都可以处理它。(您可能必须先将其重命名为“.xpi.zip”,或者右键单击并选择“打开方式...”,具体取决于情况。)提取您在其中找到的所有文件,保留目录。
通常,你通常可以通过搜索其中出现的字符串来找到处理给定对话框或其他 UI 功能的代码。在本例中,我搜索了“显示提醒”:
me@box [lightning] $ find -exec grep -nH "Show Reminders" {} \;
Binary file ./chrome/calendar-en-GB.jar matches
Binary file ./chrome/calendar-en-US.jar matches
me@box [lightning] $ grep -a 'Show Reminders' chrome/calendar-en-US.jar
<!ENTITY calendarproperties.firealarms.label "Show Reminders">
这告诉我们,除了本地化之外,Lightning 代码在内部将我们正在寻找的字符串称为calendarproperties.firealarms.label
。这很方便,因为现在我们知道在实际代码中要查找什么;我们将在那里找到该引用的至少一个实例,并且该实例将非常接近与我们感兴趣的下拉列表有关的内容。所以:
me@box [lightning] $ find -exec grep -nH 'calendarproperties.firealarms.label' {} \;
[many matches on i18n dialect files elided...]
./chrome/calendar/content/calendar/calendar-properties-dialog.xul:102: label="&calendarproperties.firealarms.label;"
啊哈!这是在 .xul 文件中,所以我们知道它定义了一个用户界面块;它label=
看起来像是 UI 控件的标签属性,这意味着我们找到了“编辑日历”对话框的代码。我们要找的下拉列表出现在对话框中“显示提醒”复选框之前不久,因此可以肯定它们在源代码中会以类似的方式并列 - 事实上,当我们查看 calendar-properties-dialog.xul 时,我们会在第 79-89 行看到以下内容:
<menulist id="calendar-refreshInterval-menulist"
disable-with-calendar="true"
label="&calendarproperties.refreshInterval.label;">
<menupopup id="calendar-refreshInterval-menupopup">
<!-- This will be filled programatically to reduce the number of needed strings -->
<menuseparator id="calendar-refreshInterval-manual-separator"/>
<menuitem id="calendar-refreshInterval-manual"
value="0"
label="&calendarproperties.refreshInterval.manual.label;"/>
</menupopup>
</menulist>
嗯。我们还没有完全搞定,因为间隔规范不在这里。如果该注释确切地提到哪个源文件包含负责填充下拉选项的代码,那就太好了,但也许经验丰富的 XUL 黑客不需要被告知这一点。话虽如此,它不应该造成太多的复杂化;我们现在有了下拉菜单的 ID,几乎肯定会在填充下拉菜单的任何代码中引用它,因此:
me@box [lightning] $ find -exec grep -nH 'calendar-refreshInterval-menulist' {} \;
./chrome/calendar/content/calendar/calendar-properties-dialog.js:91: let value = getElementValue("calendar-refreshInterval-menulist");
./chrome/calendar/content/calendar/calendar-properties-dialog.js:153: let menulist = document.getElementById("calendar-refreshInterval-menulist");
./chrome/calendar/content/calendar/calendar-properties-dialog.xul:79: <menulist id="calendar-refreshInterval-menulist"
第三个匹配指向我们已经知道的 .xul 文件,我们可以忽略它。第一个匹配指向一些获取下拉列表当前选定值的代码,我们可以忽略它。第二另一方面,match 引用了整个下拉菜单,这可能正是我们所需要的。事实上,如果我们检查 calendar-properties-dialog.js,我们会在 154-162 行发现:
for each (let min in [1, 5, 15, 30, 60]) {
let menuitem = createMenuItem(min);
separator.parentNode.insertBefore(menuitem, separator);
if (refreshInterval == min) {
menulist.selectedItem = menuitem;
foundValue = true;
}
}
我们在这里!一组以分钟为单位的值,与您在编辑日历下拉菜单中看到的值相对应。
现在,看看这些菜单项的设置方式,整个过程似乎假设它们只能以分钟为单位表示(例如函数createMenuItem
,第 137-146 行)。如果我们要将此更改贡献给上游,我们肯定会修改该函数,以便它可以生成带有任意时间单位标签的下拉元素,例如“每 4 小时”、“每 1 天”等。我们仍然可以保留以分钟为单位的底层表示,但我们希望清理显示代码,使其看起来不那么难看。
但是,由于您真正想要的只是功能本身,因此我们将把它作为练习留给感兴趣的读者。只需将您想要的间隔添加到第 154 行数组的末尾,例如:
for each (let min in [1, 5, 15, 30, 60, (60*4), (60*8), (60*12), (60*24)]) {
(当然,您可以将它们添加为 240、480、720 和 1440,但为什么不让解释器完成这项工作呢?花费 CPU 时间来节省程序员的时间。这只会在您打开“新日历”和“编辑日历”对话框时进行评估,因此您实际上并没有让计算机做很多工作。)
保存更改并关闭文件后,剩下的就是重新打包更新的 Lightning 代码并将其安装在 Thunderbird 中。这很简单:
me@box [lightning] $ zip -r lightning-1.9.1-me.xpi *
(或者使用 WinZip、WinRAR 等,无论您有什么。要点是,完成的 ZIP 文件必须保留目录结构,并且其文件名必须以 .xpi 结尾 - 就像在解压步骤中一样,如果需要,可以在创建后重命名。)
然后像安装任何 Thunderbird 附加组件一样安装您新创建的 XPI 文件。完成此操作并重新启动 Tbird 后,打开“编辑日历”下拉菜单将出现以下内容:
为了完整起见,我必须提到我还没有实际测试以确认日历是否按照给定的间隔进行刷新,因为我还没有修复的问题是当我在附加组件管理器中选择“扩展”选项卡时,我的 Thunderbird 会抛出异常——我通过创建一个新的 Tbird 配置文件并在那里安装修改后的 Lightning 附加组件来生成上面的屏幕截图。
也就是说,我没有理由怀疑会出现问题,因为代码中只有一个地方指定了间隔长度选项;一旦在对话框中设置,它们就会与 Thunderbird 配置数据一起存储。
这引出了一个问题:如果您知道想要自定义刷新间隔的日历的 GUID,您可以在 Thunderbird 的“首选项”对话框的“高级”选项卡中提供的“配置编辑器”(即 about:config)中进行自定义;将值更改calendar.registry.[guid].refreshinterval
为您想要的任意分钟数。
为了做到这一点,您需要能够将日历 GUID 映射到名称,这可以在 about:config 中非常直接地完成。如果您.name
在搜索框中输入内容,将会出现许多结果,但其中只有少数结果属于该calendar.registry
组,并且所有这些结果都应以粗体显示,因为它们在 Thunderbird 中默认不存在;每个值都是日历名称,并且每个结果在属性名称中包含日历 GUID,您可以轻松构建名称和 GUID 之间的映射。然后.[guid].refreshinterval
在搜索框中输入内容,自定义值,就大功告成了。
但是,如果您有许多日历需要处理,这将是一个麻烦事,并且根据屏幕截图背景中可见的列表来判断,您有相当多的日历需要应用此更改 - 在这种情况下,我想对话框的改变可能会让您更轻松地完成这件事。
特别是因为你可以下载包含本文所述修改的 Lightning 版本,这里!
答案2
我一直在使用相同的编辑来让网络 ics 每天或每周刷新。在列表中添加了 (60*24) 和 (60*24*7)。但您不必费心解压和重新打包 xpi 文件。只需找出您的应用程序/扩展所在的位置。在我的 Mac 上,它恰好位于 ~/Library/Thunderbird/Profiles/...somepath.../chrome/calendar/content/calendar 目录中。在那里,按照上面所述编辑文件 calendar-properties-dialog.js。然后您需要做的就是重新启动 thunderbird,您将看到新的间隔设置出现。
我的 ligting 有工作、个人、假期等日历。我还拥有我所有球队的所有运动 (NFL/MLB/NBA/NHL) 球队时间表。这些时间表实际上不会改变,所以我每周更新一次。效果非常好。如果需要,我可以随时手动同步。