use strict;
use vars qw($VERSION %IRSSI);
use Irssi qw(signal_add_last settings_add_bool settings_add_str
settings_get_bool settings_get_str);
$VERSION = '1.31';
%IRSSI = (
authors => 'Juerd (first version: Timo Sirainen)',
contact => '[email protected]',
name => 'Dictionary complete',
description => 'Caching dictionary based tab completion',
license => 'Public Domain',
url => 'http://juerd.nl/irssi/',
changed => 'Fri Dec 6 11:12 CET 2002',
changes => 'Removed a silly mistake'
);
my $file = '/usr/share/dict/words'; # file must be sorted!
my @array;
my %index;
{
my $old = '';
my $start = 0;
my $pointer = 0;
open(DICT, q{<}, $file) or die $!;
while () {
chomp;
push @array, $_;
my $letter = lc substr $_, 0, 1;
if ($letter ne $old) {
$index{$old} = [ $start, $pointer - 1 ];
$start = $pointer;
}
$old = $letter;
$pointer++;
}
close DICT;
$index{$old} = [ $start, $pointer ];
}
my %cache;
sub sig_complete {
my ($complist, $window, $word, $linestart, $want_space) = @_;
if (defined($cache{$word})){
push @$complist, @{$cache{$word}};
return;
}
my $found;
my $mylist = [];
my $regex = $word =~ /[^\w-\']/;
return unless my $index = (($word =~ /^[^\w-\']/)
? [0, $#array]
: $index{lc substr $word, 0, 1});
eval {
for ($index->[0] .. $index->[1]) {
if ($array[$_] =~ /^$word/i) {
$found = 1;
push @$complist, $array[$_];
push @$mylist, $array[$_];
} else {
last if $found && not $regex;
}
}
}; return if $@;
$cache{$word} = $mylist;
my $max = settings_get_str 'dictcomplete_display' or 20;
$window->print(@$complist > $max ? "@$complist[0..($max-1)] ..." : "@$complist")
unless @$complist < 2 or settings_get_bool 'dictcomplete_quiet';
}
signal_add_last 'complete word' => \&sig_complete;
settings_add_bool 'dictcomplete', 'dictcomplete_quiet' => 0;
settings_add_str 'dictcomplete', 'dictcomplete_display' => 20;