vim有一个非常好的特性——关键字自动完成功能,这个功能对于coder来说是非常贴心的。因为我们经常会因为一个笔误,敲错了一个字母或者漏打了一个 字母而导致程序出错。对于C语言这样的编译型语言来说,一般只能等到代码编译时才能发现错误。还好,有了vim,生活原来可以如此的美好。哈!
用Perl写了这样的一个脚本,用来遍历代码目录下的所有文本文件,找出其中所有的关键词,剔除掉其中重复的关键词,写入字典文件,OK!
其实这个脚本只需要简单修改一下代码,增加自定义的过滤器,就可以只对指定的代码类型文件进行关键词的提取。更高级的一点的应该是对提取关键词的正则表达式下一番功夫,比如只提取函数名(这个最好结合不同的语言单独来写)。感兴趣的朋友们可以自己动手:)
vim的配置就更简单了,只需要一步,在~vimrc文件中增加set dictionary=key.dict就可以了。当然也可以临时性的指定字典文件。在需要的时候C-X,C-K就可以出现候选字列表了,简单吧!我个人更喜欢用C-P这个快捷键,按一次就可以了。
附源代码:
#!/bin/perl -w
# [File Name] build_dict.pl
# [Author] huangwei1983 at gmail.com
# [Version] 0.1
my @files = <*>;
my @keywords = ();
my @uniq_keywords = ();
my $output = “key.dict“;
#delete previously created dict file before a new start
if(-e $output)
{
unlink($output) or die “Can’t delete file $output : $!\n“;
}
#iterate over files in current direcotry except for this script file
foreach $file (@files)
{
if($file ne $0) #dont’t extract keywords from myself!
{
if(-s $file && -f $file) #test if it is a non-null file
{
if(-T $file) #test if it is a text file
{
open FILE,“«/span>$file“ or die “Can’t open file for read : $!\n“;
while($line =
</span>)
{
while($line =~ m/([a-zA-Z]\w*)/g)
{
push(@keywords,$1);
}
}
close FILE;
}
}
elsif(-d $file) #test if it is a directory
{
@subdirectory = glob $file.“/*“;
push(@files,@subdirectory);
}
}
}
#get distinct keywords
my %seen;
@seen{@keywords} = ();
@uniq_keywords = keys %seen;
#write keywords to file
open FILE,“>$output“ or die “Can’t open file for write : $!\n“;
foreach my $keyword (@uniq_keywords)
{
print FILE ($keyword.“\n“);
}
close FILE;