Hack 和 / - Mutt 和虚拟文件夹
如果您还不知道,我是一个 mutt 爱好者^H^H^H^H^H用户。 到了现在,我已经不记得我是什么时候开始使用 mutt 的了。 我只知道每次我尝试其他邮件客户端时,都会因为浏览电子邮件所花费的时间而感到沮丧。 还有,尝试使用 vi 快捷键绑定来操作 GUI 电子邮件程序——它(通常)不起作用。
如果我如此喜欢 mutt,为什么要尝试其他邮件客户端呢? 嗯,一方面,其他一些邮件客户端确实有一些有趣的功能,例如虚拟文件夹。 使用虚拟文件夹,您可以创建一个关键词搜索,然后所有匹配搜索的消息都会出现在您可以浏览的特殊文件夹中。 嗯,事实证明,如果您使用 maildir 并愿意编写一些脚本,那么 mutt 中也提供了相同的功能。
mutt 中默认搜索功能的一个主要问题是,您一次只能在一个文件夹中搜索。 我几乎将所有重要的东西都存储在电子邮件中,并且我有许多不同的文件夹,甚至有更多的 procmail 规则来对它们之间的传入邮件进行排序。 这样做的一个缺点是,有时我不记得某个特定的电子邮件消息到底位于哪个文件夹中。
mutt 搜索问题的解决方案利用了一个事实,即如果您在邮件服务器上使用 maildir,则每个文件夹都是服务器上的一个目录,并且每封电子邮件消息都是该目录中的一个文件。 基本上,一个脚本可以遍历您的每个文件夹并 grep 您的关键词,然后创建一个新的 maildir,其中包含指向任何匹配文件的符号链接。 我将我的解决方案命名为 maildirsearch,它看起来像这样
#!/bin/sh MAILDIRS="$HOME/mail" VFOLDER="search" VFOLDERPATH="$MAILDIRS/$VFOLDER/cur/" FOLDERS=`ls $MAILDIRS | egrep -v "search|flagged"` rm -f $VFOLDERPATH/* for i in $FOLDERS do for j in `egrep -lR "$@" $MAILDIRS/$i` do ln -s $j $VFOLDERPATH/; done; done;
接下来,我创建了另一个名为 muttsearch 的脚本,它将执行我的 maildirsearch 脚本,然后打开一个新的 mutt 实例,该实例读取新的虚拟搜索文件夹。 使用这种方法的一个好处是,我可以在 mutt 窗口中看到搜索结果的增长,并立即开始查看结果
#!/bin/sh VFOLDER="search" $HOME/bin/maildirsearch "$@" & sleep 1; mutt -f "=$VFOLDER" && killall maildirsearch >/dev/null 2>&1
最后,我在 mutt 中设置了一个快捷键绑定,以便我可以按下 Esc-S,输入一个关键词(或正则表达式)并开始搜索
macro index \eS "<shell-escape>$HOME/bin/muttsearch \"" macro browser \eS "<shell-escape>$HOME/bin/muttsearch \""
现在,这个脚本有一个缺点——它被设计为在存储消息的服务器上运行。 在我的情况下,我使用一个名为 offlineimap 的工具将我的远程电子邮件服务器与我的笔记本电脑同步,所以我总是在本地拥有消息的副本。 如果您不想走这条路,但又想能够从本地计算机进行搜索,您可能会修改我的 muttsearch 脚本,使其 SSH 进入您的邮件服务器并执行该脚本。
该脚本实际上对我来说效果很好,但过了一段时间我意识到我一遍又一遍地进行了许多相同的搜索。 例如,我是 mutt 中“标记为待跟进”功能的重度用户。 如果您在消息索引中并按下 F 键,它会在消息上设置一个标志,并在其前面显示一个感叹号。 我使用这个来提醒自己需要回复消息。 这样做的一个缺点是,我必须定期转到特定文件夹才能看到该标志,有时我想一次查看所有已标记的消息。 事实证明,我用于搜索的相同虚拟文件夹概念也适用于此。
首先,我创建了一个名为 flag-folder 的脚本。 当您在 maildir 系统中标记电子邮件时,该电子邮件会在文件名中最后一个逗号后添加一个 F。 基本上,我的 flag-folder 脚本会搜索我所有的 maildir 中与该模式匹配的文件,然后将这些文件符号链接到一个名为 flagged 的新 maildir 中
#!/bin/sh # This script finds all the flagged e-mail in a # Maildir and symlinks them to a 'flagged' folder # in the Maildir. # To run it every 5 minutes, for instance, add the # following to the user's crontab: # # */5 * * * * /home/greenfly/bin/flag-folder MAILDIR="$HOME/mail/" # path to your maildir FLAGGED="${MAILDIR}/flagged/cur" # path to your # (precreated) flagged folder cd $FLAGGED rm ${FLAGGED}/* # find all the files in the maildir, then search for # flagged files (files with an F after the last comma # in the filename) and symlink them find ${MAILDIR} -type f | perl -ne '$foo = ""; $foo = ↪(split ",", $_)[-1] if(/,/); if($foo =~ /F/){chomp; ↪system "ln -s $_ .\n";}'
正如您在脚本注释中看到的那样,您也可以简单地将其设置为邮件服务器上的 cron 任务,以便您的 flagged 文件夹不断更新。 然后,我创建了一个类似于我的 muttsearch 脚本的脚本,名为 muttflag,它基本上执行相同的功能,除了 flag-folder 脚本
#!/bin/sh VFOLDER="flagged" $HOME/bin/flag-folder & sleep 1; mutt -f "=$VFOLDER";
最后,我创建了另一个快捷键绑定,以便按下 Esc-F 执行 muttflag 脚本
macro index \eF "<shell-escape>$HOME/bin/muttflag \n" macro browser \eF "<shell-escape>$HOME/bin/muttflag \n"
当您在 mutt 中使用虚拟文件夹时,还有很多其他的可能性。 到目前为止,我发现的唯一大的缺点是,由于该脚本使用符号链接,因此应用于虚拟文件夹中消息的任何标志都不会应用于真实消息。 例如,如果您在虚拟文件夹中回复消息,它会更新符号链接的文件名,但不会更新它链接到的文件。 从本质上讲,这意味着您会丢失该回复标志,除非您转到原始文件夹并回复。
尽管存在缺点,但我对 mutt 中的虚拟文件夹还是非常满意的。 再次强调,它比我在其他客户端中看到的搜索速度更快,而且我可以保留我的 vi 快捷键绑定,除非您从我冰冷的、死去的 IBM Model M 键盘上撬走它们,否则您无法拥有它们。
Kyle Rankin 是旧金山湾区的一名高级系统管理员,也是多本书籍的作者,包括 O'Reilly Media 出版的 Knoppix Hacks 和 Ubuntu Hacks。 他目前是北湾 Linux 用户组的主席。