use strict; use warnings; our $VERSION = '0.1'; # 5ef9502616f1301 our %IRSSI = ( contact => 'Nei @ [email protected]', url => "http://anti.teamidiot.de/", name => 'clearable', description => 'make some command output clearable', license => 'ISC', ); use Irssi 20140701; sub cmd_help { return unless $_[0] =~ /^clearable\s*$/i; print CLIENTCRAP < %9Description:%9 Runs command and tags each line of immediate output with the lastlog-flag so it can be cleared with /LASTLOG -clear %9Example:%9 /CLEARABLE NAMES /LASTLOG -clear %9See also:%9 LASTLOG, SCROLLBACK CLEAR HELP } my %refreshers; sub sig_prt { my $win = $_[0]{window}; my $view = $win && $win->view; return unless $view; my $llp = $view->{buffer}{cur_line}{_irssi}//0; &Irssi::signal_continue; $view = $win->view; my $l2 = $view->{buffer}{cur_line}; return unless ($l2 && $l2->{_irssi} != $llp); for (my $line = $l2; $line && $line->{_irssi} != $llp; ) { $win->gui_printtext_after($line->prev, $line->{info}{level} | MSGLEVEL_NEVER | MSGLEVEL_LASTLOG, $line->get_text(1)."\n", $line->{info}{time}); my $ll = $win->last_line_insert; $view->remove_line($line); $line = $ll && $ll->prev; $refreshers{ $win->{refnum} } //= $view->{bottom}; } } sub cmd_clearable { my ($data, $server, $item) = @_; Irssi::signal_add_first('print text' => 'sig_prt'); Irssi::signal_emit('send command' => Irssi::parse_special('$k').$data, $server, $item); Irssi::signal_remove('print text' => 'sig_prt'); for my $refnum (keys %refreshers) { my $bottom = delete $refreshers{$refnum}; my $win = Irssi::window_find_refnum($refnum) // next; my $view = $win->view; $win->command('^scrollback end') if $bottom && !$view->{bottom}; $view->redraw; } } Irssi::command_bind('clearable' => 'cmd_clearable'); Irssi::command_bind_last('help' => 'cmd_help');