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,<$file or die Can’t open file for read : $!\n;
while($line = <FILE>)
{
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;