diff options
| author | Isaac Good | 2016-12-06 17:53:07 -0800 | 
|---|---|---|
| committer | Isaac Good | 2016-12-06 17:53:07 -0800 | 
| commit | 9e36a6abb0bea4f766b72fd41514d766c8cdc141 (patch) | |
| tree | b5f197ce209f88c9fb9020158c64fe7d91151a1a | |
| parent | 16b674d157bd5448c48e70e34356cfcae115b2e8 (diff) | |
| download | scripts.irssi.org-9e36a6abb0bea4f766b72fd41514d766c8cdc141.tar.bz2 | |
Clean up my reorder script
| -rw-r--r-- | scripts/reorder.pl | 311 | 
1 files changed, 161 insertions, 150 deletions
| diff --git a/scripts/reorder.pl b/scripts/reorder.pl index 7bec6b8..475db41 100644 --- a/scripts/reorder.pl +++ b/scripts/reorder.pl @@ -1,150 +1,161 @@ -# Save window layout to an arbitrary file and load layouts upon demand
 -# Useful for being able to temporarily reorder your windows and then reverting to your "normal" layout
 -# Also useful as an easy way to reorder your windows
 -#
 -# A special thanks to billnye, Zed` and Bazerka for their help
 -#
 -# Usage:
 -#  /layout_save filename
 -#    Saves the layout to the textfile "filename.layout"
 -#  /layout_load filename
 -#    Loads the layout from the textfile "filename.layout"
 -#  /set layout_savepath path
 -#    Use to set a default path for layouts
 -#
 -# TODO:
 -#   Check the layout file for a number used twice
 -#
 -
 -use strict;
 -use Irssi;
 -use Data::Dumper;
 -use vars qw($VERSION %IRSSI);
 -
 -%IRSSI = (
 -	authors     => "Isaac G",
 -	contact     => "irssi\@isaac.otherinbox.com",
 -	name        => "reorder",
 -	description => "Reordering windows based on a textfile.",
 -	license     => "GPL",
 -);
 -
 -sub doFilenameFixing
 -{
 -	my ($filename) = @_;
 -	unless ($filename)
 -	{
 -		print "No filename specified!";
 -		return;
 -	}
 -
 -	$filename = glob($filename);
 -
 -	if ($filename =~ /\//)
 -	{
 -		unless ($filename =~ /^\//)
 -		{
 -			print "I don't like /'s in filenames. Unless you want to specify an absolute path.";
 -			return;
 -		}
 -		# Let it go?
 -	}
 -
 -	$filename .= '.layout' unless ($filename =~ /.layout$/);
 -
 -	my $path = Irssi::settings_get_str('layout_savepath');
 -	$path .= '/' unless ($path =~ /\/$/);
 -	$filename = $path . $filename unless ($filename =~ /\//);
 -
 -	return $filename;
 -}
 -
 -sub canReadFile
 -{
 -	my ($filename) = @_;
 -	unless (-f $filename)
 -	{
 -		print "No such file $filename";
 -		return;
 -	}
 -	unless (-r $filename)
 -	{
 -		print "Can not read file $filename";
 -		return;
 -	}
 -	return 1;
 -}
 -
 -# Save a list of refnum and window info to file
 -sub cmd_layout_save
 -{
 -	my ($filename, $data, $more) = @_;
 -	my $FH;
 -
 -	$filename = doFilenameFixing($filename);
 -	return unless ($filename);
 -
 -	unless(open $FH, ">", $filename)
 -	{
 -		print "Can not open $filename";
 -		return;
 -	}
 -
 -	# Order by ref. Print ref and an id tag
 -	for my $win (sort {$a->{'refnum'} <=> $b->{'refnum'}} Irssi::windows())
 -	{
 -		my $id = $win->{'name'} ? $win->{'name'} : $win->{'active'}->{'name'} . ":" . $win->{'active'}->{'server'}->{'tag'};
 -		printf $FH "%d\t%s\n", $win->{'refnum'}, $id;
 -	}
 -	close $FH;
 -	print "Layout saved to $filename";
 -}
 -
 -# Load a list and use it to reorder
 -sub cmd_layout_load
 -{
 -	# Check filename supplied, exists and readable
 -	my ($filename, $data, $more) = @_;
 -	$filename = doFilenameFixing($filename);
 -	return unless ($filename);
 -
 -	return unless canReadFile($filename);
 -
 -	my @layout;
 -	my ($ref, $id, $FH);
 -
 -	# Pull the refnum and id
 -	unless(open $FH, "<", $filename)
 -	{
 -		print "Can not open file $filename.";
 -		return;
 -	}
 -	while (my $line = <$FH>)
 -	{
 -		chomp $line;
 -		my ($ref, $id) = split(/\t/, $line, 2);
 -		next unless ($ref and $id);
 -
 -		push @layout, {refnum => $ref, id => $id};
 -	}
 -	close $FH;
 -
 -	# For each layout item from the file, find the window and set it's ref to that number
 -	for my $position (sort {$a->{'refnum'} <=> $b->{'refnum'}} @layout)
 -	{
 -		for my $win (Irssi::windows())
 -		{
 -			$id = $win->{'name'} ? $win->{'name'} : $win->{'active'}->{'name'} . ":" . $win->{'active'}->{'server'}->{'tag'};
 -			if ($id eq $position->{'id'})
 -			{
 -				$win->set_refnum($position->{'refnum'});
 -				last;
 -			}
 -		}
 -	}
 -}
 -
 -Irssi::settings_add_str('misc', 'layout_savepath', Irssi::get_irssi_dir());
 -
 -Irssi::command_bind( 'layout_save', 'cmd_layout_save' );
 -Irssi::command_bind( 'layout_load', 'cmd_layout_load' );
\ No newline at end of file +# Save window layout to an arbitrary file and load layouts upon demand +# Useful for being able to temporarily reorder your windows and then reverting to your "normal" layout +# Also useful as an easy way to reorder your windows +# +# A special thanks to billnye, Zed` and Bazerka for their help +# +# Usage: +#  /layout_save filename +#    Saves the layout to the textfile "filename.layout" +#  /layout_load filename +#    Loads the layout from the textfile "filename.layout" +# +# TODO: +#   Check the layout file for a number used twice +#   On script load, run a layout_load +#   On channel join, run load: channel joined +# + +use strict; +use Irssi; +use Data::Dumper; +use vars qw($VERSION %IRSSI); +use POSIX 'strftime'; + +%IRSSI = ( +    authors     => "Isaac Good", +    contact     => "irssi\@isaacgood.com", +    name        => "reorder", +    description => "Reordering windows based on a textfile.", +    license     => "GPL", +); +$VERSION = '1.0'; + +# Map user input to a valid filename +sub GetFilename +{ +    my ($filename) = @_; + +    # On no input, use a default filename. +    unless (length($filename)) +    { +        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); +        $filename = POSIX::strftime("%y%m%d", $sec, $min, $hour, $mday, $mon, $year); +        # If you prefer not having datestamped filenames, uncomment: +        # $filename = "default"; +    } + +    # Use glob expansion to match things like ~/ +    my $glob = glob($filename); +    $filename = $glob if $glob; + +    # Only handle directories when using an absolute path. +    if ($filename =~ /\// and $filename !~ /^\//) +    { +        print "I don't like /'s in filenames. Unless you want to specify an absolute path."; +        return; +    } + +    # Add a file extension +    $filename .= '.layout' unless ($filename =~ /.layout$/); + +    # Use get_irssi_dir() unless using an absolute path +    if ($filename !~ /\//) { +        my $path = Irssi::get_irssi_dir(); +        $path .= '/' unless ($path =~ /\/$/); +        $filename = $path . $filename; +    } + +    return $filename; +} + +# Check a filename exists and can be read. +sub CanReadFile +{ +    my ($filename) = @_; +    unless (-f $filename) +    { +        print "No such file $filename"; +        return 0; +    } +    unless (-r $filename) +    { +        print "Can not read file $filename"; +        return 0; +    } +    return 1; +} + +# Save the current layout to file +sub CmdLayoutSave +{ +    my ($filename, $data, $more) = @_; +    my $FH; + +    $filename = GetFilename($filename); +    return unless ($filename); + +    unless(open $FH, ">", $filename) +    { +        print "Can not open $filename"; +        return; +    } + +    # Order by ref. Print ref and an id tag +    for my $win (sort {$a->{'refnum'} <=> $b->{'refnum'}} Irssi::windows()) +    { +        my $id = $win->{'name'} ? $win->{'name'} : $win->{'active'}->{'name'}; +        my $tag = $win->{'active'}->{'server'}->{'tag'}; +        printf $FH "%d\t%s:%s\n", $win->{'refnum'}, $id, $tag; +    } +    close $FH; +    print "Layout saved to $filename"; +} + +# Load a list and use it to reorder +sub CmdLayoutLoad +{ +    my ($filename, $data, $more) = @_; +    $filename = GetFilename($filename); + +    return unless ($filename); +    return unless CanReadFile($filename); + +    my @layout; +    my ($ref, $id, $tag, $FH); + +    # Pull the refnum and id +    unless(open $FH, "<", $filename) +    { +        print "Can not open file $filename."; +        return; +    } +    while (my $line = <$FH>) +    { +        chomp $line; +        my ($ref, $id) = split(/\t/, $line, 2); +        next unless ($ref and $id); + +        push @layout, {refnum => $ref, id => $id}; +    } +    close $FH; + +    # For each layout item from the file, find the window and set it's ref to that number +    for my $position (sort {$a->{'refnum'} <=> $b->{'refnum'}} @layout) +    { +        for my $win (Irssi::windows()) +        { +            $id = $win->{'name'} ? $win->{'name'} : $win->{'active'}->{'name'}; +            $tag = $win->{'active'}->{'server'}->{'tag'}; +            $id .= ":" . $tag; +            if ($id eq $position->{'id'}) +            { +                $win->set_refnum($position->{'refnum'}); +                last; +            } +        } +    } +} + +Irssi::command_bind( 'layout_save', 'CmdLayoutSave' ); +Irssi::command_bind( 'layout_load', 'CmdLayoutLoad' ); | 
