Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Took 2 minutes to respond to on_hover(), from 15:56:14 until 15:58:38 #257

Open
evandrocoan opened this issue Feb 4, 2018 · 7 comments
Open

Comments

@evandrocoan
Copy link
Contributor

evandrocoan commented Feb 4, 2018

Originally posted on: sublimelsp/LSP#255 python-language-server hanged Sublime Text by several seconds on file close event

@tomv564 sublimelsp/LSP#255 (comment) If it is the linter causing the slowness, I also don't believe that should stop pyls from responding to other requests.

This caused the LSP plugin for Sublime Text to hang completely for the 2 minutes the server did not responded to the on_hover request. I do not think there is an issue here if that is what does take to compute everything. Unless it doesn't.

This was the LSP for Sublime Text log. Sadly it does not have the timestamp. I am going to open a feature request for:

LSP: initialize on open 2 F:\SublimeText\Data\Packages\LSP\plugin\core\clients.py
LSP: initialize on open 2 F:\SublimeText\Data\Packages\LSP\plugin\core\clients.py
LSP:  --> textDocument/hover
LSP:  --> textDocument/didChange
LSP:  --> textDocument/signatureHelp
LSP:  --> textDocument/didChange
LSP: <--  textDocument/publishDiagnostics
LSP:  --> textDocument/didChange
LSP: <--  textDocument/publishDiagnostics
LSP:  --> textDocument/hover
LSP: initialize on open 2 F:\SublimeText\Data\Packages\LSP\plugin\core\clients.py
LSP: initialize on open 2 F:\SublimeText\Data\Packages\LSP\plugin\core\clients.py
LSP:  --> textDocument/didChange
LSP: <--  textDocument/publishDiagnostics
LSP:  --> textDocument/hover
LSP:  --> textDocument/hover
LSP:  --> textDocument/completion
LSP:  --> textDocument/didChange
LSP:  --> textDocument/hover
LSP: <--  textDocument/publishDiagnostics
LSP: initialize on open 2 F:\SublimeText\Data\Packages\LSP\plugin\core\clients.py

Log:

2018-02-04 15:56:14,325 DEBUG pyls.config.config:processmessage:137   pyls_completions [hook]
      config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [<module 'pyls.plugins.pycodestyle_lint' from 'd:\\user\\dropbox\\softwareversioning\\python-language-server\\pyls\\plugins\\pycodestyle_lint.py'>], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
      workspace: Workspace. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _root_uri_scheme: file, _lang_server: PythonLanguageServer. config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [<module 'pyls.plugins.pycodestyle_lint' from 'd:\\user\\dropbox\\softwareversioning\\python-language-server\\pyls\\plugins\\pycodestyle_lint.py'>], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): [], _dispatchers: [], __rope: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': <bound method _ResourceMatcher.set_patterns of <rope.base.resources._ResourceMatcher object at 0x00000208BD610A90>>}, _docs(file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py): Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 4, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': <bound method _ResourceMatcher.set_patterns of <rope.base.resources._ResourceMatcher object at 0x00000208BD610A90>>}
      document: Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 4, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': <bound method _ResourceMatcher.set_patterns of <rope.base.resources._ResourceMatcher object at 0x00000208BD610A90>>}
      position: {'line': 49, 'character': 20}

