From 96be64de8b74e55512ff39a9138f745d76921f72 Mon Sep 17 00:00:00 2001 From: Tom Feist Date: Thu, 7 Oct 2010 22:13:08 +0100 Subject: added prompt_replace to dev branch --- docs/allsigs-clean.txt | 379 ++++++++++++++++++++++++++++++++++++++++++ prompt_info/prompt_replace.pl | 346 ++++++++++++++++++++++++++++++++++++++ test/irssi/config | 2 + 3 files changed, 727 insertions(+) create mode 100644 docs/allsigs-clean.txt create mode 100644 prompt_info/prompt_replace.pl diff --git a/docs/allsigs-clean.txt b/docs/allsigs-clean.txt new file mode 100644 index 0000000..bd7d960 --- /dev/null +++ b/docs/allsigs-clean.txt @@ -0,0 +1,379 @@ +away mode changed" +"awaylog show" +"ban type changed" +"beep" +"channel created" +"channel destroyed" +"channel joined" +"channel rejoin new" +"channel sync" +"channel wholist" +"chanquery abort" +"chanquery ban end" +"chanquery ban" +"chanquery mode" +"chanquery who end" +"chat protocol created" +"chat protocol deinit" +"chat protocol destroyed" +"chat protocol unknown" +"chatnet destroyed" +"chatnet read" +"chatnet saved" +"command clear" +"command scrollback" +"complete command action" +"complete command alias" +"complete command away" +"complete command bind" +"complete command cat" +"complete command connect" +"complete command dcc send" +"complete command disconnect" +"complete command format" +"complete command help" +"complete command load" +"complete command msg" +"complete command query" +"complete command rawlog open" +"complete command rawlog save" +"complete command recode remove" +"complete command reconnect" +"complete command reload" +"complete command save" +"complete command script load" +"complete command script unload" +"complete command server add" +"complete command server remove" +"complete command server" +"complete command set" +"complete command stats" +"complete command toggle" +"complete command topic" +"complete command unalias" +"complete command window goto" +"complete command window item move" +"complete command window server" +"complete erase command action" +"complete erase command msg" +"complete erase command query" +"complete erase" +"complete word" +"ctcp action" +"ctcp msg clientinfo" +"ctcp msg dcc accept" +"ctcp msg dcc chat" +"ctcp msg dcc resume" +"ctcp msg dcc send" +"ctcp msg dcc" +"ctcp msg ping" +"ctcp msg time" +"ctcp msg userinfo" +"ctcp msg version" +"ctcp msg" +"ctcp reply dcc reject" +"ctcp reply dcc" +"ctcp reply ping" +"ctcp reply" +"dcc chat message" +"dcc closed" +"dcc connected" +"dcc ctcp action" +"dcc ctcp dcc" +"dcc destroyed" +"dcc error close not found" +"dcc error connect" +"dcc error ctcp" +"dcc error file create" +"dcc error file open" +"dcc error get not found" +"dcc error send exists" +"dcc error send no route" +"dcc error unknown type" +"dcc error write" +"dcc list print" +"dcc rejected" +"dcc reply dcc" +"dcc reply send pasv" +"dcc request send" +"dcc request" +"dcc server message" +"dcc server started" +"default command server" +"default command" +"default ctcp msg dcc" +"default ctcp msg" +"default ctcp reply dcc" +"default ctcp reply" +"default dcc ctcp" +"default event numeric" +"default event" +"error command" +"event 001" +"event 004" +"event 005" +"event 221" +"event 254" +"event 271" +"event 272" +"event 281" +"event 301" +"event 302" +"event 303" +"event 305" +"event 306" +"event 311" +"event 312" +"event 313" +"event 314" +"event 315" +"event 317" +"event 318" +"event 319" +"event 324" +"event 326" +"event 327" +"event 328" +"event 329" +"event 330" +"event 332" +"event 333" +"event 338" +"event 341" +"event 344" +"event 345" +"event 346" +"event 347" +"event 348" +"event 349" +"event 352" +"event 353" +"event 364" +"event 365" +"event 366" +"event 367" +"event 368" +"event 369" +"event 372" +"event 375" +"event 376" +"event 377" +"event 378" +"event 379" +"event 381" +"event 386" +"event 387" +"event 388" +"event 389" +"event 396" +"event 401" +"event 403" +"event 404" +"event 405" +"event 407" +"event 408" +"event 421" +"event 422" +"event 432" +"event 433" +"event 436" +"event 437" +"event 438" +"event 439" +"event 442" +"event 465" +"event 470" +"event 471" +"event 472" +"event 473" +"event 474" +"event 475" +"event 476" +"event 477" +"event 478" +"event 479" +"event 482" +"event 486" +"event 489" +"event 494" +"event 506" +"event 707" +"event 716" +"event 717" +"event 728" +"event 729" +"event connected" +"event empty" +"event error" +"event invite" +"event join" +"event kick" +"event kill" +"event mode" +"event nick" +"event notice" +"event part" +"event ping" +"event pong" +"event privmsg" +"event quit" +"event silence" +"event topic" +"event wallops" +"exec input" +"expando timer" +"flood" +"gui dialog" +"gui entry redirect" +"gui exit" +"gui key pressed" +"gui page scrolled" +"gui print text finished" +"gui print text" +"gui window create override" +"gui window created" +"ignore changed" +"ignore created" +"ignore destroyed" +"irssi init finished" +"irssi init read settings" +"lag ping error" +"lag pong" +"layout reset" +"layout restore item" +"layout restore window" +"layout restore" +"layout save item" +"layout save window" +"layout save" +"list subcommands" +"log config read" +"log config save" +"log create failed" +"log locked" +"log new" +"log written" +"mainwindow destroyed" +"mainwindow moved" +"mainwindow resized" +"message dcc action" +"message dcc ctcp" +"message dcc own" +"message dcc own_action" +"message dcc own_ctcp" +"message dcc" +"message invite" +"message irc action" +"message irc ctcp" +"message irc mode" +"message irc notice" +"message irc op_public" +"message irc own_action" +"message irc own_ctcp" +"message irc own_notice" +"message irc own_wall" +"message join" +"message kick" +"message nick" +"message own_nick" +"message own_private" +"message own_public" +"message part" +"message private" +"message public" +"message quit" +"message topic" +"module error" +"module loaded" +"module unloaded" +"netsplit new" +"nickfind event whois" +"nicklist changed" +"nicklist host changed" +"nicklist new" +"nicklist remove" +"notifylist away changed" +"notifylist event whois away" +"notifylist event whois end" +"notifylist event whois" +"notifylist event" +"notifylist joined" +"notifylist left" +"pidwait" +"print format" +"print starting" +"print text" +"proxy client dump" +"query created" +"query destroyed" +"query nick changed" +"query server changed" +"reload" +"requested usermode change" +"script destroyed" +"script error" +"send command" +"send text" +"server add fill" +"server connect copy" +"server connect failed" +"server connected" +"server connecting" +"server disconnected" +"server event" +"server incoming" +"server lag disconnect" +"server lag" +"server looking" +"server nick changed" +"server quit" +"server reconnect not found" +"server reconnect remove" +"server reconnect save status" +"server sendmsg" +"server setup fill chatnet" +"server setup fill connect" +"server setup fill reconn" +"server setup read" +"server setup saved" +"session restore channel" +"session restore nick" +"session restore server" +"session restore" +"session save channel" +"session save server" +"session save" +"settings errors" +"setup changed" +"setup reread" +"silent event who" +"silent event whois" +"terminal resized" +"theme changed" +"theme destroyed" +"user mode changed" +"userhost event" +"whois away" +"whois default event" +"whois end" +"whois event not found" +"whois event" +"whois oper" +"whois try whowas" +"whowas away" +"whowas event end" +"whowas event" +"window activity" +"window changed automatic" +"window changed" +"window created" +"window dehilight" +"window destroyed" +"window hilight" +"window history changed" +"window item changed" +"window item remove" +"window item server changed" +"window print info" +"window refnum changed" +"window server changed" diff --git a/prompt_info/prompt_replace.pl b/prompt_info/prompt_replace.pl new file mode 100644 index 0000000..4cab4be --- /dev/null +++ b/prompt_info/prompt_replace.pl @@ -0,0 +1,346 @@ +use strict; +use warnings; + +use Irssi; +use Irssi::TextUI; # for sbar_items_redraw +use Data::Dumper; + + + +our $VERSION = "0.1"; +our %IRSSI = + ( + authors => "shabble", + contact => 'shabble+irssi@metavore.org, shabble@#irssi/Freenode', + name => "prompt_info", + description => "Helper script for dynamically adding text " + . "into the input-bar prompt.", + license => "Public Domain", + changed => "24/7/2010" + ); + +sub DEBUG () { 1 } +#sub DEBUG () { 0 } + +my $prompt_data = undef; +my $prompt_item = undef; + +my $region_active = 0; + +my ($term_w, $term_h) = (0, 0); + +# visual region selected. +my ($region_start, $region_end) = (0, 0); +my $region_content = ''; + +my $prompt_format = ''; + +init(); + +sub update_terminal_size { + + my @stty_data = qx/stty -a/; + my $line = $stty_data[0]; + + # linux + # speed 38400 baud; rows 36; columns 126; line = 0; + if ($line =~ m/rows (\d+); columns (\d+);/) { + $term_h = $1; + $term_w = $2; + # osx + # speed 9600 baud; 40 rows; 235 columns; + } elsif ($line =~ m/(\d+) rows; (\d+) columns;/) { + $term_h = $1; + $term_w = $2; + } else { + # guess? + $term_h = 24; + $term_w = 80; + } + + print "Terminal detected as $term_w cols by $term_h rows" if DEBUG; +} + +sub prompt_subcmd_handler { + my ($data, $server, $item) = @_; + $data =~ s/\s+$//g; # strip trailing whitespace. + Irssi::command_runsub('prompt', $data, $server, $item); +} + +sub visual_subcmd_handler { + my ($data, $server, $item) = @_; + $data =~ s/\s+$//g; # strip trailing whitespace. + Irssi::command_runsub('visual', $data, $server, $item); +} + +sub init { + + Irssi::statusbar_item_register ('uberprompt', 0, 'uberprompt_draw'); + + Irssi::settings_add_str('uberprompt', 'uberprompt_format', '[$*] '); + + Irssi::command_bind("prompt", \&prompt_subcmd_handler); + Irssi::command_bind('prompt on', \&replace_prompt_items); + Irssi::command_bind('prompt off', \&restore_prompt_items); + Irssi::command_bind('prompt set', + sub { Irssi::signal_emit 'change prompt', shift; }); + Irssi::command_bind('prompt clear', + sub { Irssi::signal_emit 'change prompt', '$p'; }); + + # misc faff + Irssi::command_bind('visual', \&visual_subcmd_handler); + Irssi::command_bind('visual toggle', \&cmd_toggle_visual); + Irssi::command_bind('visual clear', \&cmd_clear_visual); + + Irssi::command("^BIND ^F /visual toggle"); + Irssi::command("^BIND ^G /visual clear"); + + Irssi::command_bind 'print_test', + sub { + Irssi::gui_printtext(0, 0, '%8hello there%n'); + }; + + # redraw interception + Irssi::signal_add_last('command redraw', \&augment_redraw); + Irssi::signal_add_first('gui key pressed', \&ctrl_l_intercept); + + # for updating the overlay. + Irssi::signal_add_last ('gui key pressed', \&key_pressed); + + # things to refresh the overlay for. + Irssi::signal_add('window changed', \&uberprompt_refresh); + Irssi::signal_add('window name changed', \&uberprompt_refresh); + Irssi::signal_add('window changed automatic', \&uberprompt_refresh); + Irssi::signal_add('window item changed', \&uberprompt_refresh); + + Irssi::signal_add('terminal resized', \&update_terminal_size); + Irssi::signal_add('setup changed', \&reload_settings); + + # so we know where the bottom line is + update_terminal_size(); + + # intialise the prompt format. + reload_settings(); + + # install our statusbars. + replace_prompt_items(); + + # the actual API signals. + Irssi::signal_register({'change prompt' => [qw/string/]}); + Irssi::signal_add('change prompt' => \&change_prompt_sig); + + Irssi::signal_register({'prompt changed' => [qw/string int/]}); + +} + +sub change_prompt_sig { + my ($text) = @_; + + $text = '$p' . $text; + print "Got prompt change sig with: $text" if DEBUG; + + my $changed; + $changed = defined $prompt_data ? $prompt_data ne $text : 1; + + $prompt_data = $text; + + if ($changed) { + print "Redrawing prompt" if DEBUG; + uberprompt_refresh(); + } +} + + +sub UNLOAD { + # remove uberprompt and return the original ones. + restore_prompt_items(); +} + +sub reload_settings { + my $new = Irssi::settings_get_str('uberprompt_format'); + if ($prompt_format ne $new) { + print "Updated prompt format" if DEBUG; + $prompt_format = $new; + Irssi::abstracts_register(['uberprompt', $prompt_format]); + } +} + +sub uberprompt_draw { + my ($sb_item, $get_size_only) = @_; + + my $default_prompt = ''; + + my $window = Irssi::active_win; + + # hack to produce the same defaults as prompt/prompt_empty sbars. + + if (scalar( () = $window->items )) { + $default_prompt = '{uberprompt $[.15]itemname}'; + } else { + $default_prompt = '{uberprompt $winname}'; + } + + my $p_copy = $prompt_data; + + if (defined $prompt_data) { + # replace the special marker '$p' with the original prompt. + $p_copy =~ s/\$p/$default_prompt/; + } else { + $p_copy = $default_prompt; + } + print "Redrawing with: $p_copy, size-only: $get_size_only" if DEBUG; + + $prompt_item = $sb_item; + + my $ret = $sb_item->default_handler($get_size_only, $p_copy, '', 0); + + Irssi::signal_emit('prompt changed', $p_copy, $sb_item->{size}); + return $ret; +} + +sub augment_redraw { + print "Redraw called" if DEBUG; + uberprompt_refresh(); + Irssi::timeout_add_once(10, \&refresh_visual_overlay, 0); +} + +sub uberprompt_refresh { + Irssi::statusbar_items_redraw('uberprompt'); +} + + +sub cmd_clear_visual { + _clear_visual_region(); + #refresh_visual_overlay(); + Irssi::statusbar_items_redraw('input'); +} + +sub cmd_toggle_visual { + + $region_active = not $region_active; + + if ($region_active) { + $region_start = _pos(); + $region_end = 0; # reset end marker. + print "visual mode started at $region_start" if DEBUG; + } else { + $region_end = _pos(); + print "Visual mode ended at $region_end" if DEBUG; + + if ($region_end > $region_start) { + my $input = Irssi::parse_special('$L', 0, 0); + my $str = substr($input, $region_start, $region_end - $region_start); + print "Region selected: $str" if DEBUG; + } else { + print "Invalid region selection: [ $region_start - $region_end ]" + if DEBUG; + $region_start = $region_end = 0; + } + cmd_clear_visual(); + } +} + +sub ctrl_l_intercept { + my $key = shift; + + if ($key == 12) { # C-l + print "C-l pressed" if DEBUG; + Irssi::command("redraw"); + Irssi::signal_stop(); + } elsif ($key == 10) { # RET + _clear_visual_region(); + } +} + +sub key_pressed { + # this handler needs to be last so the actual character is printed by irssi + # before we overlay on it. Otherwise things are all a bit off-by-1 + return unless $region_active; + + refresh_visual_overlay(); +} + +sub _clear_visual_region { + print "Clearing Region markers" if DEBUG; + $region_end = 0; + $region_start = 0; +} + + +sub refresh_visual_overlay { + + my $end_pos = $region_end; + $end_pos ||= _pos(); # if not set, take current position as end. + + my $len = $end_pos - $region_start; + return unless $len; # no point drawing an empty overlay + + my $input = Irssi::parse_special('$L'); + my $offset = $prompt_item->{size} + $region_start; + + my $text = substr($input, $region_start, $len); + + print "printing '$text' at $offset [$region_start, $end_pos] ($len)" if DEBUG; + + $text = '%8' . $text . '%8'; + _draw_overlay($offset, $text, $len); + +} + +sub _draw_overlay { + my ($offset, $text, $len) = @_; + Irssi::gui_printtext($offset, $term_h, $text); +} + +sub replace_prompt_items { + # remove existing ones. + print "Removing original prompt" if DEBUG; + + _sbar_command('prompt', 'remove', 'prompt'); + _sbar_command('prompt', 'remove', 'prompt_empty'); + + # add the new one. + + _sbar_command('prompt', 'add', 'uberprompt', + qw/-alignment left -before input -priority '-1'/); + + _sbar_command('prompt', 'position', '100'); +} + +sub restore_prompt_items { + + _sbar_command('prompt', 'remove', 'uberprompt'); + + print "Restoring original prompt" if DEBUG; + + _sbar_command('prompt', 'add', 'prompt', + qw/-alignment left -before input -priority '-1'/); + _sbar_command('prompt', 'add', 'prompt_empty', + qw/-alignment left -after prompt -priority '-1'/); + + _sbar_command('prompt', 'position', '100'); + +} + +sub _sbar_command { + my ($bar, $cmd, $item, @args) = @_; + + my $args_str = join ' ', @args; + + $args_str .= ' ' if length $args_str && defined $item; + + my $command = sprintf 'STATUSBAR %s %s %s%s', + $bar, $cmd, $args_str, defined($item)?$item:''; + + print "Running command: $command" if DEBUG; + Irssi::command($command); +} + +sub _pos { + return Irssi::gui_input_get_pos(); +} + + +# bit of fakery so things don't complain about the lack of prompt_info (hoepfully) + +%Irssi::Script::prompt_info:: = (); diff --git a/test/irssi/config b/test/irssi/config index 9156a7f..25101e6 100644 --- a/test/irssi/config +++ b/test/irssi/config @@ -165,6 +165,7 @@ aliases = { xxx = "/dump Irssi::bindings()"; showbind = "/script exec \\%foo = Irssi::UI::bindings()\\; print \\$foo{\"\\\\$0\"}\\;"; botaway = "/away auto-away [\002BX\002-MsgLog On] (Away since 1:43 am Mon Aug 24)"; + vim = "/script load vim_mode.pl"; }; statusbar = { @@ -229,6 +230,7 @@ statusbar = { act = { priority = "10"; }; more = { priority = "-1"; alignment = "right"; }; barend = { priority = "100"; alignment = "right"; }; + vim_mode = { }; }; }; -- cgit v1.2.3 From 1c802f8cbfbc93c868fbc4eb2517be749b971068 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Thu, 14 Oct 2010 21:53:29 +0200 Subject: vim_mode: Move all settings to $settings hash. --- vim-mode/vim_mode.pl | 52 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl index a00421a..ac859a2 100644 --- a/vim-mode/vim_mode.pl +++ b/vim-mode/vim_mode.pl @@ -454,12 +454,20 @@ foreach my $char (keys %$commands) { # GLOBAL VARIABLES -my $DEBUG_ENABLED = 0; - -sub DEBUG { $DEBUG_ENABLED } +# all vim_mode settings, must be enabled in vim_mode_init() before usage +my $settings + = { + # print debug output + debug => 0, + # use UTF-8 internally for string calculations/manipulations + utf8 => 1, + # esc-shortcut in insert mode + cmd_seq => '', + # not used yet + max_undo_lines => 50, + }; -# use UTF-8 internally for string calculations/manipulations -my $utf8 = 1; +sub DEBUG { $settings->{debug} } # buffer to keep track of the last N keystrokes, used for Esc detection and # insert mode mappings @@ -712,7 +720,7 @@ sub cmd_j { } elsif ($history_index >= 0) { my $history = $history[$history_index]; # History is not in UTF-8! - if ($utf8) { + if ($settings->{utf8}) { $history = decode_utf8($history); } _input($history); @@ -744,7 +752,7 @@ sub cmd_k { if ($history_index >= 0) { my $history = $history[$history_index]; # History is not in UTF-8! - if ($utf8) { + if ($settings->{utf8}) { $history = decode_utf8($history); } _input($history); @@ -781,7 +789,7 @@ sub cmd_G { my $history = $history[$history_index]; # History is not in UTF-8! - if ($utf8) { + if ($settings->{utf8}) { $history = decode_utf8($history); } _input($history); @@ -2481,38 +2489,40 @@ sub vim_mode_init { sub setup_changed { my $value; - # Delete all possible imaps created by /set vim_mode_cmd_seq. - foreach my $char ('a' .. 'z') { - delete $imaps->{$char}; + if ($settings->{cmd_seq} ne '') { + delete $imaps->{$settings->{cmd_seq}}; } - $value = Irssi::settings_get_str('vim_mode_cmd_seq'); - if ($value) { + if ($value eq '') { + $settings->{cmd_seq} = $value; + } else { if (length $value == 1) { $imaps->{$value} = { 'map' => $value, 'func' => sub { _update_mode(M_CMD) } }; + $settings->{cmd_seq} = $value; } else { _warn("Error: vim_mode_cmd_seq must be a single character"); } } - $DEBUG_ENABLED = Irssi::settings_get_bool('vim_mode_debug'); + $settings->{debug} = Irssi::settings_get_bool('vim_mode_debug'); my $new_utf8 = Irssi::settings_get_bool('vim_mode_utf8'); - - if ($new_utf8 != $utf8) { + if ($new_utf8 != $settings->{utf8}) { # recompile the patterns when switching to/from utf-8 $word = qr/[\w_]/o; $non_word = qr/[^\w_\s]/o; - } + $settings->{utf8} = $new_utf8; + } if ($new_utf8 and (!$^V or $^V lt v5.8.1)) { _warn("Warning: UTF-8 isn't supported very well in perl < 5.8.1! " . "Please disable the vim_mode_utf8 setting."); } - $utf8 = $new_utf8; + $settings->{max_undo_lines} + = Irssi::settings_get_int('vim_mode_max_undo_lines'); } sub UNLOAD { @@ -2545,7 +2555,7 @@ sub _add_undo_entry { unshift @undo_buffer, [$line, $pos]; $undo_index = 0; } - my $max = Irssi::settings_get_int('vim_mode_max_undo_lines'); + my $max = $settings->{max_undo_lines}; } sub _restore_undo_entry { @@ -2671,12 +2681,12 @@ sub _input { my $current_data = Irssi::parse_special('$L', 0, 0); - if ($utf8) { + if ($settings->{utf8}) { $current_data = decode_utf8($current_data); } if (defined $data) { - if ($utf8) { + if ($settings->{utf8}) { Irssi::gui_input_set(encode_utf8($data)); } else { Irssi::gui_input_set($data); -- cgit v1.2.3 From c0af8a14674404f878c0c97bfc684e98ec0a2289 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Thu, 14 Oct 2010 22:31:42 +0200 Subject: vim_mode: Add :se[t]. --- vim-mode/vim_mode.pl | 105 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 82 insertions(+), 23 deletions(-) diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl index ac859a2..58d153f 100644 --- a/vim-mode/vim_mode.pl +++ b/vim-mode/vim_mode.pl @@ -81,6 +81,9 @@ # * Substitute: :s/// - i and g are supported as flags, only /// can be # used as separator, uses Perl regex instead of # Vim regex +# * Settings: :se[t] - display all options +# :se[t] {option} - display all matching options +# :se[t] {option} {value} - change option to value # # # Mappings: @@ -102,11 +105,19 @@ # :unmap - restore default behavior of after disabling it # # -# The following irssi settings are available: +# Settings: +# +# The settings are stored as irssi settings and can be set using /set as usual +# (prepend vim_mode_ to setting name) or using the :set ex-command. The +# following settings are available: +# +# * utf8: support UTF-8 characters, boolean, default on +# * debug: enable debug output, boolean, default off +# * cmd_seq: char that when double-pressed simulates , string, default '' +# +# In contrast to irssi's settings, :set accepts 0 and 1 as values for boolean +# settings. # -# * vim_mode_utf8: support UTF-8 characters, default on -# * vim_mode_debug: enable debug output, default off -# * vim_mode_cmd_seq: char that when double-pressed simulates # # The following statusbar items are available: # @@ -259,6 +270,11 @@ sub C_IRSSI () { 6 } # does nothing sub C_NOP () { 7 } +# setting types, match irssi types as they are stored as irssi settings +sub S_BOOL () { 0 } +sub S_INT () { 1 } +sub S_STR () { 2 } + # word and non-word regex, keep in sync with setup_changed()! my $word = qr/[\w_]/o; my $non_word = qr/[^\w_\s]/o; @@ -439,6 +455,10 @@ my $commands_ex type => C_EX }, mkv => { char => ':mkv', func => \&ex_mkvimrc, type => C_EX }, + se => { char => ':se', func => \&ex_set, + type => C_EX }, + set => { char => ':set', func => \&ex_set, + type => C_EX }, }; # MAPPINGS @@ -458,16 +478,16 @@ foreach my $char (keys %$commands) { my $settings = { # print debug output - debug => 0, + debug => { type => S_BOOL, value => 0 }, # use UTF-8 internally for string calculations/manipulations - utf8 => 1, + utf8 => { type => S_BOOL, value => 1 }, # esc-shortcut in insert mode - cmd_seq => '', + cmd_seq => { type => S_STR, value => '' }, # not used yet - max_undo_lines => 50, + max_undo_lines => { type => S_INT, value => 50 }, }; -sub DEBUG { $settings->{debug} } +sub DEBUG { $settings->{debug}->{value} } # buffer to keep track of the last N keystrokes, used for Esc detection and # insert mode mappings @@ -720,7 +740,7 @@ sub cmd_j { } elsif ($history_index >= 0) { my $history = $history[$history_index]; # History is not in UTF-8! - if ($settings->{utf8}) { + if ($settings->{utf8}->{value}) { $history = decode_utf8($history); } _input($history); @@ -752,7 +772,7 @@ sub cmd_k { if ($history_index >= 0) { my $history = $history[$history_index]; # History is not in UTF-8! - if ($settings->{utf8}) { + if ($settings->{utf8}->{value}) { $history = decode_utf8($history); } _input($history); @@ -789,7 +809,7 @@ sub cmd_G { my $history = $history[$history_index]; # History is not in UTF-8! - if ($settings->{utf8}) { + if ($settings->{utf8}->{value}) { $history = decode_utf8($history); } _input($history); @@ -1878,6 +1898,45 @@ sub ex_mkvimrc { close $file; } +sub ex_set { + my ($arg_str, $count) = @_; + + # :se[t] [option] [value] + if ($arg_str =~ /^se(?:t)?(?:\s(\S+)(?:\s(.+)$)?)?/) { + # :se[t] {option} {value} + if (defined $1 and defined $2) { + if (not exists $settings->{$1}) { + return _warn_ex('map', "setting '$1' not found"); + } + my $name = $1; + my $value = $2; + # Also accept numeric values for boolean options. + if ($settings->{$name}->{type} == S_BOOL and + $value !~ /^(on|off)$/) { + $value = $value ? 'on' : 'off'; + } + Irssi::command("set vim_mode_$name $value"); + + # :se[t] [option] + } else { + my $search = defined $1 ? $1 : ''; + my $active_window = Irssi::active_win(); + foreach my $setting (sort keys %$settings) { + next if $setting !~ /^\Q$search\E/; # skip non-matches + my $value = $settings->{$setting}->{value}; + # Irssi only accepts 'on' and 'off' as values for boolean + # options. + if ($settings->{$setting}->{type} == S_BOOL) { + $value = $value ? 'on' : 'off'; + } + $active_window->print($setting . '=' . $value); + } + } + } else { + _warn_ex('map'); + } +} + sub _warn_ex { my ($command, $description) = @_; my $message = "Error in ex-mode command $command"; @@ -2489,39 +2548,39 @@ sub vim_mode_init { sub setup_changed { my $value; - if ($settings->{cmd_seq} ne '') { - delete $imaps->{$settings->{cmd_seq}}; + if ($settings->{cmd_seq}->{value} ne '') { + delete $imaps->{$settings->{cmd_seq}->{value}}; } $value = Irssi::settings_get_str('vim_mode_cmd_seq'); if ($value eq '') { - $settings->{cmd_seq} = $value; + $settings->{cmd_seq}->{value} = $value; } else { if (length $value == 1) { $imaps->{$value} = { 'map' => $value, 'func' => sub { _update_mode(M_CMD) } }; - $settings->{cmd_seq} = $value; + $settings->{cmd_seq}->{value} = $value; } else { _warn("Error: vim_mode_cmd_seq must be a single character"); } } - $settings->{debug} = Irssi::settings_get_bool('vim_mode_debug'); + $settings->{debug}->{value} = Irssi::settings_get_bool('vim_mode_debug'); my $new_utf8 = Irssi::settings_get_bool('vim_mode_utf8'); - if ($new_utf8 != $settings->{utf8}) { + if ($new_utf8 != $settings->{utf8}->{value}) { # recompile the patterns when switching to/from utf-8 $word = qr/[\w_]/o; $non_word = qr/[^\w_\s]/o; - $settings->{utf8} = $new_utf8; + $settings->{utf8}->{value} = $new_utf8; } if ($new_utf8 and (!$^V or $^V lt v5.8.1)) { _warn("Warning: UTF-8 isn't supported very well in perl < 5.8.1! " . "Please disable the vim_mode_utf8 setting."); } - $settings->{max_undo_lines} + $settings->{max_undo_lines}->{value} = Irssi::settings_get_int('vim_mode_max_undo_lines'); } @@ -2555,7 +2614,7 @@ sub _add_undo_entry { unshift @undo_buffer, [$line, $pos]; $undo_index = 0; } - my $max = $settings->{max_undo_lines}; + my $max = $settings->{max_undo_lines}->{value}; } sub _restore_undo_entry { @@ -2681,12 +2740,12 @@ sub _input { my $current_data = Irssi::parse_special('$L', 0, 0); - if ($settings->{utf8}) { + if ($settings->{utf8}->{value}) { $current_data = decode_utf8($current_data); } if (defined $data) { - if ($settings->{utf8}) { + if ($settings->{utf8}->{value}) { Irssi::gui_input_set(encode_utf8($data)); } else { Irssi::gui_input_set($data); -- cgit v1.2.3 From d1447815225b8c60db83dd687661e203314f707f Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Thu, 14 Oct 2010 22:33:36 +0200 Subject: vim_mode: Mention that :set only sets vim_mode settings. --- vim-mode/vim_mode.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl index 58d153f..6ff8c78 100644 --- a/vim-mode/vim_mode.pl +++ b/vim-mode/vim_mode.pl @@ -116,7 +116,7 @@ # * cmd_seq: char that when double-pressed simulates , string, default '' # # In contrast to irssi's settings, :set accepts 0 and 1 as values for boolean -# settings. +# settings, but only vim_mode's settings can be set/displayed. # # # The following statusbar items are available: -- cgit v1.2.3 From 6978615c3d18b768a3ab2e0b01387f8102f25c43 Mon Sep 17 00:00:00 2001 From: Tom Feist Date: Thu, 14 Oct 2010 21:57:44 +0100 Subject: misc: added gitignore to dev branch --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..830c860 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/test/irssi/* +/nightfrog -- cgit v1.2.3 From 9aa90ce4aea27082948602587197557bbaca1b3d Mon Sep 17 00:00:00 2001 From: Tom Feist Date: Thu, 14 Oct 2010 21:58:18 +0100 Subject: prompt: uberprompt no longer applies abstract replaces on prompt format. --- prompt_info/uberprompt.pl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/prompt_info/uberprompt.pl b/prompt_info/uberprompt.pl index 0581dd3..f6fd775 100644 --- a/prompt_info/uberprompt.pl +++ b/prompt_info/uberprompt.pl @@ -286,7 +286,8 @@ sub uberprompt_draw { my $prompt = ''; # rendered content of the prompt. my $theme = Irssi::current_theme; - $prompt = $theme->format_expand("{uberprompt $prompt_arg}"); + $prompt = $theme->format_expand + ("{uberprompt $prompt_arg}", Irssi::EXPAND_FLAG_IGNORE_REPLACES); if ($prompt_data_pos eq 'UP_ONLY') { $prompt =~ s/\$\$uber//; # no need for recursive prompting, I hope. -- cgit v1.2.3