#!/usr/bin/perl # # Irssi script to display buffer activity in tmux pane name. # # Ideally one single feature complete chat client should be used, but this # workaround makes life a bit more bearably in our contemporary world requiring # multiple chat clients. # # Requires something like: `F=~/.irssi/micmot-fifo; mkfifo $F; tail -f $F &` # # Also requires ":set-option allow-rename on" in the tmux buffer. use strict; use vars qw ($VERSION %IRSSI); use 5.32.0; use Irssi; $VERSION = '0.1.0'; %IRSSI = ( authors => 'cos', contact => '|cos|', description => 'Abusing tmux pane names for displaying channel activity.', license => 'MIT', name => 'micmot', ); my $TMUX_FIFO = $ENV{'IRSSI_TMUX_FIFO'}; $TMUX_FIFO = $ENV{'HOME'}.'/.irssi/micmot-fifo' unless $TMUX_FIFO; my $PANE_NAME = $ENV{'IRSSI_TMUX_PANE'}; $PANE_NAME = 'irssi' unless $PANE_NAME; sub set_pane_title { my ( $title ) = @_; my $FILE_HANDLE; open $FILE_HANDLE, '>>', $TMUX_FIFO or return; printf($FILE_HANDLE "%c]2;%s%c\\", 0x1b, $title, 0x1b); close $FILE_HANDLE; } sub set_pane_name { my ( $name ) = @_; my $FILE_HANDLE; open $FILE_HANDLE, '>>', $TMUX_FIFO or return; printf($FILE_HANDLE "%ck%s%c\\", 0x1b, $name, 0x1b); close $FILE_HANDLE; } sub highlight_pane { my $FILE_HANDLE; open $FILE_HANDLE, '>>', $TMUX_FIFO or return; printf($FILE_HANDLE "\x07"); close $FILE_HANDLE; } sub activity_to_tmux { my $active_win = Irssi::active_win() or return; my $active_win_refnum = $active_win->{'refnum'} or return; my @windows = Irssi::windows() or return; my $tmux = ""; for ( @windows ) { # Skip the currently active window. next if $_->{'refnum'} eq $active_win_refnum; # Include any windows with data_level 'msg' or 'highlight'. if ($_->{'active'}->{'data_level'} ge 2) { if (length($tmux) > 0) { $tmux .= ","; } $tmux .= $_->{'active'}->{'visible_name'}; } } set_pane_name( $tmux ? "[" . $tmux =~ s/[^.,#0-9A-Za-z-]+//rg . "]" : $PANE_NAME ); if ( $tmux ) { highlight_pane(); } } say qq($IRSSI{name} $VERSION using "$TMUX_FIFO"); set_pane_name( $PANE_NAME ); set_pane_title( $PANE_NAME ); Irssi::signal_add 'window activity' => \&activity_to_tmux; Irssi::signal_add 'window changed' => \&activity_to_tmux;