2018-02-04 15:58:37,344 DEBUG pyls.config.config:processmessage:137   finish pyls_completions --> [[{'label': 'self', 'kind': 18, 'detail': 'local self', 'documentation': '', 'sortText': 'aself'}, {'label': 'set_config_ready', 'kind': 3, 'detail': 'global set_config_ready', 'documentation': '', 'sortText': 'aset_config_ready'}, {'label': 'set_config_starting', 'kind': 3, 'detail': 'global set_config_starting', 'documentation': '', 'sortText': 'aset_config_starting'}, {'label': 'set_config_stopping', 'kind': 3, 'detail': 'global set_config_stopping', 'documentation': '', 'sortText': 'aset_config_stopping'}, {'label': 'sublime', 'kind': 9, 'detail': 'imported sublime', 'documentation': '', 'sortText': 'asublime'}, {'label': 'set', 'kind': 7, 'detail': 'builtin set', 'documentation': 'set() -> new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.', 'sortText': 'yset'}, {'label': 'slice', 'kind': 7, 'detail': 'builtin slice', 'documentation': 'slice(stop)\nslice(start, stop[, step])\n\nCreate a slice object.  This is used for extended slicing (e.g. a[0:10:2]).', 'sortText': 'yslice'}, {'label': 'staticmethod', 'kind': 7, 'detail': 'builtin staticmethod', 'documentation': 'staticmethod(function) -> method\n\nConvert a function to be a static method.\n\nA static method does not receive an implicit first argument.\nTo declare a static method, use this idiom:\n\n     class C:\n         @staticmethod\n         def f(arg1, arg2, ...):\n             ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()).  The instance is ignored except for its class.\n\nStatic methods in Python are similar to those found in Java or C++.\nFor a more advanced concept, see the classmethod builtin.', 'sortText': 'ystaticmethod'}, {'label': 'str', 'kind': 7, 'detail': 'builtin str', 'documentation': "str(object='') -> str\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\n\nCreate a new string object from the given object. If encoding or\nerrors is specified, then the object must expose a data buffer\nthat will be decoded using the given encoding and error handler.\nOtherwise, returns the result of object.__str__() (if defined)\nor repr(object).\nencoding defaults to sys.getdefaultencoding().\nerrors defaults to 'strict'.", 'sortText': 'ystr'}, {'label': 'setattr', 'kind': 3, 'detail': 'builtin setattr', 'documentation': "Sets the named attribute on the given object to the specified value.\n\nsetattr(x, 'y', v) is equivalent to ``x.y = v''", 'sortText': 'ysetattr'}, {'label': 'sorted', 'kind': 3, 'detail': 'builtin sorted', 'documentation': 'Return a new list containing all items from the iterable in ascending order.\n\nA custom key function can be supplied to customize the sort order, and the\nreverse flag can be set to request the result in descending order.', 'sortText': 'ysorted'}, {'label': 'sum', 'kind': 3, 'detail': 'builtin sum', 'documentation': "Return the sum of a 'start' value (default: 0) plus an iterable of numbers\n\nWhen the iterable is empty, return the start value.\nThis function is intended specifically for use with numeric values and may\nreject non-numeric types.", 'sortText': 'ysum'}, {'label': 'super', 'kind': 3, 'detail': 'builtin super', 'documentation': 'super() -> same as super(__class__, <first argument>)\nsuper(type) -> unbound super object\nsuper(type, obj) -> bound super object; requires isinstance(obj, type)\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\nTypical use to call a cooperative superclass method:\nclass C(B):\n    def meth(self, arg):\n        super().meth(arg)\nThis works for class methods too:\nclass C(B):\n    @classmethod\n    def cmeth(cls, arg):\n        super().cmeth(arg)\n', 'sortText': 'ysuper'}], [{'label': 'self', 'kind': 6, 'detail': '__main__.has_client_with_capability', 'documentation': "LspTextCommand(self, view, capability='')\n\n", 'sortText': 'aself', 'insertText': 'self'}, {'label': 'Set', 'kind': 7, 'detail': '__main__', 'documentation': '', 'sortText': 'aSet', 'insertText': 'Set'}, {'label': 'set', 'kind': 7, 'detail': '', 'documentation': 'set() -> new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.', 'sortText': 'aset', 'insertText': 'set'}, {'label': 'set_config_ready(window, config_name, client)', 'kind': 3, 'detail': '__main__', 'documentation': "set_config_ready(window: sublime.Window, config_name: str, client:\n'Client')\n\n", 'sortText': 'aset_config_ready', 'insertText': 'set_config_ready'}, {'label': 'set_config_starting(window, config_name)', 'kind': 3, 'detail': '__main__', 'documentation': 'set_config_starting(window: sublime.Window, config_name: str)\n\n', 'sortText': 'aset_config_starting', 'insertText': 'set_config_starting'}, {'label': 'set_config_stopping(window, config_name)', 'kind': 3, 'detail': '__main__', 'documentation': 'set_config_stopping(window: sublime.Window, config_name: str)\n\n', 'sortText': 'aset_config_stopping', 'insertText': 'set_config_stopping'}, {'label': 'setattr(obj, name, value)', 'kind': 3, 'detail': '', 'documentation': "Sets the named attribute on the given object to the specified value.\n\nsetattr(x, 'y', v) is equivalent to ``x.y = v''", 'sortText': 'asetattr', 'insertText': 'setattr'}, {'label': 'slice', 'kind': 7, 'detail': '', 'documentation': 'slice(stop)\nslice(start, stop[, step])\n\nCreate a slice object.\xa0\xa0This is used for extended slicing (e.g. a[0:10:2]).', 'sortText': 'aslice', 'insertText': 'slice'}, {'label': 'sorted(iterable, cmp, key, reverse)', 'kind': 3, 'detail': '', 'documentation': "sorted(iterable, cmp=None, key=None, reverse=False)\n\nBuilt-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", 'sortText': 'asorted', 'insertText': 'sorted'}, {'label': 'staticmethod', 'kind': 7, 'detail': '', 'documentation': 'staticmethod(function) -> method\n\nConvert a function to be a static method.\n\nA static method does not receive an implicit first argument.\nTo declare a static method, use this idiom:\n\n\xa0\xa0\xa0\xa0 class C:\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0 @staticmethod\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0 def f(arg1, arg2, ...):\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0 ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()).\xa0\xa0The instance is ignored except for its class.\n\nStatic methods in Python are similar to those found in Java or C++.\nFor a more advanced concept, see the classmethod builtin.', 'sortText': 'astaticmethod', 'insertText': 'staticmethod'}, {'label': 'StopAsyncIteration', 'kind': 7, 'detail': '', 'documentation': 'Signal the end from iterator.__anext__().', 'sortText': 'aStopAsyncIteration', 'insertText': 'StopAsyncIteration'}, {'label': 'StopIteration', 'kind': 7, 'detail': '', 'documentation': 'Signal the end from iterator.__next__().', 'sortText': 'aStopIteration', 'insertText': 'StopIteration'}, {'label': 'str', 'kind': 7, 'detail': '', 'documentation': "str(object='') -> str\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\n\nCreate a new string object from the given object. If encoding or\nerrors is specified, then the object must expose a data buffer\nthat will be decoded using the given encoding and error handler.\nOtherwise, returns the result of object.__str__() (if defined)\nor repr(object).\nencoding defaults to sys.getdefaultencoding().\nerrors defaults to 'strict'.", 'sortText': 'astr', 'insertText': 'str'}, {'label': 'sublime', 'kind': 9, 'detail': '__main__', 'documentation': '', 'sortText': 'asublime', 'insertText': 'sublime'}, {'label': 'sum(iterable, start)', 'kind': 3, 'detail': '', 'documentation': "Return the sum of a 'start' value (default: 0) plus an iterable of numbers\n\nWhen the iterable is empty, return the start value.\nThis function is intended specifically for use with numeric values and may\nreject non-numeric types.", 'sortText': 'asum', 'insertText': 'sum'}, {'label': 'super', 'kind': 7, 'detail': '', 'documentation': 'super() -> same as super(__class__, <first argument>)\nsuper(type) -> unbound super object\nsuper(type, obj) -> bound super object; requires isinstance(obj, type)\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\nTypical use to call a cooperative superclass method:\nclass C(B):\n\xa0\xa0\xa0\xa0def meth(self, arg):\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0super().meth(arg)\nThis works for class methods too:\nclass C(B):\n\xa0\xa0\xa0\xa0@classmethod\n\xa0\xa0\xa0\xa0def cmeth(cls, arg):\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0super().cmeth(arg)', 'sortText': 'asuper', 'insertText': 'super'}, {'label': 'SyntaxError', 'kind': 7, 'detail': '', 'documentation': 'Invalid syntax.', 'sortText': 'aSyntaxError', 'insertText': 'SyntaxError'}, {'label': 'SyntaxWarning', 'kind': 7, 'detail': '', 'documentation': 'Base class for warnings about dubious syntax.', 'sortText': 'aSyntaxWarning', 'insertText': 'SyntaxWarning'}, {'label': 'SystemError', 'kind': 7, 'detail': '', 'documentation': 'Internal error in the Python interpreter.\n\nPlease report this to the Python maintainer, along with the traceback,\nthe Python version, and the hardware/OS platform and version.', 'sortText': 'aSystemError', 'insertText': 'SystemError'}, {'label': 'SystemExit', 'kind': 7, 'detail': '', 'documentation': 'Request to exit from the interpreter.', 'sortText': 'aSystemExit', 'insertText': 'SystemExit'}]] [hook]

