在ThunderBird中使用Vim编辑邮件/调用LDAP
http://tech.idv2.com/2006/06/23/use-vim-ldap-in-thunderbird/
版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2006/06/23/use-vim-ldap-in-thunderbird/以及本声明。
平常使用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 命令行修改为 "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,片刻之后画面下方就会出现符合条件的邮件地址列表,输入你想要输入的那个邮件地址的编号,邮件地址就会被自动输入了。