def check(view=None):
    """Perform a linter check on the view
    """
    if view is None:
        view = get_current_active_view()

    if not get_setting('python_linting', view, True):
        return

    filename = file_or_buffer_name(view)
    proxy = proxy_for(view)
    if not proxy:
        return

    lint_settings = {
        'pep8': get_setting('pep8', view, default_value=True),
        'pep8_ignore': get_setting('pep8_ignore', view, default_value=[]),
        'pep8_max_line_length': get_setting(
            'pep8_max_line_length', view, default_value=None),
        'pyflakes_ignore': get_setting(
            'pyflakes_ignore', view, default_value=[]),
    }

    code = view.substr(sublime.Region(0, view.size()))
    encoding = view.encoding()
    if encoding.lower() == "undefined":
        encoding = "utf-8"
    errors = proxy.check_syntax(code, encoding, lint_settings, filename)
    try:
        if errors:
            errors = pickle.loads(errors.data)

        vid = view.id()
        lines = set()

        # leave this here for compatibility with original plugin
        error_underlines[vid] = []
        error_messages[vid] = {}
        violation_underlines[vid] = []
        violation_messages[vid] = {}
        warning_underlines[vid] = []
        warning_messages[vid] = {}

        if errors:
            parse_errors(view, errors, lines, vid)

        erroneous_lines[vid] = ListWithPointer(sorted(set(
            list(error_messages[vid].keys()) +
            list(violation_messages[vid].keys()) +
            list(warning_messages[vid].keys()))))

        # the result can be a list of errors, or single syntax exception
        try:
            _update_lint_marks(view, lines)
        except Exception as e:
            print('SublimePythonIDE: Add lint marks failed\n{0}'.format(e))

        update_statusbar(view)
    except Exception as error:
        print("SublimePythonIDE: No server response\n{0}".format(error))
def _update_lint_marks(view, lines):
    """Update lint marks to view on the given lines.
    """

    style = get_setting('python_linter_mark_style', view, 'outline')
    outline_style = {'none': sublime.HIDDEN}

    _erase_lint_marks(view)

    # for name, underlines in _get_types(view).items():
    #     if len(underlines) > 0:
    #         view.add_regions(
    #             'lint-underline-{name}'.format(name=name),
    #             underlines,
    #             scope_name(name),
    #             flags=sublime.DRAW_EMPTY_AS_OVERWRITE
    #         )

    if len(lines) > 0:
        outlines = _get_outlines(view)

        for lint_type, lints in outlines.items():
            args = [
                'lint-outlines-{0}'.format(lint_type), outlines[lint_type],
                scope_name(lint_type),
                _get_gutter_mark_theme(view, lint_type),
                outline_style.get(style, sublime.DRAW_OUTLINED)
            ]

            view.add_regions(*args)
def _update_lint_marks(view, lines):
    """Update lint marks to view on the given lines.
    """

    style = get_setting('python_linter_mark_style', view, 'outline')
    outline_style = {'none': sublime.HIDDEN}

    _erase_lint_marks(view)

    # for name, underlines in _get_types(view).items():
    #     if len(underlines) > 0:
    #         view.add_regions(
    #             'lint-underline-{name}'.format(name=name),
    #             underlines,
    #             scope_name(name),
    #             flags=sublime.DRAW_EMPTY_AS_OVERWRITE
    #         )

    if len(lines) > 0:
        outlines = _get_outlines(view)

        for lint_type, lints in outlines.items():
            args = [
                'lint-outlines-{0}'.format(lint_type),
                outlines[lint_type],
                scope_name(lint_type),
                _get_gutter_mark_theme(view, lint_type),
                outline_style.get(style, sublime.DRAW_OUTLINED)
            ]

            view.add_regions(*args)
def _get_gutter_mark_theme(view, lint_type):
    """Return the right gutter mark theme icons
    """

    image = ''
    if get_setting('python_linter_gutter_marks', view, True):
        theme = get_setting('python_linter_gutter_marks_theme', view, 'simple')

        image = '{0}-{1}.png'.format(theme, lint_type)
        if theme == 'original':
            image = ORIGINAL_MARK_THEME[lint_type]
        elif theme in MARK_THEMES:
            # this API does not expect OS-specific paths, but only
            # forward-slashes
            image = MARK_THEMES_PATH + '/' + '{0}-{1}.png'.format(
                theme, lint_type)

    return image
def update_statusbar(view):
    """Updates the view status bar
    """
    if get_setting('python_linting', view, True):
        lineno = view.rowcol(view.sel()[0].end())[0] + 0
        errors_msg = _get_lineno_msgs(view, lineno)

        if len(errors_msg) > 0:
            view.set_status('Linter', '; '.join(errors_msg))
        else:
            view.erase_status('Linter')
def _get_gutter_mark_theme(view, lint_type):
    """Return the right gutter mark theme icons
    """

    image = ''
    if get_setting('python_linter_gutter_marks', view, True):
        theme = get_setting(
            'python_linter_gutter_marks_theme', view, 'simple'
        )

        image = '{0}-{1}.png'.format(theme, lint_type)
        if theme == 'original':
            image = ORIGINAL_MARK_THEME[lint_type]
        elif theme in MARK_THEMES:
            # this API does not expect OS-specific paths, but only
            # forward-slashes
            image = MARK_THEMES_PATH + '/' + '{0}-{1}.png'.format(
                theme, lint_type)

    return image
