diff options
Diffstat (limited to 'scripts/dictcomplete.pl')
-rw-r--r-- | scripts/dictcomplete.pl | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/scripts/dictcomplete.pl b/scripts/dictcomplete.pl new file mode 100644 index 0000000..1f64e1b --- /dev/null +++ b/scripts/dictcomplete.pl @@ -0,0 +1,78 @@ +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 => 'juerd@juerd.nl', + 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 (<DICT>) { + 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; |