2018-02-04 15:58:37,349 DEBUG pyls.server:handle:35 Got message: b'{"jsonrpc": "2.0", "method": "textDocument/didChange", "params": {"textDocument": {"uri": "file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py", "version": 5}, "contentChanges": [{"text": "import sublime\\n\\nfrom sublime_plugin import TextCommand\\n\\nfrom .logging import debug, exception_log\\nfrom .configurations import config_for_scope, is_supported_view\\nfrom .protocol import Request\\nfrom .workspace import get_project_path\\n\\n# typing only\\nfrom .rpc import Client\\nfrom .settings import ClientConfig\\nassert Client and ClientConfig\\n\\n\\ntry:\\n    from typing import Any, List, Dict, Tuple, Callable, Optional, Set\\n    assert Any and List and Dict and Tuple and Callable and Optional and Set\\nexcept ImportError:\\n    pass\\n\\n\\nclients_by_window = {}  # type: Dict[int, Dict[str, ConfigState]]\\n\\n\\nclass ClientStates(object):\\n    STARTING = 0\\n    READY = 1\\n    STOPPING = 2\\n\\n\\nclass ConfigState(object):\\n\\n    def __init__(self, state=ClientStates.STARTING, client=None):\\n        self.state = state\\n        self.client = client\\n\\n\\nclass LspTextCommand(TextCommand):\\n    def __init__(self, view, capability=\'\'):\\n        super().__init__(view)\\n        self.capability = capability\\n\\n    def is_visible(self):\\n        return is_supported_view(self.view)\\n\\n    def has_client_with_capability(self):\\n        client = client_for_view(self.view)\\n        if client and client.has_capability(self.capability):\\n            return tr\\n        return False\\n\\n\\ndef window_configs(window: sublime.Window) -> \'Dict[str, ConfigState]\':\\n    if window.id() in clients_by_window:\\n        return clients_by_window[window.id()]\\n    else:\\n        # debug(\\"no configs found for window\\", window.id())\\n        return {}\\n\\n\\ndef is_ready_window_config(window: sublime.Window, config_name: str):\\n    configs = window_configs(window)\\n\\n    if config_name not in configs:\\n        return False\\n\\n    if configs[config_name].state == ClientStates.READY:\\n        return True\\n\\n    return False\\n\\n\\n# Startup\\n\\ndef can_start_config(window: sublime.Window, config_name: str):\\n    return config_name not in window_configs(window)\\n\\n\\ndef set_config_starting(window: sublime.Window, config_name: str):\\n    clients_by_window.setdefault(window.id(), {})[config_name] = ConfigState()\\n\\n\\ndef clear_config_state(window: sublime.Window, config_name: str):\\n    configs = window_configs(window)\\n    del configs[config_name]\\n\\n\\ndef set_config_ready(window: sublime.Window, config_name: str, client: \'Client\'):\\n    window_configs(window)[config_name] = ConfigState(ClientStates.READY, client)\\n    debug(\\"{} client registered for window {}\\".format(config_name, window.id()))\\n\\n\\ndef set_config_stopping(window: sublime.Window, config_name: str):\\n    window_configs(window)[config_name].state = ClientStates.STOPPING\\n\\n\\ndef client_for_closed_view(view: sublime.View) -> \'Optional[Client]\':\\n    return _client_for_view_and_window(view, sublime.active_window())\\n\\n\\ndef client_for_view(view: sublime.View) -> \'Optional[Client]\':\\n    return _client_for_view_and_window(view, view.window())\\n\\n\\ndef _client_for_view_and_window(view: sublime.View, window: \'Optional[sublime.Window]\') -> \'Optional[Client]\':\\n    if not window:\\n        debug(\\"no window for view\\", view.file_name())\\n        return None\\n\\n    config = config_for_scope(view)\\n    if not config:\\n        debug(\\"config not available for view\\", view.file_name())\\n        return None\\n\\n    window_config_states = window_configs(window)\\n    if config.name not in window_config_states:\\n        debug(config.name, \\"not available for view\\",\\n              view.file_name(), \\"in window\\", window.id())\\n        return None\\n    else:\\n        config_state = window_config_states[config.name]\\n        if config_state.client:\\n            return config_state.client\\n        else:\\n            debug(config.name, \\"in state\\", config_state.state, \\" for view\\",\\n                  view.file_name(), \\"in window\\", window.id())\\n            return None\\n\\n\\n# Shutdown\\n\\ndef remove_window_client(window: sublime.Window, config_name: str):\\n    del clients_by_window[window.id()][config_name]\\n\\n\\ndef unload_all_clients():\\n    for window in sublime.windows():\\n        for config_name, config_state in window_configs(window).items():\\n            if config_state.client:\\n                if config_state.state == ClientStates.STARTING:\\n                    unload_client(config_state.client, window.id(), config_name)\\n                else:\\n                    debug(\'ignoring unload of config in state\', config_state.state)\\n            else:\\n                debug(\'ignoring unload of config without client\')\\n\\n\\nclosing_window_ids = set()  # type: Set[int]\\n\\n\\ndef check_window_unloaded():\\n    global clients_by_window\\n    open_window_ids = list(window.id() for window in sublime.windows())\\n    iterable_clients_by_window = clients_by_window.copy()\\n    for id, window_clients in iterable_clients_by_window.items():\\n        if id not in open_window_ids and window_clients:\\n            if id not in closing_window_ids:\\n                closing_window_ids.add(id)\\n                debug(\\"window closed\\", id)\\n    for closed_window_id in closing_window_ids:\\n        unload_window_clients(closed_window_id)\\n    closing_window_ids.clear()\\n\\n\\ndef unload_window_clients(window_id: int):\\n    if window_id in clients_by_window:\\n        window_configs = clients_by_window[window_id]\\n        for config_name, state in window_configs.items():\\n            window_configs[config_name].state = ClientStates.STOPPING\\n            debug(\\"unloading client\\", config_name, state.client)\\n            unload_client(state.client, window_id, config_name)\\n\\n\\ndef unload_old_clients(window: sublime.Window):\\n    project_path = get_project_path(window)\\n    configs = window_configs(window)\\n    clients_to_unload = {}\\n    for config_name, state in configs.items():\\n        if state.client and state.state == ClientStates.READY and state.client.get_project_path() != project_path:\\n            debug(\'unload\', config_name, \'project path changed from\',\\n                  state.client.get_project_path(), \'to\', project_path)\\n            clients_to_unload[config_name] = state.client\\n\\n    for config_name, client in clients_to_unload.items():\\n        set_config_stopping(window, config_name)\\n        unload_client(client, window.id(), config_name)\\n\\n\\nclients_unloaded_handler = None  # type: Optional[Callable]\\n\\n\\ndef register_clients_unloaded_handler(handler: \'Callable\'):\\n    global clients_unloaded_handler\\n    clients_unloaded_handler = handler\\n\\n\\ndef on_shutdown(client: Client, window_id: int, config_name: str, response):\\n    try:\\n        client.exit()\\n        del clients_by_window[window_id][config_name]\\n\\n        if not clients_by_window[window_id]:\\n            debug(\\"all clients unloaded\\")\\n            if clients_unloaded_handler:\\n                clients_unloaded_handler(window_id)\\n\\n    except Exception as err:\\n        exception_log(\\"Error exiting server\\", err)\\n\\n\\ndef unload_client(client: Client, window_id: int, config_name: str):\\n    client.send_request(Request.shutdown(), lambda response: on_shutdown(client, window_id, config_name, response))\\n"}]}}'
2018-02-04 15:58:37,364 DEBUG pyls.server:handle:35 Got message: b'{"jsonrpc": "2.0", "id": 25, "method": "textDocument/hover", "params": {"textDocument": {"uri": "file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py"}, "position": {"line": 48, "character": 11}}}'
2018-02-04 15:58:37,368 DEBUG pyls.python_ls:_hook:48 PythonLanguageServer, self.config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [<module 'pyls.plugins.pycodestyle_lint' from 'd:\\user\\dropbox\\softwareversioning\\python-language-server\\pyls\\plugins\\pycodestyle_lint.py'>], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
2018-02-04 15:58:37,376 DEBUG pyls.config.config:processmessage:137   pyls_hover [hook]
      config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [<module 'pyls.plugins.pycodestyle_lint' from 'd:\\user\\dropbox\\softwareversioning\\python-language-server\\pyls\\plugins\\pycodestyle_lint.py'>], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
      workspace: Workspace. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _root_uri_scheme: file, _lang_server: PythonLanguageServer. config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [<module 'pyls.plugins.pycodestyle_lint' from 'd:\\user\\dropbox\\softwareversioning\\python-language-server\\pyls\\plugins\\pycodestyle_lint.py'>], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): [], _dispatchers: [], __rope: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': <bound method _ResourceMatcher.set_patterns of <rope.base.resources._ResourceMatcher object at 0x00000208BD610A90>>}, _docs(file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py): Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 5, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': <bound method _ResourceMatcher.set_patterns of <rope.base.resources._ResourceMatcher object at 0x00000208BD610A90>>}
      document: Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 5, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': <bound method _ResourceMatcher.set_patterns of <rope.base.resources._ResourceMatcher object at 0x00000208BD610A90>>}
      position: {'line': 48, 'character': 11}

