Exemplo n.º 1
0
    def run(self, edit, **vi_cmd_data):
        self.debug("Data in ViRunCommand:", vi_cmd_data)

        try:
            if vi_cmd_data["restore_original_carets"]:
                self.save_caret_pos()

            # XXX: Fix this. When should we run the motion exactly?
            if vi_cmd_data["action"]:
                # If no motion is present, we know we just have to run the action (like ctrl+w, v).
                if (vi_cmd_data["motion"]) or (
                    vi_cmd_data["motion_required"] and not view.has_non_empty_selection_region()
                ):
                    self.enter_visual_mode_if_needed(vi_cmd_data)
                    self.do_whole_motion(vi_cmd_data)

                # The motion didn't change the selections: abort action if so required.
                # TODO: What to do with .post_action() and .do_follow_up_mode() in this event?
                if (
                    vi_cmd_data["mode"] == _MODE_INTERNAL_NORMAL
                    and all([v.empty() for v in self.view.sel()])
                    and vi_cmd_data["cancel_action_if_motion_fails"]
                ):
                    return

                self.do_action(vi_cmd_data)
            else:
                self.do_whole_motion(vi_cmd_data)

        finally:
            # XXX: post_action should be run only if do_action succeeds (?).
            self.do_post_action(vi_cmd_data)

            if vi_cmd_data["must_update_xpos"]:
                state = VintageState(self.view)

                first_sel = self.view.sel()[0]
                xpos = 0
                if state.mode == MODE_VISUAL:
                    if first_sel.a < first_sel.b:
                        xpos = self.view.rowcol(first_sel.b - 1)[1]
                    elif first_sel.a > first_sel.b:
                        xpos = self.view.rowcol(first_sel.b)[1]

                elif state.mode == MODE_NORMAL:
                    xpos = self.view.rowcol(first_sel.b)[1]

                state.xpos = xpos

            self.do_modify_selections(vi_cmd_data)
            self.do_follow_up_mode(vi_cmd_data)

            if vi_cmd_data["scroll_into_view"]:
                # TODO: If moving by lines, scroll the minimum amount to display the new sels.
                self.view.show(self.view.sel()[0])

            state = VintageState(self.view)
            state.reset(next_mode=vi_cmd_data["next_mode"])
Exemplo n.º 2
0
    def run(self, edit, **vi_cmd_data):
        print("Data in ViRunCommand:", vi_cmd_data)

        try:
            if vi_cmd_data['restore_original_carets']:
                self.save_caret_pos()

            # XXX: Fix this. When should we run the motion exactly?
            if vi_cmd_data['action']:
                if ((vi_cmd_data['motion']) or
                    (vi_cmd_data['motion_required'] and
                     not view.has_non_empty_selection_region())):
                        self.enter_visual_mode(vi_cmd_data)
                        self.do_whole_motion(vi_cmd_data)

                # The motion didn't change the selections: abort action if so required.
                # TODO: What to do with .post_action() and .do_follow_up_mode() in this event?
                if (vi_cmd_data['mode'] == _MODE_INTERNAL_NORMAL and
                    all([v.empty() for v in self.view.sel()]) and
                    vi_cmd_data['cancel_action_if_motion_fails']):
                        return

                self.do_action(vi_cmd_data)
            else:
                self.do_whole_motion(vi_cmd_data)
        finally:
            self.do_post_action(vi_cmd_data)
            self.do_follow_up_mode(vi_cmd_data)

            if vi_cmd_data['must_update_xpos']:
                state = VintageState(self.view)
                first_sel = self.view.sel()[0]

                xpos = 0
                if state.mode == MODE_VISUAL:
                    if first_sel.a < first_sel.b:
                        xpos = self.view.rowcol(first_sel.b - 1)[1]
                    elif first_sel.a > first_sel.b:
                        xpos = self.view.rowcol(first_sel.b)[1]

                elif state.mode == MODE_NORMAL:
                    xpos = self.view.rowcol(first_sel.b)[1]

                state.xpos = xpos

            if vi_cmd_data['scroll_into_view']:
                # TODO: If moving by lines, scroll the minimum amount to display the new sels.
                self.view.show(self.view.sel()[0])