diff options
-rw-r--r-- | undo/kill-ring.pl | 87 |
1 files changed, 85 insertions, 2 deletions
diff --git a/undo/kill-ring.pl b/undo/kill-ring.pl index 3cb7b61..c3600a6 100644 --- a/undo/kill-ring.pl +++ b/undo/kill-ring.pl @@ -39,8 +39,91 @@ our $VERSION = '0.1'; our %IRSSI = ( authors => 'shabble', contact => 'shabble+irssi@metavore.org', - name => '', - description => '', + name => 'kill-ring', + description => 'keeps track of changes to the cutbuffer' + . ' and allows you to cycle through them', license => 'MIT', updated => '$DATE' ); + +my @cut_buf_history; + +sub cut_buffer_init { + Irssi::signal_add_first('gui key pressed' => \&sig_cmd_undo); + Irssi::command_bind('cut_buf_cycle' => \&cmd_cut_buf_cycle); +} + +sub add_to_history { + my ($str) = @_; + + return unless defined $str; + + my $head = $cut_buf_history[-1]; + + if (defined $head and $str ne $head) { + push @cut_buf_history, $str; + } elsif (not defined $head) { + push @cut_buf_history, $str; + } + + # enforce maximum size + # TODO: make this a setting? + + if (@cut_buf_history > 100) { + shift @cut_buf_history; + } +} + +sub cmd_cut_buf_cycle { + print '%_Cut buffer contains:%_'; + foreach my $buf (@cut_buf_history) { + print "$buf" + } +} + +sub sig_cmd_undo { + my ($key) = @_; + add_to_history(_cut_buf()); +} + +sub _cut_buf { + return Irssi::parse_special('$U', 0, 0); +} + +sub _input { + my ($data) = @_; + + my $current_data = Irssi::parse_special('$L', 0, 0); + + # TODO: set this back up. + + # if ($settings->{utf8}->{value}) { + # $current_data = decode_utf8($current_data); + # } + + if (defined $data) { + # if ($settings->{utf8}->{value}) { + # Irssi::gui_input_set(encode_utf8($data)); + # } else { + Irssi::gui_input_set($data); + #} + } else { + $data = $current_data; + } + + return $data; +} + +sub _input_pos { + my ($pos) = @_; + my $cur_pos = Irssi::gui_input_get_pos(); + if (defined $pos) { + Irssi::gui_input_set_pos($pos) if $pos != $cur_pos; + } else { + $pos = $cur_pos; + } + + return $pos; +} + +cut_buffer_init(); |