2018-02-04 15:58:37,392 DEBUG parso.python.diff:update:121 diff parser start
2018-02-04 15:58:37,397 DEBUG parso.python.diff:update:132 diff parser calculated
2018-02-04 15:58:37,410 DEBUG parso.python.diff:update:133 diff: line_lengths old: 214, new: 214
2018-02-04 15:58:37,414 DEBUG parso.python.diff:update:137 diff equal old[1:49] new[1:49]
2018-02-04 15:58:37,418 DEBUG parso.python.diff:_copy_from_old_parser:208 diff actually copy 1 to 48
2018-02-04 15:58:37,441 DEBUG parso.python.diff:_parse:257 parse_part from 49 to 51 (to 51 in part parser)
2018-02-04 15:58:37,445 DEBUG parso.python.diff:update:137 diff replace old[50:50] new[50:50]
2018-02-04 15:58:37,447 DEBUG parso.python.diff:update:137 diff equal old[51:214] new[51:214]
2018-02-04 15:58:37,459 DEBUG parso.python.diff:_copy_from_old_parser:208 diff actually copy 52 to 213
2018-02-04 15:58:37,463 DEBUG parso.python.diff:update:166 diff parser end
2018-02-04 15:58:37,874 DEBUG pyls.python_ls:_hook:48 PythonLanguageServer, self.config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [<module 'pyls.plugins.pycodestyle_lint' from 'd:\\user\\dropbox\\softwareversioning\\python-language-server\\pyls\\plugins\\pycodestyle_lint.py'>], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
2018-02-04 15:58:37,883 DEBUG pyls.config.config:processmessage:137     pyls_lint [hook]
        config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [<module 'pyls.plugins.pycodestyle_lint' from 'd:\\user\\dropbox\\softwareversioning\\python-language-server\\pyls\\plugins\\pycodestyle_lint.py'>], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
        workspace: Workspace. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _root_uri_scheme: file, _lang_server: PythonLanguageServer. config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [<module 'pyls.plugins.pycodestyle_lint' from 'd:\\user\\dropbox\\softwareversioning\\python-language-server\\pyls\\plugins\\pycodestyle_lint.py'>], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): [], _dispatchers: [], __rope: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': <bound method _ResourceMatcher.set_patterns of <rope.base.resources._ResourceMatcher object at 0x00000208BD610A90>>}, _docs(file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py): Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 5, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': <bound method _ResourceMatcher.set_patterns of <rope.base.resources._ResourceMatcher object at 0x00000208BD610A90>>}
        document: Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 5, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': <bound method _ResourceMatcher.set_patterns of <rope.base.resources._ResourceMatcher object at 0x00000208BD610A90>>}

2018-02-04 15:58:38,271 DEBUG pyls.config.config:processmessage:137     finish pyls_hover --> [hook]
        contents: 

2018-02-04 15:58:38,375 DEBUG pyls.plugins.pydocstyle_lint:pyls_lint:46 Got pydocstyle errors: [{'source': 'pydocstyle', 'code': 'D100', 'message': 'D100: Missing docstring in public module', 'severity': 2, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 0, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 25, 'character': 0}, 'end': {'line': 25, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 31, 'character': 0}, 'end': {'line': 31, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 33, 'character': 0}, 'end': {'line': 33, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 38, 'character': 0}, 'end': {'line': 38, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 39, 'character': 0}, 'end': {'line': 39, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 43, 'character': 0}, 'end': {'line': 43, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 46, 'character': 0}, 'end': {'line': 46, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 53, 'character': 0}, 'end': {'line': 53, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 61, 'character': 0}, 'end': {'line': 61, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 75, 'character': 0}, 'end': {'line': 75, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 79, 'character': 0}, 'end': {'line': 79, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 83, 'character': 0}, 'end': {'line': 83, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 88, 'character': 0}, 'end': {'line': 88, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 93, 'character': 0}, 'end': {'line': 93, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 97, 'character': 0}, 'end': {'line': 97, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 101, 'character': 0}, 'end': {'line': 101, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 132, 'character': 0}, 'end': {'line': 132, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 136, 'character': 0}, 'end': {'line': 136, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 151, 'character': 0}, 'end': {'line': 151, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 165, 'character': 0}, 'end': {'line': 165, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 174, 'character': 0}, 'end': {'line': 174, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 192, 'character': 0}, 'end': {'line': 192, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 197, 'character': 0}, 'end': {'line': 197, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 211, 'character': 0}, 'end': {'line': 211, 'character': 15}}}]
2018-02-04 15:58:38,381 DEBUG pyls.config.source:read_config_from_files:52 Using cached configuration for ()
2018-02-04 15:58:38,409 DEBUG pyls.config.config:settings:87 Got user config from PyCodeStyleConfig: {}
2018-02-04 15:58:38,412 DEBUG pyls.config.config:settings:89 With user configuration: {}
2018-02-04 15:58:38,423 DEBUG pyls.config.config:settings:92 With plugin configuration: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}
2018-02-04 15:58:38,427 DEBUG pyls.config.config:settings:95 With lsp configuration: {'plugins': {'rope': {'create_folder': False}, 'rope_completion': {'enabled': False}, 'pycodestyle': {'enabled': False}, 'pydocstyle': {'ignore': ['D202', 'D208'], 'enabled': True}}}
2018-02-04 15:58:38,440 DEBUG pyls.config.source:read_config_from_files:52 Using cached configuration for ()
2018-02-04 15:58:38,447 DEBUG pyls.config.config:settings:100 Got project config from PyCodeStyleConfig: {}
2018-02-04 15:58:38,460 DEBUG pyls.config.config:settings:102 With project configuration: {'plugins': {'rope': {'create_folder': False}, 'rope_completion': {'enabled': False}, 'pycodestyle': {'enabled': False}, 'pydocstyle': {'ignore': ['D202', 'D208'], 'enabled': True}}}
2018-02-04 15:58:38,466 DEBUG pyls.plugins.mccabe_lint:pyls_lint:16 Running mccabe lint with threshold: 15
2018-02-04 15:58:38,508 DEBUG pyls.config.config:processmessage:137   finish pyls_lint --> [[{'source': 'pyflakes', 'range': {'start': {'line': 49, 'character': 19}, 'end': {'line': 49, 'character': 22}}, 'message': "undefined name 'tr'", 'severity': 2}], [{'source': 'pydocstyle', 'code': 'D100', 'message': 'D100: Missing docstring in public module', 'severity': 2, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 0, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 25, 'character': 0}, 'end': {'line': 25, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 31, 'character': 0}, 'end': {'line': 31, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 33, 'character': 0}, 'end': {'line': 33, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 38, 'character': 0}, 'end': {'line': 38, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 39, 'character': 0}, 'end': {'line': 39, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 43, 'character': 0}, 'end': {'line': 43, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 46, 'character': 0}, 'end': {'line': 46, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 53, 'character': 0}, 'end': {'line': 53, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 61, 'character': 0}, 'end': {'line': 61, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 75, 'character': 0}, 'end': {'line': 75, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 79, 'character': 0}, 'end': {'line': 79, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 83, 'character': 0}, 'end': {'line': 83, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 88, 'character': 0}, 'end': {'line': 88, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 93, 'character': 0}, 'end': {'line': 93, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 97, 'character': 0}, 'end': {'line': 97, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 101, 'character': 0}, 'end': {'line': 101, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 132, 'character': 0}, 'end': {'line': 132, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 136, 'character': 0}, 'end': {'line': 136, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 151, 'character': 0}, 'end': {'line': 151, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 165, 'character': 0}, 'end': {'line': 165, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 174, 'character': 0}, 'end': {'line': 174, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 192, 'character': 0}, 'end': {'line': 192, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 197, 'character': 0}, 'end': {'line': 197, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 211, 'character': 0}, 'end': {'line': 211, 'character': 15}}}], []] [hook]

