diff options
| author | Tom Feist <shabble@metavore.org> | 2011-04-14 05:29:44 +0000 | 
|---|---|---|
| committer | Tom Feist <shabble@metavore.org> | 2011-04-14 05:29:44 +0000 | 
| commit | 8bd10e8beedd06465081b55581e64f590c60687f (patch) | |
| tree | 0e65e1149678465cfb9d615d0b20f270de828caa | |
| parent | template: update with MIT licence and bit more doc stubbing. (diff) | |
| download | irssi-scripts-8bd10e8beedd06465081b55581e64f590c60687f.tar.gz irssi-scripts-8bd10e8beedd06465081b55581e64f590c60687f.zip | |
rl_history_search: try to abstract the temporary split window concept so it can
be used for help display as well (and hoepfully, be used in other scripts too)
| -rw-r--r-- | history-search/rl_history_search.pl | 82 | 
1 files changed, 53 insertions, 29 deletions
| diff --git a/history-search/rl_history_search.pl b/history-search/rl_history_search.pl index 4bb0fcd..e9a365e 100644 --- a/history-search/rl_history_search.pl +++ b/history-search/rl_history_search.pl @@ -62,6 +62,14 @@  # * steal more of the code from ido_switcher to hilight match positions.  # * make flex matching optional (key or setting)  # * add some online help (? or C-h triggered, maybe?) +# * make temp_split stuff more generic (to be used by help, etc) +# * figure out why sometimes the split list doesn't update correctly (eg: no matches) +# * consider tracking history manually (via send command/send text) +#  * Pro: we could timestamp it. +#  * Con: Would involve catching up/down and all the other history selection +#         mechanisms. +#  * Compromise - tag history as it comes it (match it with data via sig handlers?) +# * Possibility of saving/restoring history over sessions?  use strict;  use Irssi; @@ -75,7 +83,7 @@ our %IRSSI =     contact     => 'shabble+irssi@metavore.org, shabble@#irssi/freenode',     name        => 'rl_history_search',     description => 'Search within your typed history as you type' -                . ' (like ctrl-R in readline applications)', +   . ' (like ctrl-R in readline applications)',     license     => 'GPLv2 or later',     url         => 'http://github.com/shabble/irssi-scripts/tree/master/history-search/',     changed     => '14/4/2011' @@ -129,7 +137,7 @@ sub load_uberprompt_failed {      Irssi::signal_remove('script error', 'load_prompt_failed');      print "Script could not be loaded. Script cannot continue. " -      . "Check you have uberprompt.pl installed in your path and " +        . "Check you have uberprompt.pl installed in your path and "          .  "try again.";      die "Script Load Failed: " . join(" ", @_); @@ -151,7 +159,7 @@ sub setup_changed {      $DEBUG_ENABLED = Irssi::settings_get_bool('histsearch_debug');  } -sub history_window_open { +sub temp_split_active () {      return defined $split_ref;  } @@ -172,7 +180,7 @@ sub history_search {  sub history_exit {      $search_active = 0; -    close_listing_split(); +    close_temp_split();      _set_prompt('');  } @@ -214,7 +222,7 @@ sub flex_match {      my ($obj) = @_;      my $pattern = $search_str; -    my $source  = $obj; #->{name}; +    my $source  = $obj;         #->{name};      #_debug("Flex match: $pattern / $source"); @@ -261,7 +269,7 @@ sub flex_match {  sub enter_select_num_mode {      # require that the list be shown. -    return unless history_window_open(); +    return unless temp_split_active();      return if $select_num_active; # TODO: should we prevent restarting?      $num_buffer = 0; @@ -323,27 +331,27 @@ sub handle_keypress {              $num_buffer = ($num_buffer * 10) + $key - 48;              _set_prompt("Num select: $num_buffer"); -        } elsif ($key == 10) { # ENTER +        } elsif ($key == 10) {  # ENTER              history_select_num();              update_input();              exit_select_num_mode();              history_exit(); -        } else { # anything else quits. +        } else {                # anything else quits.              exit_select_num_mode();          }          Irssi::signal_stop();          return;      } -    if ($key == 6) { # Ctrl-F +    if ($key == 6) {            # Ctrl-F          enter_select_num_mode();          Irssi::signal_stop();          return;      } -    if ($key == 7) { # Ctrl-G +    if ($key == 7) {            # Ctrl-G          print "aborting search" if DEBUG;          history_exit(); @@ -354,11 +362,15 @@ sub handle_keypress {          Irssi::signal_stop();          return;      } +    if ($key == 8) {            # C-h +        $original_win_ref->print("This would show help, " +                                 . "if there was any. Coming soon!"); +    } -    if ($key == 9) { # TAB +    if ($key == 9) {            # TAB          update_history_matches(); -        if (not history_window_open()) { -            create_listing_split(); +        if (not temp_split_active()) { +            create_temp_split() if @search_matches > 0;          } else {              print_current_matches();          } @@ -366,23 +378,23 @@ sub handle_keypress {          Irssi::signal_stop();          return;      } -	if ($key == 10) { # enter +	if ($key == 10) {           # enter          print "selecting history and quitting" if DEBUG;          history_exit();          return;  	} -    if ($key == 18) { # Ctrl-R +    if ($key == 18) {           # Ctrl-R          print "skipping to prev match" if DEBUG;          prev_match();          update_input();          update_history_prompt();          print_current_matches(); -        Irssi::signal_stop(); # prevent the bind from being re-triggered. +        Irssi::signal_stop();   # prevent the bind from being re-triggered.          return;      } -    if ($key == 19) { # Ctrl-S +    if ($key == 19) {           # Ctrl-S          print "skipping to next match" if DEBUG;          next_match();          update_input(); @@ -396,7 +408,7 @@ sub handle_keypress {      # TODO: handle arrow-keys?      if ($key == 27) { -        close_listing_split(); +        close_temp_split();          Irssi::signal_stop();          return;      } @@ -413,7 +425,7 @@ sub handle_keypress {          return;      } -    if ($key == 127) { # DEL +    if ($key == 127) {          # DEL          if (length $search_str) {              $search_str = substr($search_str, 0, -1); @@ -433,18 +445,16 @@ sub handle_keypress {      #Irssi::signal_stop();  } -sub create_listing_split { - -    return unless @search_matches > 0; +sub create_temp_split {      Irssi::signal_add_first('window created', 'sig_win_created');      Irssi::command('window new split');      Irssi::signal_remove('window created', 'sig_win_created');  } -sub close_listing_split { +sub close_temp_split { -    if (history_window_open()) { +    if (temp_split_active()) {          Irssi::command("window close $split_ref->{refnum}");          undef $split_ref;      } @@ -464,10 +474,10 @@ sub sig_win_created {  sub print_current_matches { -    return unless history_window_open(); +    return unless temp_split_active();      my $num_matches = scalar(@search_matches); -    return unless $num_matches > 0; +    #return unless $num_matches > 0;      # for some woefully unobvious reason, we need to refetch      # the window reference in order for its attribute hash @@ -491,7 +501,11 @@ sub print_current_matches {      $s_win->print('%_Current history matches. Press <esc> to close.%_',                    MSGLEVEL_CLIENTCRAP | MSGLEVEL_NEVER); -    $split_height -= 2; # account for header line; +    if ($num_matches == 0) { +        $s_win->print('(No Matches)', MSGLEVEL_CLIENTCRAP | MSGLEVEL_NEVER); +        return; +    } +    $split_height -= 2;         # account for header line;      my $hist_entry = get_history_match(); @@ -518,7 +532,7 @@ sub print_current_matches {          }          _debug("sh: $split_height, hh: $half_height, " -                . "mi: $match_index, start: $start, end: $end"); +               . "mi: $match_index, start: $start, end: $end");      } else {          $start = 0;          $end   = $#search_matches; @@ -540,11 +554,21 @@ sub print_current_matches {      $s_win->command("^set timestamp_level $orig_ts_level");  } +sub print_help { + +} + +sub _print_to_active { +    my ($msg, @args) = @_; +    my $str = sprintf($msg, @args); +    $original_win_ref->print($str,MSGLEVEL_CLIENTCRAP | MSGLEVEL_NEVER); +} +  sub _debug {      return unless DEBUG;      my ($msg, @args) = @_;      my $str = sprintf($msg, @args); -    $original_win_ref->print($str); +    $original_win_ref->print($str, MSGLEVEL_CLIENTCRAP | MSGLEVEL_NEVER);  }  sub _set_prompt {      my ($str) = @_; | 