def update_statusbar(view):
    """Updates the view status bar
    """
    if get_setting('python_linting', view, True):
        lineno = view.rowcol(view.sel()[0].end())[0] + 0
        errors_msg = _get_lineno_msgs(view, lineno)

        if len(errors_msg) > 0:
            view.set_status('Linter', '; '.join(errors_msg))
        else:
            view.erase_status('Linter')
    def run(self):
        view = self.window.active_view()
        row, col = view.rowcol(view.sel()[0].a)
        offset = view.text_point(row, col)
        path = file_or_buffer_name(view)
        source = view.substr(sublime.Region(0, view.size()))
        if view.substr(offset) in [u'(', u')']:
            offset = view.text_point(row, col - 1)

        proxy = proxy_for(view)
        if not proxy:
            return
        doc = proxy.documentation(source, root_folder_for(view), path, offset)
        if doc:
            open_pydoc_in_view = get_setting("open_pydoc_in_view")
            if open_pydoc_in_view:
                self.display_docs_in_view(doc)
            else:
                self.display_docs_in_panel(view, doc)
        else:
            word = view.substr(view.word(offset))
            self.notify_no_documentation(view, word)
    def run(self):
        view = self.window.active_view()
        row, col = view.rowcol(view.sel()[0].a)
        offset = view.text_point(row, col)
        path = file_or_buffer_name(view)
        source = view.substr(sublime.Region(0, view.size()))
        if view.substr(offset) in [u'(', u')']:
            offset = view.text_point(row, col - 1)

        proxy = proxy_for(view)
        if not proxy:
            return
        doc = proxy.documentation(source, root_folder_for(view), path, offset)
        if doc:
            open_pydoc_in_view = get_setting("open_pydoc_in_view")
            if open_pydoc_in_view:
                self.display_docs_in_view(doc)
            else:
                self.display_docs_in_panel(view, doc)
        else:
            word = view.substr(view.word(offset))
            self.notify_no_documentation(view, word)
    def display_docs_in_view(self, doc):
        create_view_in_same_group = get_setting("create_view_in_same_group")

        v = self.find_pydoc_view()
        if not v:
            active_group = self.window.active_group()
            if not create_view_in_same_group:
                if self.window.num_groups() == 1:
                    self.window.run_command('new_pane', {'move': False})
                if active_group == 0:
                    self.window.focus_group(1)
                else:
                    self.window.focus_group(active_group - 1)

            self.window.new_file(sublime.TRANSIENT)
            v = self.window.active_view()
            v.set_name("*pydoc*")
            v.set_scratch(True)

        v.set_read_only(False)
        v.run_command("simple_clear_and_insert", {"insert_string": doc})
        v.set_read_only(True)
        self.window.focus_view(v)
    def display_docs_in_view(self, doc):
        create_view_in_same_group = get_setting("create_view_in_same_group")

        v = self.find_pydoc_view()
        if not v:
            active_group = self.window.active_group()
            if not create_view_in_same_group:
                if self.window.num_groups() == 1:
                    self.window.run_command('new_pane', {'move': False})
                if active_group == 0:
                    self.window.focus_group(1)
                else:
                    self.window.focus_group(active_group - 1)

            self.window.new_file(sublime.TRANSIENT)
            v = self.window.active_view()
            v.set_name("*pydoc*")
            v.set_scratch(True)

        v.set_read_only(False)
        v.run_command("simple_clear_and_insert", {"insert_string": doc})
        v.set_read_only(True)
        self.window.focus_view(v)
def check(view=None):
    """Perform a linter check on the view
    """
    if view is None:
        view = get_current_active_view()

    if not get_setting('python_linting', view, True):
        return

    filename = file_or_buffer_name(view)
    proxy = proxy_for(view)
    if not proxy:
        return

    lint_settings = {
        'pep8':
        get_setting('pep8', view, default_value=True),
        'pep8_ignore':
        get_setting('pep8_ignore', view, default_value=[]),
        'pep8_max_line_length':
        get_setting('pep8_max_line_length', view, default_value=None),
        'pyflakes_ignore':
        get_setting('pyflakes_ignore', view, default_value=[]),
    }

    code = view.substr(sublime.Region(0, view.size()))
    encoding = view.encoding()
    if encoding.lower() == "undefined":
        encoding = "utf-8"
    errors = proxy.check_syntax(code, encoding, lint_settings, filename)
    try:
        if errors:
            errors = pickle.loads(errors.data)

        vid = view.id()
        lines = set()

        # leave this here for compatibility with original plugin
        error_underlines[vid] = []
        error_messages[vid] = {}
        violation_underlines[vid] = []
        violation_messages[vid] = {}
        warning_underlines[vid] = []
        warning_messages[vid] = {}

        if errors:
            parse_errors(view, errors, lines, vid)

        erroneous_lines[vid] = ListWithPointer(
            sorted(
                set(
                    list(error_messages[vid].keys()) +
                    list(violation_messages[vid].keys()) +
                    list(warning_messages[vid].keys()))))

        # the result can be a list of errors, or single syntax exception
        try:
            _update_lint_marks(view, lines)
        except Exception as e:
            print('SublimePythonIDE: Add lint marks failed\n{0}'.format(e))

        update_statusbar(view)
    except Exception as error:
        print("SublimePythonIDE: No server response\n{0}".format(error))