2018-02-04 15:58:38,512 DEBUG pyls.server:notify:81 Sending notification textDocument/publishDiagnostics: {'uri': 'file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py', 'diagnostics': [{'source': 'pyflakes', 'range': {'start': {'line': 49, 'character': 19}, 'end': {'line': 49, 'character': 22}}, 'message': "undefined name 'tr'", 'severity': 2}, {'source': 'pydocstyle', 'code': 'D100', 'message': 'D100: Missing docstring in public module', 'severity': 2, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 0, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 25, 'character': 0}, 'end': {'line': 25, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 31, 'character': 0}, 'end': {'line': 31, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 33, 'character': 0}, 'end': {'line': 33, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 38, 'character': 0}, 'end': {'line': 38, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 39, 'character': 0}, 'end': {'line': 39, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 43, 'character': 0}, 'end': {'line': 43, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 46, 'character': 0}, 'end': {'line': 46, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 53, 'character': 0}, 'end': {'line': 53, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 61, 'character': 0}, 'end': {'line': 61, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 75, 'character': 0}, 'end': {'line': 75, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 79, 'character': 0}, 'end': {'line': 79, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 83, 'character': 0}, 'end': {'line': 83, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 88, 'character': 0}, 'end': {'line': 88, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 93, 'character': 0}, 'end': {'line': 93, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 97, 'character': 0}, 'end': {'line': 97, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 101, 'character': 0}, 'end': {'line': 101, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 132, 'character': 0}, 'end': {'line': 132, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 136, 'character': 0}, 'end': {'line': 136, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 151, 'character': 0}, 'end': {'line': 151, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 165, 'character': 0}, 'end': {'line': 165, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 174, 'character': 0}, 'end': {'line': 174, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 192, 'character': 0}, 'end': {'line': 192, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 197, 'character': 0}, 'end': {'line': 197, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 211, 'character': 0}, 'end': {'line': 211, 'character': 15}}}]}


@evandrocoan evandrocoan changed the title Took 2 minutes to respond to on_hover() Took 2 minutes to respond to on_hover(), from 15:56:14 until 15:58:38 Feb 4, 2018
@ferozco
Copy link
Contributor

ferozco commented Feb 22, 2018

@evandrocoan are you still seeing this issue?

@evandrocoan
Copy link
Contributor Author

evandrocoan commented Feb 22, 2018

Yes. But now it is so frequently that I just kill the language server process and do not start it anymore. I cannot have my work stopping randomly and frequently for such long periods.

In my opinion the worst part of this issue is the LSP plugin for Sublime Text completely freeze the Sublime Text Graphical User Interface (other times not the User Interface but all Sublime Text Async Tasks running in the background) until the language server respond.

@ferozco
Copy link
Contributor

ferozco commented Feb 22, 2018

i'm sorry to hear that! I think theres two problems to address here.

  1. Blocking behaviour in pyls: We can solve this somewhat easily by augmenting the hover endpoint to support async callbacks and by changing https://github.com/palantir/python-language-server/blob/develop/pyls/plugins/hover.py#L9 to be an async handler

  2. Blocking behaviour in Sublime: Need to get the client to support asynchronous, out of order delivery of responses. I don't know the solution to that. Honestly, this hinders any performance improvements you would see from async pyls and it might make it worse in some cases

What are your thoughts? Would you be interested in tackling either of those?

@evandrocoan
Copy link
Contributor Author

evandrocoan commented Feb 23, 2018

My first though would be to understand: why pyls would take so long to respond to a request?

I do not think it is a big problem taking long as 2 minutes to answer a request, as long as pyls is performing useful work, instead of being locked in some kind of while True performing nothing useful.

My first approach to solve this will be updating my fork of LSP to time out the requests after something like 0.1 seconds, perhaps 0.3 seconds. Just because it is unacceptable to block my work because something could go wrong or take a big time. If pyls or any other language server do not respond after this timeout, consider the answer as not found or inexistente.

After solving this on the LSP plugin, I would dig in into what the pyls is doing and taking so long.

Blocking behaviour in pyls: We can solve this somewhat easily by augmenting the hover endpoint to support async callbacks and by changing https://github.com/palantir/python-language-server/blob/develop/pyls/plugins/hover.py#L9 to be an async handler

I am not sure about what are the implications of an async hover call backs. How would they respond accordingly to the time out I am implementing on the LSP plugin? If I understand correctly, currently pyls will not accept any other hover calls until the first one have been answered. This have some fallbacks on the LSP timeout because:

  1. If LSP is dropping the answer, then when the pyls server respond, the answer will be invalid and rejected by LSP due the timeout.
  2. If the pyls is accepting async hover calls, LSP can start doing several hover requests and:
    i. If each one of these requests take 2 minutes long.
    ii. Or if several of these requests are the same request and take 2 minutes long.
    All requests are going to be invalid due the LSP timeout of 0.3, and they will exhaust the server CPU by creating several different threads into doing the same thing. Or by just by doing discarded work by the LSP plugin timeout of 0.3.

However, it can be actually required by the pyls server to take 2 minutes long to process the first hover request. Therefore, we cannot implement async hover request because this will only cause the LSP plugin into creating several hovers requests, which will take 2 minutes long, i.e., several thread eating my computer CPU doing the same thing.

This is very similar to this problem on the languagetool server:

  1. Exhaust system CPU with big text file input languagetool-org/languagetool#904 Exhaust system CPU with big text file input
  2. Stop timing out while the server still working you the add-on request languagetool-org/languagetool-browser-addon#212 Stop timing out while the server still working you the add-on request

I would suggest to not implement async hover requests, before investigate what is causing or can cause to a request take so long to be finished. After learning this, we can correctly think about a implementation strategy to correctly create async hover requests, without:

  1. Redoing work, i.e., several threads doing the same thing for some kind of initialization hover request, i.e., the initial request will always take longer because the server just find out it need to do some big work before being ready to promptly respond to hover request bellow the time out of 0.3 seconds.
  2. Exhaust the use CPU with several requests which are going to take long and their results are going to be discarded by the LSP plugin, because they timed out after 0.3 seconds.

Hence, if the server implements async hover requests:

  1. It needs to stop processing they if they timed out about the limit of 0.3 seconds. Unless the server need to do some extra job before, like caching the hover results. Then, only then the server can continue working.
  2. It needs to reject repeated requests, to avoid doing the same work several times. If some request is already being processed, then it should just wait. If not, then it can start processing this new request.

Blocking behaviour in Sublime: Need to get the client to support asynchronous, out of order delivery of responses. I don't know the solution to that. Honestly, this hinders any performance improvements you would see from async pyls and it might make it worse in some cases

The solution to this, is to implement async requests on the LSP plugin. But first, fix it blocking the Sublime Text interface. Adding support to async requests is also on the way of fixing LSP. If the LSP plugin is doing and receiving async requests, it should be able to not block Sublime Text until some request being completed after they being created.

Even with an async LSP plugin, there will be still existing discarded requests after the time out. For example, the LSP plugin does the request A, and do not wait for its answer, it starts doing other stuff. Then when the requests A timeout comes, and the request A have not yet being fulfilled, then it considers it invalid or not found and display to the user this result.

@ferozco
Copy link
Contributor

ferozco commented Mar 14, 2018

Hey sorry for the slow response!

With regards to the LSP changes: As a quick fix to get things running it seems reasonable. But as a long term solution I don't think the approach is correct. Clients should not drop requests. The approach I would recommend is to do something similar to what I did for pyls and make the message handling async. This would make the client robust to slow networks and misbehaving servers. I'm not familiar with the implementation of LSP, but in an async world you could enforce your timeout through the use of cancel messages,

pyls hover: Sure, perhaps making it async isn't a complete solution to your problem but I do think that it is the correct thing to do long term. Since a client can cancel a hover request we are basically using users patience as an upper bound on computation time. Furthermore, it adds overall responsiveness to the server. Also important to note, the async requests may operate on multiple threads within the python interpreter but the entire language server will only execute on a single OS level thread.

@gatesn
Copy link
Contributor

gatesn commented Mar 25, 2018

@evandrocoan can you paste the output of pip list? I've seen similar slow behaviour when using jedi-vim (not pyls) when importing large modules. Albeit never as long as 2 minutes.

I agree that async might not be the correct answer here, as we'll very quickly just end up starving the executor pool and blocking all requests! Let's try and find the root cause.

Would be happy to add some log lines into the hover provider to help with timings.

