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 _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 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 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))