diff options
author | Tom Feist <shabble@metavore.org> | 2011-04-18 00:41:11 +0000 |
---|---|---|
committer | Tom Feist <shabble@metavore.org> | 2011-04-18 00:41:11 +0000 |
commit | 7094c94a381d7b6265abdea77798e722eb458cef (patch) | |
tree | 1b987d89588e2cc12843d804b9029ba8d90251e6 /undo | |
parent | undo: kill-ring.pl, an initial attempt at a script to keep track of changes in (diff) | |
download | irssi-scripts-7094c94a381d7b6265abdea77798e722eb458cef.tar.gz irssi-scripts-7094c94a381d7b6265abdea77798e722eb458cef.zip |
undo: updates to kill-ring, implementing most of the basic functionality.
Unfortunately, it requires listening to every keystroke since there's no way to
know ahead of time which keys will modify the cutbuffer.
Diffstat (limited to 'undo')
-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(); |