@evandrocoan
Copy link
Contributor Author

Albeit never as long as 2 minutes.

My computer is like 5 times slower than the usual, then we could recude these 2 minutes to 24 seconds on today's machines.

asn1crypto (0.22.0)
astroid (1.6.1)
beautifulsoup4 (4.6.0)
bs4 (0.0.1)
CacheControl (0.12.3)
certifi (2017.7.27.1)
cffi (1.10.0)
chardet (3.0.4)
click (6.7)
colorama (0.3.9)
concurrent-log-handler (0.9.7)
conda (4.4.8)
configparser (3.5.0)
cryptography (2.0.3)
debug-tools (3.0.0, f:\sublimetext\data\packages\debugtools\all)
decorator (4.2.1)
distlib (0.2.5)
dnspython (1.15.0)
ecdsa (0.13)
electrum (3.0.1)
future (0.16.0)
html5lib (0.999999999)
idna (2.6)
isort (4.3.3)
jedi (0.11.1)
Jinja2 (2.10)
json-rpc (1.10.8)
jsonrpclib-pelix (0.3.1)
keyboard (0.11.0)
lazy-object-proxy (1.3.1)
libnacl (1.6.1)
livereload (2.5.1)
lockfile (0.12.2)
Markdown (2.6.11)
MarkupSafe (1.0)
mccabe (0.6.1)
menuinst (1.4.10)
mkdocs (0.17.2)
msgpack-python (0.4.8)
mutagen (1.39)
mypy (0.560)
numpy (1.13.3)
packaging (16.8)
parso (0.1.1)
pbkdf2 (1.3)
picard (2.0.0.dev2)
pip (9.0.1)
pluggy (0.6.0)
portalocker (1.1.0)
progress (1.3)
protobuf (3.4.0)
psutil (5.4.3)
py (1.5.2)
py2exe (0.9.2.2)
pyaes (1.6.1)
PyAudio (0.2.11)
pycodestyle (2.3.1, d:\pycodestyle)
pycosat (0.6.3)
pycparser (2.18)
pydoc-markdown (2.0.1)
pydocstyle (2.1.1)
pyflakes (1.6.0)
pylint (1.8.2)
pyOpenSSL (17.2.0)
pyparsing (2.2.0)
pypiwin32 (220)
PyQt5 (5.9.2)
PySocks (1.6.7)
python-language-server (0.13.0+9.g7337e37, d:\python-language-server)
pywin32 (222)
PyYAML (3.12)
qrcode (5.3)
requests (2.18.4)
rope (0.10.7, d:\python-rope)
ruamel-yaml (0.11.14)
Send2Trash (1.5.0)
setuptools (36.5.0.post20170921)
sip (4.19.8)
six (1.11.0)
snowballstemmer (1.2.1)
tornado (4.5.3)
tox (2.9.1)
typed-ast (1.1.0)
urllib3 (1.22)
virtualenv (15.1.0)
webencodings (0.5.1)
wheel (0.29.0)
win-inet-pton (1.0.1)
wincertstore (0.2)
wrapt (1.10.11)
yapf (0.20.1)


But my pyls has a large data base beyond these default modules, because I include on it all my Sublime Text packages which are about 200

