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"),