diff options
Diffstat (limited to 'history-search/history_search.pl')
-rw-r--r-- | history-search/history_search.pl | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/history-search/history_search.pl b/history-search/history_search.pl new file mode 100644 index 0000000..d54e264 --- /dev/null +++ b/history-search/history_search.pl @@ -0,0 +1,194 @@ +# Search within your typed history as you type (like ctrl-R in bash) +# Usage: +# * First do: /bind ^R /history_search +# * Then type ctrl-R and type what you're searching for + +# Copyright 2007 Wouter Coekaerts <coekie@irssi.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +use strict; +use Irssi; +use Irssi::TextUI; +use Data::Dumper; + +use vars qw($VERSION %IRSSI); +$VERSION = '1.0'; +%IRSSI = ( + authors => 'Wouter Coekaerts', + contact => 'coekie@irssi.org', + name => 'history_search', + description => 'Search within your typed history as you type (like ctrl-R in bash)', + license => 'GPLv2 or later', + url => 'http://wouter.coekaerts.be/irssi/', + changed => '04/08/07' +); + +my $prompt_append = 1; +my $prompt_content = ''; + +# create a new statusbar item + +Irssi::statusbar_item_register ( 'custom_prompt', 0, 'custom_prompt' ); + +Irssi::signal_add_last 'gui print text finished' => sub { + Irssi::statusbar_items_redraw ( 'custom_prompt' ); +}; + +Irssi::signal_register({'change prompt' => [qw/string int/]}); +Irssi::signal_add('change prompt' => \&handle_change_prompt_sig); + +sub handle_change_prompt_sig { + my ($text, $append) = @_; + print "sig args: ", Dumper(\@_); + $prompt_content = $text; + $prompt_append = $append; + print "text: $prompt_content, append: $prompt_append"; + + Irssi::statusbar_items_redraw('custom_prompt'); +} + +# TODO: make these work wiht subcommand (runsub) + +Irssi::command_bind('set_prompt' => \&dothing ); +Irssi::command_set_options('set_prompt', '+string @append'); + +Irssi::command_bind('install_prompt' => \&install_prompt); +Irssi::command_bind('uninstall_prompt' => \&uninstall_prompt); + +Irssi::settings_add_bool('custom_prompt', 'autoinstall_custom_prompt', 0); + +if (Irssi::settings_get_bool('autoinstall_custom_prompt')) { + install_prompt(); +} + +sub install_prompt { + Irssi::command("/statusbar prompt add -priority '-5' -alignment left" + . " -before prompt custom_prompt"); + Irssi::command("/statusbar prompt remove prompt"); + Irssi::command("/statusbar prompt remove prompt_empty"); +} + +sub uninstall_prompt { + Irssi::command("/statusbar prompt remove custom_prompt"); + Irssi::command("/statusbar prompt add -priority '-1' " + . "-before input -alignment left prompt"); + Irssi::command("/statusbar prompt add -priority '-2' " + . "-before input -alignment left prompt_empty"); +} + +sub dothing { + #my ($str, $append) = @_; + #Irssi::print("str is $str, append=$append"); + my $parsed = [Irssi::command_parse_options('set_prompt', $_[0])]; + my $args = $parsed->[0] // {}; + my $remainder = $parsed->[1] // ''; + + my ($str, $append) = ('', 1); + print Dumper $args; + if (exists ($args->{string})) { + $str = $args->{string}; + } + + if (exists($args->{append})) { + $append = $args->{append}; + } + print "append in dothing: $append"; + Irssi::signal_emit('change prompt', $str, $append); +} + +sub custom_prompt { + my ($sb_item, $get_size_only) = @_; + + my ($width, $padChar, $padNum, $length); + + #my $prompt_str = '%K[%W$tag%c/%K$cumode%n$*%K]%n '; + + my $theme = Irssi::current_theme; + my $prompt = ''; + + my $var = ''; + if (window_is_empty(Irssi::active_win)) { + $var = 'winname'; + } else { + $var = '[.15]itemname'; + } + + if ($prompt_append) { + $prompt = $theme->format_expand("{prompt \$$var}"); + } + + my $trailing_space = ''; + if ($prompt =~ /(\s*)$/ && length $prompt_content) { + $trailing_space = $1; + } + + $prompt .= $prompt_content . $trailing_space; + $sb_item->default_handler($get_size_only, $prompt, undef, 1); +} + +sub window_is_empty { + my $window = shift; + return $window->{name} eq $window->get_active_name; +} + +sub UNLOAD { + print Dumper(\@_); + uninstall_prompt(); +} +# my $prev_typed; +# my $prev_startpos; +# my $enabled = 0; + +# Irssi::command_bind('history_search', sub { +# $enabled = ! $enabled; +# if ($enabled) { +# $prev_typed = ''; +# $prev_startpos = 0; +# } +# }); + +# Irssi::signal_add_last 'gui key pressed' => sub { +# my ($key) = @_; + +# if ($key == 10) { # enter +# $enabled = 0; +# } + +# return unless $enabled; + +# my $prompt = Irssi::parse_special('$L'); +# my $pos = Irssi::gui_input_get_pos(); + +# if ($pos < $prev_startpos) { +# $enabled = 0; +# return; +# } + +# my $typed = substr($prompt, $prev_startpos, ($pos-$prev_startpos)); + +# my $history = ($typed eq '') ? '' : Irssi::parse_special('$!' . $typed . '!'); +# if ($history eq '') { +# $history = $typed; +# } + +# my $startpos = index(lc($history), lc($typed)); + +# Irssi::gui_input_set($history); +# Irssi::gui_input_set_pos($startpos + length($typed)); + +# $prev_typed = $typed; +# $prev_startpos = $startpos; +# }; |