reloading plugin Default.arithmetic
reloading plugin Default.auto_indent_tag
reloading plugin Default.block
reloading plugin Default.colors
reloading plugin Default.comment
reloading plugin Default.convert_color_scheme
reloading plugin Default.convert_syntax
reloading plugin Default.copy_path
reloading plugin Default.delete_word
reloading plugin Default.detect_indentation
reloading plugin Default.duplicate_line
reloading plugin Default.echo
reloading plugin Default.exec
reloading plugin Default.fold
reloading plugin Default.font
reloading plugin Default.goto_line
reloading plugin Default.history_list
reloading plugin Default.indentation
reloading plugin Default.install_package_control
reloading plugin Default.kill_ring
reloading plugin Default.mark
reloading plugin Default.new_templates
reloading plugin Default.open_context_url
reloading plugin Default.open_in_browser
reloading plugin Default.pane
reloading plugin Default.paragraph
reloading plugin Default.paste_from_history
reloading plugin Default.profile
reloading plugin Default.quick_panel
reloading plugin Default.rename
reloading plugin Default.run_syntax_tests
reloading plugin Default.save_on_focus_lost
reloading plugin Default.scroll
reloading plugin Default.set_unsaved_view_name
reloading plugin Default.settings
reloading plugin Default.show_scope_name
reloading plugin Default.side_bar
reloading plugin Default.sort
reloading plugin Default.swap_line
reloading plugin Default.switch_file
reloading plugin Default.symbol
reloading plugin Default.transform
reloading plugin Default.transpose
reloading plugin Default.trim_trailing_white_space
reloading plugin Default.ui
reloading plugin CSS.css_completions
reloading plugin Diff.diff
reloading plugin HTML.encode_html_entities
reloading plugin HTML.html_completions
reloading plugin ShellScript.ShellScript
reloading plugin 0_packages_manager_loader.00-package_control
reloading plugin 0_packages_manager_loader.01-package_setting_context
reloading plugin 0_packages_manager_loader.01-pygments
reloading plugin 0_packages_manager_loader.08-PortalockerFiles
reloading plugin 0_packages_manager_loader.09-ConcurrentLogHandler
reloading plugin 0_packages_manager_loader.10-DebugTools
reloading plugin 0_packages_manager_loader.15-coverage
reloading plugin 0_packages_manager_loader.20-EstimatedTimeLeft
reloading plugin 0_packages_manager_loader.30-ChannelManager
reloading plugin 0_packages_manager_loader.50-backrefs
reloading plugin 0_packages_manager_loader.50-markupsafe
reloading plugin 0_packages_manager_loader.50-PlantUmlConnection
reloading plugin 0_packages_manager_loader.50-pymdownx
reloading plugin 0_packages_manager_loader.50-python-markdown
reloading plugin 0_packages_manager_loader.50-python-pywin32
reloading plugin win32com
reloading plugin win32
reloading plugin win32/lib
reloading plugin win32comext
reloading plugin 0_packages_manager_loader.50-pyyaml
reloading plugin 0_packages_manager_loader.50-regex
reloading plugin 0_packages_manager_loader.51-python-jinja2
reloading plugin 0_packages_manager_loader.55-jsonschema
reloading plugin 0_packages_manager_loader.55-mdpopups
reloading plugin tests
reloading plugin 0_settings_loader.install_package_control_extended
reloading plugin 0_settings_loader.synced_side_bar_watcher
reloading plugin A File Icon.A File Icon
reloading plugin AceJump.ace_jump
reloading plugin ActiveViewJumpBack.active_view_jump_back
reloading plugin AddFolderToProject.AddFolderToProject
reloading plugin AdvancedCSV.csvplugin
reloading plugin Alignment.Alignment
reloading plugin AlignTab.aligner
reloading plugin AlignTab.aligntab
reloading plugin AlignTab.hist
reloading plugin AlignTab.parser
reloading plugin AlignTab.table
reloading plugin AlignTab.utils
reloading plugin AlignTab.wclen
reloading plugin AllAutocomplete.all_views_completions
reloading plugin AltUp.run_multiple_commands
reloading plugin Amxmodx.Amxmodx
reloading plugin AmxxChannel.commands
reloading plugin AmxxChannel.fix_main_menus
reloading plugin AmxxChannel.settings
reloading plugin ANSIescape.ansi
reloading plugin AutomaticPackageReloader.package_reloader
reloading plugin AutoRefresh.AutoRefresh
reloading plugin AutoWrap.autowrap
reloading plugin BetterCoffeeScript.CoffeeScript
reloading plugin BetterFindBuffer.find_results
reloading plugin BufferScroll.BufferScroll
reloading plugin CaseConversion.case_conversion
reloading plugin CaseConversion.case_parse
reloading plugin CaseConversion.ToggleTitleCase
reloading plugin ChainOfCommand.chain
reloading plugin ChangeQuotes.change_quotes
reloading plugin ChannelRepositoryTools.ordereddict
reloading plugin ChannelRepositoryTools.tests
reloading plugin ChannelRepositoryTools.upgrade
reloading plugin ClearCursorsCarets.clear_cursors_carets
reloading plugin ClickableURLs.clickable_urls
reloading plugin ClipboardScopeCopy.clipboard_scope_copy
reloading plugin Color Highlighter.color_converter
reloading plugin Color Highlighter.color_highlighter
reloading plugin Color Highlighter.color_hover_listener
reloading plugin Color Highlighter.color_scheme
reloading plugin Color Highlighter.color_scheme_color_highlighter
reloading plugin Color Highlighter.color_searcher
reloading plugin Color Highlighter.color_selection_listener
reloading plugin Color Highlighter.colors
reloading plugin Color Highlighter.content_listener
reloading plugin Color Highlighter.convert_color_command
reloading plugin Color Highlighter.css_colors
reloading plugin Color Highlighter.dummy_event_listener
reloading plugin Color Highlighter.gutter_icons_color_highlighter
reloading plugin Color Highlighter.load_resource
reloading plugin Color Highlighter.main
reloading plugin Color Highlighter.path
reloading plugin Color Highlighter.phantoms_color_highlighter
reloading plugin Color Highlighter.pick_color_command
reloading plugin Color Highlighter.regex_compiler
reloading plugin Color Highlighter.regions
reloading plugin Color Highlighter.set_setting_command
reloading plugin Color Highlighter.settings
reloading plugin Color Highlighter.st_helper
reloading plugin Color Highlighter.topsort
reloading plugin ColorSchemeEditor.ColorSchemeEditor-ST2
reloading plugin ColorSchemeUnit.plugin
reloading plugin ColumnSelect.column_select
reloading plugin ConcurrentLogHandler.setup
reloading plugin ConvertToUTF8.ConvertToUTF8
reloading plugin CopyFilepathWithLineNumbers.CopyFilepathWithLineNumbers
reloading plugin CopyWithLineNumbersReloaded.copy_with_line_numbers
reloading plugin DebugTools.setup
reloading plugin DefaultSyntax.default_syntax
reloading plugin DeleteCurrentFile.DeleteCurrentFile
reloading plugin DistractionFreeWindow.distraction_free_window
reloading plugin DocBlockr.jsdocs
reloading plugin DocBlockr.test_runner
reloading plugin DuplicateSelections.duplicate_selections
reloading plugin EditPreferences.__init__
reloading plugin EditPreferences.commands_base
reloading plugin EditPreferences.edit_package_files
reloading plugin EditPreferences.extract_snippets
reloading plugin EditPreferences.helper_commands
reloading plugin EditPreferences.helpers
reloading plugin EditPreferences.insert_binding_repr
reloading plugin EditPreferences.jsonix
reloading plugin EditPreferences.list_commands
reloading plugin EditPreferences.list_menu_bindings
reloading plugin EditPreferences.list_settings
reloading plugin EditPreferences.list_shortcut_keys
reloading plugin EditPreferences.list_theme_selectors
reloading plugin EditPreferences.package_resources
reloading plugin EditPreferences.quick_panel_cols
reloading plugin EditPreferences.scheduler
reloading plugin Emmet.emmet-plugin
reloading plugin EvaluateInlinePython.inline_python
reloading plugin EvaluatePrinter.EvalPrinter
reloading plugin EvaluatePrinter.KillableCmd
reloading plugin EvaluateShell.evaluate
reloading plugin ExpandRegion.__init__
reloading plugin ExpandRegion.expand_region_handler
reloading plugin ExpandRegion.expand_to_indent
reloading plugin ExpandRegion.expand_to_line
reloading plugin ExpandRegion.expand_to_quotes
reloading plugin ExpandRegion.expand_to_regex_set
reloading plugin ExpandRegion.expand_to_semantic_unit
reloading plugin ExpandRegion.expand_to_subword
reloading plugin ExpandRegion.expand_to_symbols
reloading plugin ExpandRegion.expand_to_word
reloading plugin ExpandRegion.expand_to_word_with_dots
reloading plugin ExpandRegion.expand_to_xml_node
reloading plugin ExpandRegion.ExpandRegion
reloading plugin ExpandRegion.html
reloading plugin ExpandRegion.javascript
reloading plugin ExpandRegion.latex
reloading plugin ExpandRegion.python
reloading plugin ExpandRegion.utils
reloading plugin ExportHtml.ExportBbcode
reloading plugin ExportHtml.ExportHtml
reloading plugin ExportHtml.HtmlAnnotations
reloading plugin ExportHtml.support
reloading plugin ExtendedTabSwitcher.ExtendedSwitcher
reloading plugin ExtractText.clean_save_file_modifications
reloading plugin ExtractText.extract_to_file
reloading plugin FileDiffs.file_diffs
reloading plugin FileHistory.file_history
reloading plugin FileRename.file_rename
reloading plugin FindKeyConflicts.find_key_conflicts
reloading plugin FixProjectSwitchRestartBug.fix_project_switch_restart_bug
reloading plugin FixSelectionAfterIndent.fix_selection_after_indent
reloading plugin ForceRewriteSublimeSettings.force_rewrite_sublime_settings
reloading plugin FuzzyFileNav.fuzzy_file_nav
reloading plugin FuzzyFileNav.multiconf
reloading plugin FuzzyFileNav.notify
reloading plugin Glue.__init__
reloading plugin Glue.Glue
reloading plugin Glue.GlueBrowser
reloading plugin Glue.GlueCmds
reloading plugin Glue.GlueIO
reloading plugin Glue.GlueSidebarOpener
reloading plugin GoogleSpellCheck.google-spell-check
reloading plugin HighlightBuildErrors.HighlightBuildErrors
reloading plugin HighlightWords.HighlightWords
reloading plugin HorizontalScroll.scroll_width
reloading plugin HungryBackspace.hungry_backspace
reloading plugin Incrementor.incrementor
reloading plugin IncrementSelection.IncrementSelection
reloading plugin IndentAndBraces.indent-and-braces
reloading plugin IndentSize.IndentSizeCommand
reloading plugin InsertNums.InsertNums
reloading plugin InvertSelection.invertselection
reloading plugin JumpAlongIndent.file_scanner
reloading plugin JumpAlongIndent.jump_along_indent
reloading plugin JumpAlongIndent.view_helper
reloading plugin KeepPastedTextSelected.keep_pasted_text_selected
reloading plugin LanguageTool.LanguageList
reloading plugin LanguageTool.LanguageTool
reloading plugin LanguageTool.LTServer
reloading plugin LaTeXSmartQuotes.getTeXRoot
reloading plugin LaTeXSmartQuotes.smartquotes
reloading plugin LaTeXTools.01_reload_submodules
reloading plugin LaTeXTools.02_temp_file_cleanup
reloading plugin LaTeXTools.03_reset_phantoms
reloading plugin LaTeXTools.auto_label
reloading plugin LaTeXTools.biblatex_crossref_completions
reloading plugin LaTeXTools.biblatex_field_name_completions
reloading plugin LaTeXTools.biblatex_name_completions
reloading plugin LaTeXTools.biblatex_snippet_completions
reloading plugin LaTeXTools.biblatex_syntax_listener
reloading plugin LaTeXTools.change_environment
reloading plugin LaTeXTools.context_provider
reloading plugin LaTeXTools.create_mousemap
reloading plugin LaTeXTools.delete_temp_files
reloading plugin LaTeXTools.detect_spellcheck
reloading plugin LaTeXTools.getTeXRoot
reloading plugin LaTeXTools.jumpto_anywhere
reloading plugin LaTeXTools.jumpto_tex_file
reloading plugin LaTeXTools.jumpToPDF
reloading plugin LaTeXTools.kpsewhich
reloading plugin LaTeXTools.latex_cite_completions
reloading plugin LaTeXTools.latex_cwl_completions
reloading plugin LaTeXTools.latex_directive_completions
reloading plugin LaTeXTools.latex_env_completions
reloading plugin LaTeXTools.latex_fill_all
reloading plugin LaTeXTools.latex_glossary_completions
reloading plugin LaTeXTools.latex_input_completions
reloading plugin LaTeXTools.latex_installed_packages
reloading plugin LaTeXTools.latex_own_command_completions
reloading plugin LaTeXTools.latex_ref_completions
reloading plugin LaTeXTools.latexCommand
reloading plugin LaTeXTools.latexDocumentationViewer
reloading plugin LaTeXTools.latexEnvCloser
reloading plugin LaTeXTools.latexEnvironment
reloading plugin LaTeXTools.latextools_cache_listener
reloading plugin LaTeXTools.latextools_default_settings
reloading plugin LaTeXTools.latextools_plugin
reloading plugin LaTeXTools.makePDF
reloading plugin LaTeXTools.migrate
reloading plugin LaTeXTools.open_detexify
reloading plugin LaTeXTools.parseTeXlog
reloading plugin LaTeXTools.reveal_folders
reloading plugin LaTeXTools.search_commands
reloading plugin LaTeXTools.smart_paste
reloading plugin LaTeXTools.system_check
reloading plugin LaTeXTools.texcount
reloading plugin LaTeXTools.texMacro
reloading plugin LaTeXTools.texSections
reloading plugin LaTeXTools.texSyntaxListener
reloading plugin LaTeXTools.toc_quickpanel
reloading plugin LaTeXTools.toggle_settings
reloading plugin LaTeXWordCount.WordCount
reloading plugin LESS.less_completions
reloading plugin LineEndingsUnify.LineEndingsUnify
reloading plugin LinesMultisets.choose_view
reloading plugin LinesMultisets.execute_operation
reloading plugin LSP.boot
reloading plugin MarkdownPreview.helper
reloading plugin MarkdownPreview.markdown_settings
reloading plugin MarkdownPreview.markdown_wrapper
reloading plugin MarkdownPreview.MarkdownPreview
reloading plugin MarkdownToBBCode.MarkdownToBBCode
reloading plugin Maven.config_generator
reloading plugin Maven.import
reloading plugin Maven.maven
reloading plugin MaxPane.layouts_doc
reloading plugin MaxPane.max_pane
reloading plugin MoveText.move_text
reloading plugin MultiEditUtils.MultiEditUtils
reloading plugin MultiEditUtils.selection_fields
reloading plugin NumberKing.king
reloading plugin Origami.origami
reloading plugin OverrideAudit.override_audit
reloading plugin OverrideCommitCompletion.overwrite_commit_completion
reloading plugin OverrideEditSettingsDefaultContents.override_edit_settings_default_contents
reloading plugin OverrideUnpackedPackages.override_unpacked_packages
reloading plugin package_setting_context.__init__
reloading plugin PackageDev._logging
reloading plugin PackageDev.main
reloading plugin PackageResourceViewer.package_resource_viewer
reloading plugin PackageResourceViewer.package_resources
reloading plugin PackagesManager.1_reloader
reloading plugin PackagesManager.2_bootstrap
reloading plugin PackagesManager.PackagesManager
reloading plugin PanelManager.main
reloading plugin PathTranslator.PathTranslator
reloading plugin PlantUmlConnection.setup
reloading plugin PlantUmlDiagrams.diagram_plugin
Removing all handlers from PlantUmlDiagrams.diagram.plantuml...
Removing all handlers from PlantUmlDiagrams.diagram.base...
Removing all handlers from PlantUmlDiagrams.diagram...
Removing all handlers from PlantUmlDiagrams.diagram.plantuml...
Removing all handlers from PlantUmlDiagrams.diagram.base...
reloading plugin PowerCursors.power_cursors
reloading plugin PrettyJSON.PrettyJson
reloading plugin PrettyJSON.PrettyJsonListeners
reloading plugin QuickSettings.quick_settings
reloading plugin RandomEverything.__init__
reloading plugin RandomEverything.random
reloading plugin REG.jumptoregkey
reloading plugin ReIndent.ReIndent
reloading plugin RememberCommandPaletteInput.fixed_command_palette_input_history
reloading plugin REPL.__init__
reloading plugin REPL.completions
reloading plugin REPL.lang_integration
reloading plugin REPL.run_existing_command
reloading plugin REPL.sublimerepl
reloading plugin REPL.sublimerepl_build_system_hack
reloading plugin REPL.text_transfer
reloading plugin ScopeHunter.scope_hunter
reloading plugin ScopeHunter.scope_hunter_notify
reloading plugin ScopeHunter.support
reloading plugin SelectAll.select_all_by_current_scope
reloading plugin SelectAllSpellingErrors.select_all_spelling_errors
reloading plugin SelectUntil.edit
reloading plugin SelectUntil.select-until
reloading plugin SemanticLineWrap.semantic_wrap
reloading plugin SideBarEnhancements.SideBar
reloading plugin SideBarEnhancements.SideBarAPI
reloading plugin SideBarEnhancements.SideBarDefaultDisable
reloading plugin SideBySideCompare.sbs_compare
reloading plugin SideBySideSettings.sxs_settings
reloading plugin SQLExec.SQLExec
reloading plugin SQLKeywordUppercase.sql_keyword_uppercase
reloading plugin SQLTools.SQLTools
reloading plugin StickySearch.StickySearch
reloading plugin StudioChannel.commands
reloading plugin StudioChannel.settings
reloading plugin SublimeLinter.__init__
reloading plugin SublimeLinter.busy_indicator_view
reloading plugin SublimeLinter.commands
reloading plugin SublimeLinter.goto_commands
reloading plugin SublimeLinter.highlight_view
reloading plugin SublimeLinter.log_handler
reloading plugin SublimeLinter.message_view
reloading plugin SublimeLinter.panel_view
reloading plugin SublimeLinter.status_bar_view
reloading plugin SublimeLinter.sublime_linter
reloading plugin SublimeLinter.tooltips_view
reloading plugin SublimeTutorial.sublime_tutor
reloading plugin SyncViewScroll.syncscroll
reloading plugin SyntaxManager.syntaxmgr
reloading plugin TabsExtra.support
reloading plugin TabsExtra.tab_menu
reloading plugin TabsExtra.tab_sort_helper
reloading plugin TabsExtra.tabs_extra
reloading plugin TerminalShortcuts.Terminal
reloading plugin TextPastry.text_pastry
reloading plugin TextPastry.text_pastry_addons
reloading plugin TextPastry.text_pastry_clipboard
reloading plugin TextPastry.text_pastry_selection
reloading plugin ToggleWords.ToggleWords
reloading plugin Trimmer.Trimmer
reloading plugin TypeScript.main
reloading plugin UnitTesting.ut
reloading plugin ViewSettingsFreely.view_settings_freely
reloading plugin Whitespace.Whitespace
reloading plugin WordCount.WordCount
reloading plugin WordHighlight.word_highlight
reloading plugin WrapPlus.wrap_plus
plugins loaded


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants