|
#!/usr/bin/perl |
|
use strict; |
|
BEGIN { |
|
my $file_name = __FILE__; |
|
$file_name =~ s{[^/]+$}{}; |
|
$file_name ||= '.'; |
|
$file_name .= '/../config/perl/libs.txt'; |
|
open my $file, '<', $file_name or die "$0: $file_name: $!"; |
|
unshift @INC, split /:/, scalar <$file>; |
|
} |
|
use warnings; |
|
use Path::Class; |
|
|
|
if ($ENV{STY}) { |
|
warn "Current screen: $ENV{STY}\n"; |
|
exit; |
|
} |
|
|
|
require(file(__FILE__)->dir->file('common.pl')->stringify); |
|
our $SCREENS; |
|
|
|
sub convert_path ($) { |
|
my $p = shift; |
|
return '?' unless defined $p; |
|
|
|
$p = file($p)->relative($ENV{HOME}); |
|
if ($p =~ m[^(?:/|\.\.?/)]) { |
|
return $p; |
|
} else { |
|
return '~/' . $p; |
|
} |
|
} |
|
|
|
|
|
sub convert_time ($) { |
|
my $time = shift || 0; |
|
my @lt = localtime $time; |
|
return sprintf '%04d/%02d/%02d %02d:%02d', $lt[5] + 1900, $lt[4] + 1, $lt[3], $lt[2], $lt[1]; |
|
} |
|
|
|
sub convert_status ($) { |
|
my $status = shift || ''; |
|
return { |
|
Attached => 'A', |
|
Detached => 'D', |
|
}->{$status} || $status; |
|
} |
|
|
|
sub print_s ($$) { |
|
my ($n, $s) = @_; |
|
my $n_sp = $n - length $s; |
|
print $s; |
|
print ' ' x $n_sp if $n_sp > 0; |
|
} |
|
|
|
my $avail_screens = []; |
|
for (split /\n/, `screen -list`) { |
|
if (/^\s+(\S+)\s+(?:\(([^()]+)\)\s+)?\((Attached|Detached)\)/) { |
|
my $sty = $1; |
|
my $status = $3; |
|
push @$avail_screens, {sty => $sty, status => $status, cwd => $SCREENS->{$sty}->{cwd}, time => $SCREENS->{$sty}->{time}}; |
|
} |
|
} |
|
|
|
{ |
|
no warnings 'uninitialized'; |
|
$avail_screens = [sort { $a->{time} cmp $b->{time} } @$avail_screens]; |
|
} |
|
|
|
my $id = $#$avail_screens; |
|
for my $screen (@$avail_screens) { |
|
print_s 17 + 2, convert_time($screen->{time}); |
|
print_s 2 + 2, convert_status($screen->{status}); |
|
print_s 25 + 2, $screen->{sty}; |
|
print_s 3 + 2, '#' . $id; |
|
print convert_path($screen->{cwd}); |
|
print "\n"; |
|
$id--; |
|
} |
|
|
|
{ |
|
print 'Number: '; |
|
my $num = <STDIN>; |
|
chomp $num; |
|
|
|
if ($num =~ /^\d+$/ and $num < @$avail_screens) { |
|
my @cmd = ('screen', '-d', '-r', $avail_screens->[$#$avail_screens - $num]->{sty}); |
|
warn join ' ', @cmd, "\n"; |
|
exec @cmd; |
|
} elsif ($num =~ /^\s*(?:q|quit|exit)\s*$/i) { |
|
exit; |
|
} else { |
|
redo; |
|
} |
|
} |