Example #1
0
    def _on_text_keypress(self, event=None):
        if not self.is_visible():
            return None

        if event.keysym in ["Up", "KP_Up"]:
            self._move_selection(-1)
            return "break"
        elif event.keysym in ["Down", "KP_Down"]:
            self._move_selection(1)
            return "break"
        elif event.keysym in ["Return", "KP_Enter"]:
            assert self._listbox.size() > 0
            self._insert_current_selection()
            return "break"
        elif event.keysym == "Tab":
            assert self._listbox.size() > 0
            self._insert_current_selection_replace_suffix()
            return "break"
        elif event.keysym in [
                "BackSpace", "Left", "Right", "KP_Left", "KP_Right"
        ]:
            self.after_idle(
                lambda: self._completer.request_completions_for_text(
                    self._target_text_widget))
        elif (event.char and not _is_python_name_char(event.char)
              and event.char != "." and not control_is_pressed(event)):
            self.hide(event)

        return None
Example #2
0
def goto_definition(event):
    if not control_is_pressed(event.state):
        return

    assert isinstance(event.widget, tk.Text)
    text = event.widget

    source = text.get("1.0", "end")
    index = text.index("insert")
    index_parts = index.split(".")
    line, column = int(index_parts[0]), int(index_parts[1])
    try:
        editor = text.master.home_widget
        path = editor.get_filename()
    except Exception as e:
        logger.warning("Could not get path", exc_info=e)
        path = None

    defs = jedi_utils.get_definitions(source, line, column, path)
    if len(defs) > 0:
        # TODO: handle multiple results like PyCharm
        module_path = str(defs[0].module_path)
        if not os.path.isfile(module_path):
            logger.warning("%s is not a file", module_path)
            return

        module_name = defs[0].module_name
        line = defs[0].line
        if module_path and line is not None:
            get_workbench().get_editor_notebook().show_file(module_path, line)
        elif module_name == "" and line is not None:  # current editor
            get_workbench().get_editor_notebook().get_current_editor(
            ).select_range(line)
Example #3
0
def goto_definition(event):
    if not control_is_pressed(event.state):
        return

    assert isinstance(event.widget, tk.Text)
    text = event.widget

    source = text.get("1.0", "end")
    index = text.index("insert")
    index_parts = index.split(".")
    line, column = int(index_parts[0]), int(index_parts[1])
    # TODO: find current editor filename
    from jedi import Script

    script = Script(source, line=line, column=column, path="")
    defs = script.goto_definitions()
    if len(defs) > 0:
        module_path = defs[0].module_path
        module_name = defs[0].module_name
        line = defs[0].line
        if module_path and line is not None:
            get_workbench().get_editor_notebook().show_file(module_path, line)
        elif module_name == "" and line is not None:  # current editor
            get_workbench().get_editor_notebook().get_current_editor(
            ).select_range(line)
Example #4
0
    def _patched_perform_return(self, event):
        text = event.widget
        ranges = text.tag_ranges("CURRENT_CELL")

        if len(ranges) == 2 and (ui_utils.shift_is_pressed(event.state)
                                 or ui_utils.control_is_pressed(event.state)):

            if run_enabled():
                code = text.get(ranges[0], ranges[1]).strip()
                _submit_code(code)

                if ui_utils.shift_is_pressed(event.state):
                    # advance to next cell
                    text.mark_set("insert", ranges[1])

            return "break"
        else:
            return original_perform_return(self, event)
Example #5
0
    def _check_trigger_keypress(self, event: tk.Event) -> None:
        runner = get_runner()
        if not runner or runner.is_running():
            return

        if (control_is_pressed(event) or command_is_pressed(event)
                or alt_is_pressed_without_char(event)):
            return

        widget = event.widget
        if not widget or not isinstance(widget, SyntaxText):
            return

        if not widget.is_python_text():
            return

        if widget.is_read_only():
            return

        if (not get_workbench().get_option("edit.automatic_completions")
                and not self._box_is_visible()):
            return

        if event.keysym == "Escape":
            # Closing is handled by the box itself
            return

        if not event.char:
            # movement keypresses are handled by the box
            return

        if (not self._box_is_visible() and not _is_python_name_char(event.char)
                and not self._is_start_of_an_attribute(event)):
            # non-word chars are allowed only while the box is already open
            return

        widget.after_idle(lambda: self.request_completions_for_text(widget))
Example #6
0
 def proper_modifier_is_pressed(self, event: tk.Event) -> bool:
     if running_on_mac_os():
         return command_is_pressed(event)
     else:
         return control_is_pressed(event)