1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#!/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;
my $PANE_MAXLEN = 30;
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'};
}
}
$tmux =~ s/[^.,#0-9A-Za-z-]+//rg;
set_pane_name( $tmux ? "[" . $tmux =~ s/.{$PANE_MAXLEN}\K.*//s . "]" :
$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;
|