aboutsummaryrefslogtreecommitdiffstats
path: root/ido-mode/ido_switcher.pl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ido-mode/ido_switcher.pl108
1 files changed, 80 insertions, 28 deletions
diff --git a/ido-mode/ido_switcher.pl b/ido-mode/ido_switcher.pl
index b8a604b..9747c31 100644
--- a/ido-mode/ido_switcher.pl
+++ b/ido-mode/ido_switcher.pl
@@ -8,6 +8,9 @@
# http://github.com/shabble/irssi-scripts/raw/master/prompt_info/uberprompt.pl
#
# and follow the instructions at the top of that file for installation.
+# If uberprompt.pl is available, but not loaded, this script will make one
+# attempt to load it before giving up. This eliminates the need to precisely
+# arrange the startup order of your scripts.
#
# SETUP:
#
@@ -19,7 +22,27 @@
#
# C-g (or whatever you've set the above bind to), enters window switching mode.
#
-# NB: When entering window switching mode, the contents of your input line will
+# EXTENDED USAGE:
+#
+# It is possible to pass arguments to the /ido_switch_start command, which
+# correspond to some of the interactively settable parameters listed below.
+# The following options are available:
+#
+# * -channels -- search through only channels.
+# * -queries -- search through only queries.
+# * -all -- search both queries and channels (Default).
+# * -active -- limit search to only window items with activity.
+# * -exact -- enable exact-substring matching
+# * -flex -- enable flex-string matching
+# [If neither of -exact or -flex are given, the default is the value of
+# /set ido_use_flex]
+#
+# EXAMPLE:
+#
+# /bind ^G /ido_switch_start -channels
+# /bind ^F /ido_switch_start -queries -active
+#
+# NOTE: When entering window switching mode, the contents of your input line will
# be saved and cleared, to avoid visual clutter whilst using the switching
# interface. It will be restored once you exit the mode using either C-g, Esc,
# or RET.
@@ -76,10 +99,26 @@
# BUGS:
#
-# * Sometimes selecting a channel with the same name on a different
+# * FIXED Sometimes selecting a channel with the same name on a different
# network will take you to the wrong channel.
#
-#
+# TODO:
+
+# DONE C-g - cancel
+# DONE C-spc - narrow
+# DONE flex matching (on by default, but optional)
+# TODO server/network narrowing
+# DONE colourised output (via uberprompt)
+# DONE C-r / C-s rotate matches
+# DONE toggle queries/channels
+# DONE remove inputline content, restore it afterwards.
+# TODO tab - display all possibilities in window (clean up afterwards)
+# how exactly will this work?
+# DONE sort by recent activity/recently used windows (separate commands?)
+# TODO need to be able to switch ordering of active ones (numerical, or most recently
+# active, priority to PMs/hilights, etc?)
+# DONE should space auto-move forward to next window for easy stepping through
+# sequential/active windows?
#
use strict;
use Irssi;
@@ -100,22 +139,10 @@ $VERSION = '2.0';
);
-# TODO:
-# DONE C-g - cancel
-# DONE C-spc - narrow
-# DONE flex matching (on by default, but optional)
-# TODO server/network narrowing
-# DONE colourised output (via uberprompt)
-# DONE C-r / C-s rotate matches
-# DONE toggle queries/channels
-# DONE remove inputline content, restore it afterwards.
-# TODO tab - display all possibilities in window (clean up afterwards)
-# how exactly will this work?
-# DONE sort by recent activity/recently used windows (separate commands?)
-# TODO need to be able to switch ordering of active ones (numerical, or most recently
-# active, priority to PMs/hilights, etc?)
-# DONE should space auto-move forward to next window for easy stepping through
-# sequential/active windows?
+
+my $CMD_NAME = 'ido_switch_start';
+my $CMD_OPTS = '-channels -queries -all -active -exact -flex';
+
my $input_copy = '';
my $input_pos_copy = 0;
@@ -285,7 +312,9 @@ sub ido_switch_init {
Irssi::settings_add_bool('ido_switch', 'ido_show_active_first', 1);
Irssi::settings_add_int ('ido_switch', 'ido_show_count', 5);
- Irssi::command_bind('ido_switch_start', \&ido_switch_start);
+
+ Irssi::command_bind($CMD_NAME, \&ido_switch_start);
+ Irssi::command_set_options($CMD_NAME, $CMD_OPTS);
Irssi::signal_add ('setup changed' => \&setup_changed);
Irssi::signal_add_first('gui key pressed' => \&handle_keypress);
@@ -300,23 +329,46 @@ sub setup_changed {
$sort_active_first = Irssi::settings_get_bool('ido_show_active_first');
}
-
sub ido_switch_start {
+
+ my ($args, $server, $witem) = @_;
+
# store copy of input line to restore later.
$input_copy = Irssi::parse_special('$L');
$input_pos_copy = Irssi::gui_input_get_pos();
Irssi::gui_input_set('');
- # set startup flags
+ my $options = {};
+ my @opts = Irssi::command_parse_options($CMD_NAME, $args);
+ if (@opts and ref($opts[0]) eq 'HASH') {
+ $options = $opts[0];
+ print "Options: " . Dumper($options);
+ }
+
+ # clear / initialise match variables.
$ido_switch_active = 1;
$search_str = '';
$match_index = 0;
- $mode_type = 'ALL';
- # refresh in case we toggled it last time.
- $ido_use_flex = Irssi::settings_get_bool('ido_use_flex');
- $active_only = 0;
+ # configure settings from provided arguments.
+
+ # use provided options first, or fall back to /setting.
+ $ido_use_flex = exists $options->{exact}
+ ? 0
+ : exists $options->{flex}
+ ? 1
+ : Irssi::settings_get_bool('ido_use_flex');
+
+ # only select active items
+ $active_only = exists $options->{active};
+
+ # what type of items to search.
+ $mode_type = exists $options->{queries}
+ ? 'QUERY'
+ : exists $options->{channels}
+ ? 'CHANNEL'
+ : 'ALL';
_debug_print "Win cache: " . join(", ", map { $_->{name} } @window_cache);
@@ -443,7 +495,7 @@ sub get_all_windows {
# take the top $ido_show_count entries and display them.
my $match_count = scalar @search_matches;
my $show_count = $ido_show_count;
- my $match_string = '[No match';
+ my $match_string = '[No matches]';
$show_count = $match_count if $match_count < $show_count;
@@ -505,7 +557,7 @@ sub get_all_windows {
push @indicators, 'Active' if $active_only;
push @indicators, ucfirst(lc($mode_type));
- my $flex = sprintf(' %%k[%%n%s%%k]%%n ', join ',', @indicators);
+ my $flex = sprintf(' %%b[%%n%s%%b]%%n ', join ', ', @indicators);
my $search = '';
$search = (sprintf '`%s\': ', $search_str) if length $search_str;