平常使用Vim作为编辑器的人都会有一种特殊的习惯,使得他们使用其他编辑器时觉得很不顺手。ThunderBird是很好用的邮件程序,不过它的编辑器的功能比较弱。这里的方法可以让你使用Vim作为ThunderBird的编辑器。

首先要为ThunderBird安装External Edit插件,通过它可以使用其他程序编辑邮件。重新启动ThunderBird之后,打开“工具→扩展”菜单,选中刚刚安装好的External Edit插件,单击“选项”按钮打开设置界面。

在Text Editor栏里面输入 gvim 所在的位置,例如“”C:\Program Files\Vim\vim70\gvim.exe” -f -c “set encoding=utf-8””。-f 参数使得 Vim 在编辑结束之前不返回ThunderBird,这样ThunderBird才能正常接收到Vim编辑的内容。注意要选中下面的“This editor handles Unicode”选项。然后关闭该对话框,回到Thunderbird中,新建邮件,然后在编辑邮件的界面的工具栏中单击右键选择“自定义”,将External Edit按钮拖到工具栏上。

这样我们就做好了设置。以后新建邮件或者回复邮件时,单击工具栏上的External Edit按钮即可打开Vim进行编辑,编辑结束之后退出Vim,编辑内容就会反映到ThunderBird中。

在Vim中调用LDAP输入邮件地址

如果你在ThunderBird中通过LDAP来输入邮件地址,那么换成Vim编辑器之后就无法享受这种好处了。下面的脚本可以让你在Vim中调用LDAP输入地址。

(LDAP即轻量级目录服务,用于提供有关人的信息,例如姓名、组织、邮件地址等。ThunderBird可以利用LDAP作为邮件地址数据库,这样只需要输入邮件地址的前几个字母,ThunderBird会自动到LDAP服务器上查找类似的邮件地址,避免了手动输入的麻烦。)

我们的脚本使用Perl写成,所以需要首先安装Perl。到ActiveState的网站上下载ActivePerl并安装。下文假设Perl安装到默认的 C:\Perl 下。然后启动命令提示符 cmd,输入 ppm 启动Perl包管理器,输入以下命令:

ppm> search ldap
Searching in Active Repositories
   1. Apache-AuthLDAP                  [0.21] Apache-AuthLDAP
   2. Apache-AuthPerLDAP                [0.5] Apache-AuthPerLDAP
   3. Apache-AuthzLDAP                 [0.61] Apache-AuthzLDAP
   4. Apache-TransLDAP                 [0.20] Apache-TransLDAP
   5. Authen-Simple-LDAP                [0.2] Authen-Simple-LDAP
   6. DBD-LDAP                         [0.07] DBD-LDAP
   7. Lemonldap-Cluster-Status         [0.02] Lemonldap-Cluster-Status
   8. Lemonldap-Crypto                 [0.01] Lemonldap-Crypto
   9. Lemonldap-Portal-Cda             [0.02] Lemonldap-Portal-Cda
  10. Lemonldap-Portal-Session         [0.01] Lemonldap-Portal-Session
  11. Lemonldap-Portal-Sslsso          [0.03] Lemonldap-Portal-Sslsso
  12. Lemonldap-Portal-Standard        [0.04] Lemonldap-Portal-Standard
  13. Net-LDAP-Express                 [0.11] Net-LDAP-Express
  14. Net-LDAP-Server                   [0.3] Net-LDAP-Server
  15. perl-ldap                        [0.33] perl-ldap
  16. ResourcePool-Resource-Net-LDAP [1.0002] ResourcePool-Resource-Net-LDAP
ppm> install 15             ......输入 perl-ldap 对应的序号
Package 15:
====================
Install 'Convert-ASN1' version 0.20 in ActivePerl 5.8.8.817.
====================
Downloaded 26361 bytes.
......
====================
Install 'perl-ldap' version 0.33 in ActivePerl 5.8.8.817.
====================
Downloaded 190771 bytes.
.....

全部安装完毕之后,复制下面的Perl代码,将第10行的 $server 变量修改为你的 LDAP 服务器的地址,保存。假设将其保存为 D:\Tools\ldapquery.pl。

#!C:/Perl/bin/perl -w

use Net::LDAP;
use Net::LDAP::Util qw(ldap_error_text);

&query(shift);

sub query {
    my $arg = shift;
    my $server = 'your-ldap-server.com';     # 修改为你的LDAP服务器的地址

    $ldap = Net::LDAP->new($server) or die "$@";
    $mesg = $ldap->search( base => '',
                   filter=>$arg,
                   timelimit=>10,
                   attrs=>['mail','cn']
            );
    die ldap_error_text($mesg->code) if $mesg->code;

    my $count = $mesg->count;
    my $num = 1;
    for (my $index = 0; $index < $count; $index++) {
        my $entry = $mesg->entry($index);
        my $dn = $entry->dn; # Obtain DN of this entry
        my $out_mail = **, $out_cn = **, $temp_value = '';

        @attrs = $entry->attributes; # Obtain attributes for this entry.
        $out_mail = $out_cn = '';            # clear value
        foreach my $var (@attrs)
        {
            next if ($var ne 'mail') and ($var ne 'cn');
            #get a list of values for a given attribute
            $attr = $entry->get_value( $var, asref => 1 );
            if ( defined($attr) )
            {
                $temp_value = '';
                foreach my $value ( @$attr )
                {
                    $temp_value .= '/' if $temp_value ne '';
                    $temp_value .= $value;  # Print each value for the attribute.
                }

                if ($var eq 'mail') {
                    $out_mail = $temp_value;
                } else {
                    $out_cn = $temp_value;
                }
            }

        }
        print "\t$num\t$out_cn <$out_mail>\n";
        $num++;
        last if ($num > 30);
    }

    $mesg = $ldap->unbind;

}

之后你可以在命令行中输入 perl D:\Tools\ldapquery.pl mailaddress@* 来测试 LDAP 查询是否能够正常工作。确认正常工作之后,再将下面的脚本复制并保存,假设保存为 D:\Tools\ldapquery.vim。

function! LDAPQuery()
    " save current cursor pos
    let saveCursor = getpos('.')            

    " get current line
    let line = getline('.')                    
    let tmpLine = tr(line, ',', ' ')

    " get last mail address
    let startPos = strridx(tmpLine, ' ')
    let currentMail = strpart(line, startPos+1)
    let otherStr = strpart(line, 0, startPos+1)

    " run ldapquery.pl
    let ldapresult = system('perl D:\Tools\ldapquery.pl mail=' . currentMail . '*')

    " split result into list
    let results = split(ldapresult, '\n')

    " get user input
    let num = inputlist(results)

    if num > 0
        let addrList = split(results[num-1], '[\t:]')
        call setline('.', otherStr . addrList[1] . ', ')
    endif

    normal $
endfunction

inoremap  :call LDAPQuery()

最后打开 ThunderBird 的“工具→扩展”菜单,然后打开 External Edit 插件的选项,将其中的 Text Editor 命令行修改为 &color(blue){“C:\Program Files\Vim\vim70\gvim.exe” -f -c “set encoding=utf-8” -c “source D:\Tools\ldapquery.vim”};。然后在 ThunderBird 中打开邮件编辑界面,单击 External Edit按钮启动Vim,然后输入邮件的前几个字符,在插入状态下按 Ctrl-K,片刻之后画面下方就会出现符合条件的邮件地址列表,输入你想要输入的那个邮件地址的编号,邮件地址就会被自动输入了。