diff options
| author | Simon Ruderich <simon@ruderich.org> | 2010-09-28 21:59:50 +0000 | 
|---|---|---|
| committer | Simon Ruderich <simon@ruderich.org> | 2010-09-28 22:00:35 +0000 | 
| commit | e77c897c5a01a14a6f0f1cf24a6924fb61b50994 (patch) | |
| tree | 1055f985000d3f9386a9454e1ed13934ad740624 /vim-mode | |
| parent | changed licence to MIT (diff) | |
| download | irssi-scripts-e77c897c5a01a14a6f0f1cf24a6924fb61b50994.tar.gz irssi-scripts-e77c897c5a01a14a6f0f1cf24a6924fb61b50994.zip | |
vim_mode: Move cmd and ex-mode handling to separate functions.
Diffstat (limited to 'vim-mode')
| -rw-r--r-- | vim-mode/vim_mode.pl | 306 | 
1 files changed, 155 insertions, 151 deletions
| diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl index 74ccd18..3ba679d 100644 --- a/vim-mode/vim_mode.pl +++ b/vim-mode/vim_mode.pl @@ -918,8 +918,10 @@ sub got_key {          return;      } -    if ($mode == M_CMD || $mode == M_EX) { -        handle_command($key); +    if ($mode == M_CMD) { +        handle_command_cmd($key); +    } elsif ($mode == M_EX) { +        handle_command_ex($key);      }  } @@ -982,184 +984,186 @@ sub handle_numeric_prefix {      }  } -sub handle_command { +sub handle_command_cmd {      my ($key) = @_;      my $should_stop = 1; -    if ($mode == M_EX) { -        # DEL key - remove last character -        if ($key == 127) { -            print "Delete" if DEBUG; -            pop @ex_buf; -            _set_prompt(':' . join '', @ex_buf); - -        # Return key - execute command -        } elsif ($key == 10) { -            print "Run ex-mode command" if DEBUG; -            cmd_ex_command(); -            _set_prompt(''); -            @ex_buf = (); -            _update_mode(M_CMD); - -        # Append entered key -        } else { -            push @ex_buf, chr $key; -            _set_prompt(':' . join '', @ex_buf); -        } - -        Irssi::statusbar_items_redraw("vim_windows"); +    my $char = chr($key); -    } else { -        my $char = chr($key); +    # We need to treat $movements_multiple specially as they need another +    # argument. +    if ($movement) { +        $movement .= $char; +    } -        # We need to treat $movements_multiple specially as they need another -        # argument. -        if ($movement) { -            $movement .= $char; -        } +    # S is an alias for cc. +    if (!$movement and !$operator and $char eq 'S') { +        print "Changing S to cc" if DEBUG; +        $char = 'c'; +        $operator = 'c'; +    } -        # S is an alias for cc. -        if (!$movement and !$operator and $char eq 'S') { -            print "Changing S to cc" if DEBUG; -            $char = 'c'; -            $operator = 'c'; +    if (!$movement && ($char =~ m/[1-9]/ || +                       ($numeric_prefix && $char =~ m/[0-9]/))) { +        print "Processing numeric prefix: $char" if DEBUG; +        handle_numeric_prefix($char); + +    } elsif (!$movement && exists $movements_multiple->{$char}) { +        print "Processing movement: $char" if DEBUG; +        $movement = $char; + +    } elsif (!$movement && exists $operators->{$char}) { +        print "Processing operator: $char" if DEBUG; + +        # Abort operator if we already have one pending. +        if ($operator) { +            # But allow cc/dd/yy. +            if ($operator eq $char) { +                print "Processing operator: ", $operator, $char if DEBUG; +                my $pos = _input_pos(); +                $operators->{$operator}->{func}->(0, _input_len(), ''); +                # Restore position for yy. +                if ($char eq 'y') { +                    _input_pos($pos); +                } +            } +            $numeric_prefix = undef; +            $operator = undef; +            $movement = undef; +        # Set new operator. +        } else { +            $operator = $char;          } -        if (!$movement && ($char =~ m/[1-9]/ || -                           ($numeric_prefix && $char =~ m/[0-9]/))) { -            print "Processing numeric prefix: $char" if DEBUG; -            handle_numeric_prefix($char); - -        } elsif (!$movement && exists $movements_multiple->{$char}) { -            print "Processing movement: $char" if DEBUG; -            $movement = $char; +    } elsif ($movement || exists $movements->{$char}) { +        print "Processing movement command: $char" if DEBUG; -        } elsif (!$movement && exists $operators->{$char}) { -            print "Processing operator: $char" if DEBUG; +        my $skip = 0; -            # Abort operator if we already have one pending. -            if ($operator) { -                # But allow cc/dd/yy. -                if ($operator eq $char) { -                    print "Processing operator: ", $operator, $char if DEBUG; -                    my $pos = _input_pos(); -                    $operators->{$operator}->{func}->(0, _input_len(), ''); -                    # Restore position for yy. -                    if ($char eq 'y') { -                        _input_pos($pos); -                    } +        if (!$movement) { +            # . repeats the last command. +            if ($char eq '.' and defined $last->{char}) { +                $char = $last->{char}; +                # If . is given a count then it replaces original count. +                if (not defined $numeric_prefix) { +                    $numeric_prefix = $last->{numeric_prefix};                  } -                $numeric_prefix = undef; -                $operator = undef; -                $movement = undef; -            # Set new operator. -            } else { -                $operator = $char; +                $operator = $last->{operator}; +                $movement = $last->{movement}; +                $register = $last->{register}; +            } elsif ($char eq '.') { +                $skip = 1;              } +            # C and D force the matching operator +            if ($char eq 'C') { +                $operator = 'c'; +            } elsif ($char eq 'D') { +                $operator = 'd'; +            } +        } -        } elsif ($movement || exists $movements->{$char}) { -            print "Processing movement command: $char" if DEBUG; - -            my $skip = 0; - -            if (!$movement) { -                # . repeats the last command. -                if ($char eq '.' and defined $last->{char}) { -                    $char = $last->{char}; -                    # If . is given a count then it replaces original count. -                    if (not defined $numeric_prefix) { -                        $numeric_prefix = $last->{numeric_prefix}; -                    } -                    $operator = $last->{operator}; -                    $movement = $last->{movement}; -                    $register = $last->{register}; -                } elsif ($char eq '.') { -                    $skip = 1; -                } -                # C and D force the matching operator -                if ($char eq 'C') { -                    $operator = 'c'; -                } elsif ($char eq 'D') { -                    $operator = 'd'; -                } +        if ($skip) { +            print "Skipping movement and operator." if DEBUG; +        } else { +            # Make sure count is at least 1. +            if (not $numeric_prefix) { +                $numeric_prefix = 1;              } -            if ($skip) { -                print "Skipping movement and operator." if DEBUG; +            # Execute the movement (multiple times). +            my $cur_pos = _input_pos(); +            if (not $movement) { +                $movements->{$char}->{func}->($numeric_prefix, $cur_pos);              } else { -                # Make sure count is at least 1. -                if (not $numeric_prefix) { -                    $numeric_prefix = 1; -                } - -                # Execute the movement (multiple times). -                my $cur_pos = _input_pos(); -                if (not $movement) { -                    $movements->{$char}->{func}->($numeric_prefix, $cur_pos); -                } else { -                    # Use the real movement command (like t or f) for operator -                    # below. -                    $char = substr $movement, 0, 1; -                    $movements->{$char}->{func} -                              ->($numeric_prefix, $cur_pos, substr $movement, 1); -                } -                my $new_pos = _input_pos(); - -                # If we have an operator pending then run it on the handled -                # text. But only if the movement changed the position (this -                # prevents problems with e.g. f when the search string doesn't -                # exist). -                if ($operator and $cur_pos != $new_pos) { -                    print "Processing operator: ", $operator if DEBUG; -                    $operators->{$operator}->{func}->($cur_pos, $new_pos, $char); -                } - -                # Store command, necessary for . But ignore movements and -                # registers. -                if ($operator or $char eq 'x' or $char eq 'X' or $char eq 'r' -                              or $char eq 'p' or $char eq 'P' or -                                 $char eq 'C' or $char eq 'D' or -                                 $char eq '~' or $char eq '"') { -                    $last->{char} = $char; -                    $last->{numeric_prefix} = $numeric_prefix; -                    $last->{operator} = $operator; -                    $last->{movement} = $movement; -                    $last->{register} = $register; -                } +                # Use the real movement command (like t or f) for operator +                # below. +                $char = substr $movement, 0, 1; +                $movements->{$char}->{func} +                            ->($numeric_prefix, $cur_pos, substr $movement, 1);              } - -            $numeric_prefix = undef; -            $operator = undef; -            $movement = undef; - -            if ($char ne '"' and $register ne '"') { -                print 'Changing register to "' if DEBUG; -                $register = '"'; +            my $new_pos = _input_pos(); + +            # If we have an operator pending then run it on the handled text. +            # But only if the movement changed the position (this prevents +            # problems with e.g. f when the search string doesn't exist). +            if ($operator and $cur_pos != $new_pos) { +                print "Processing operator: ", $operator if DEBUG; +                $operators->{$operator}->{func}->($cur_pos, $new_pos, $char);              } -        # Start Ex mode. -        } elsif ($char eq ':') { -            if (not script_is_loaded('prompt_info')) { -                _warn("Warning: Ex mode requires the 'prompt_info' script. " . -                      "Please load it and try again."); -            } else { -                _update_mode(M_EX); -                _set_prompt(':'); +            # Store command, necessary for . But ignore movements and +            # registers. +            if ($operator or $char eq 'x' or $char eq 'X' or $char eq 'r' or +                             $char eq 'p' or $char eq 'P' or $char eq 'C' or +                             $char eq 'D' or $char eq '~' or $char eq '"') { +                $last->{char} = $char; +                $last->{numeric_prefix} = $numeric_prefix; +                $last->{operator} = $operator; +                $last->{movement} = $movement; +                $last->{register} = $register;              } +        } -        # Enter key sends the current input line in command mode as well. -        } elsif ($key == 10) { -            $should_stop = 0; -            _commit_line(); +        $numeric_prefix = undef; +        $operator = undef; +        $movement = undef; + +        if ($char ne '"' and $register ne '"') { +            print 'Changing register to "' if DEBUG; +            $register = '"';          } -        Irssi::statusbar_items_redraw("vim_mode"); +    # Start Ex mode. +    } elsif ($char eq ':') { +        if (not script_is_loaded('prompt_info')) { +            _warn("Warning: Ex mode requires the 'prompt_info' script. " . +                    "Please load it and try again."); +        } else { +            _update_mode(M_EX); +            _set_prompt(':'); +        } + +    # Enter key sends the current input line in command mode as well. +    } elsif ($key == 10) { +        $should_stop = 0; +        _commit_line();      } +    Irssi::statusbar_items_redraw("vim_mode"); +      _stop() if $should_stop;  } +sub handle_command_ex { +    my ($key) = @_; + +    # DEL key - remove last character +    if ($key == 127) { +        print "Delete" if DEBUG; +        pop @ex_buf; +        _set_prompt(':' . join '', @ex_buf); + +    # Return key - execute command +    } elsif ($key == 10) { +        print "Run ex-mode command" if DEBUG; +        cmd_ex_command(); +        _set_prompt(''); +        @ex_buf = (); +        _update_mode(M_CMD); + +    # Append entered key +    } else { +        push @ex_buf, chr $key; +        _set_prompt(':' . join '', @ex_buf); +    } + +    Irssi::statusbar_items_redraw("vim_windows"); + +    _stop(); +} + +  sub vim_mode_init {      Irssi::signal_add_first 'gui key pressed' => \&got_key;      Irssi::signal_add 'setup changed' => \&setup_changed; | 
