From 49dc8cb2086db19d385791c8e1635723b0fd95c7 Mon Sep 17 00:00:00 2001 From: Gianmaria Bajo Date: Fri, 15 Mar 2024 20:25:53 +0100 Subject: [PATCH] fix #1165: insert mode lag (#1552) * fix #1165: insert mode lag Ultisnips was traversing the whole runtimepath every time an expansion was attempted, something that happens for every key press since there is autotrigger. Even without autotrigger, traversal was done at every snippet expansion, which caused slowdowns in that case. With this change, traversal happens only the first time, or after a source must be refreshed (because a snippets file has been updated). --- autoload/UltiSnips.vim | 7 +++++++ pythonx/UltiSnips/snippet/source/base.py | 1 + pythonx/UltiSnips/snippet/source/file/base.py | 8 +++++--- pythonx/UltiSnips/snippet_manager.py | 10 ++++++++++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/autoload/UltiSnips.vim b/autoload/UltiSnips.vim index d1c671da..d566e420 100644 --- a/autoload/UltiSnips.vim +++ b/autoload/UltiSnips.vim @@ -3,6 +3,9 @@ if exists("b:did_autoload_ultisnips") endif let b:did_autoload_ultisnips = 1 +" Ensure snippets are loaded for current buffer +au UltiSnips_AutoTrigger FileType,BufEnter * call UltiSnips#CheckFiletype() + " Also import vim as we expect it to be imported in many places. py3 import vim py3 from UltiSnips import UltiSnips_Manager @@ -188,6 +191,10 @@ function! UltiSnips#TrackChange() abort py3 UltiSnips_Manager._track_change() endfunction +function! UltiSnips#CheckFiletype() abort + py3 UltiSnips_Manager._check_filetype(vim.eval('&ft')) +endfunction + function! UltiSnips#RefreshSnippets() abort py3 UltiSnips_Manager._refresh_snippets() endfunction diff --git a/pythonx/UltiSnips/snippet/source/base.py b/pythonx/UltiSnips/snippet/source/base.py index 4d6933f2..a1cb67a1 100644 --- a/pythonx/UltiSnips/snippet/source/base.py +++ b/pythonx/UltiSnips/snippet/source/base.py @@ -15,6 +15,7 @@ class SnippetSource: def __init__(self): self._snippets = defaultdict(SnippetDictionary) self._extends = defaultdict(set) + self.must_ensure = True def ensure(self, filetypes): """Ensures that snippets are loaded.""" diff --git a/pythonx/UltiSnips/snippet/source/file/base.py b/pythonx/UltiSnips/snippet/source/file/base.py index c3e00f3a..f79ec661 100644 --- a/pythonx/UltiSnips/snippet/source/file/base.py +++ b/pythonx/UltiSnips/snippet/source/file/base.py @@ -27,9 +27,11 @@ def __init__(self): SnippetSource.__init__(self) def ensure(self, filetypes): - for ft in self.get_deep_extends(filetypes): - if self._needs_update(ft): - self._load_snippets_for(ft) + if self.must_ensure: + for ft in self.get_deep_extends(filetypes): + if self._needs_update(ft): + self._load_snippets_for(ft) + self.must_ensure = False def refresh(self): self.__init__() diff --git a/pythonx/UltiSnips/snippet_manager.py b/pythonx/UltiSnips/snippet_manager.py index 09495393..99bb44b5 100644 --- a/pythonx/UltiSnips/snippet_manager.py +++ b/pythonx/UltiSnips/snippet_manager.py @@ -130,6 +130,7 @@ def __init__(self, expand_trigger, forward_trigger, backward_trigger): self._visual_content = VisualContentPreserver() self._snippet_sources = [] + self._filetypes = [] self._snip_expanded_in_action = False self._inside_action = False @@ -984,6 +985,15 @@ def _refresh_snippets(self): source.refresh() + @err_to_scratch_buffer.wrap + def _check_filetype(self, ft): + """Ensure snippets are loaded for the current filetype.""" + if ft not in self._filetypes: + self._filetypes.append(ft) + for _, source in self._snippet_sources: + source.must_ensure = True + + UltiSnips_Manager = SnippetManager( # pylint:disable=invalid-name vim.eval("g:UltiSnipsExpandTrigger"), vim.eval("g:UltiSnipsJumpForwardTrigger"),