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..e97f0a9 --- /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, $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; | 
