From 9e36a6abb0bea4f766b72fd41514d766c8cdc141 Mon Sep 17 00:00:00 2001 From: Isaac Good Date: Tue, 6 Dec 2016 17:53:07 -0800 Subject: Clean up my reorder script --- scripts/reorder.pl | 311 +++++++++++++++++++++++++++-------------------------- 1 file changed, 161 insertions(+), 150 deletions(-) (limited to 'scripts') 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' ); -- cgit v1.2.3