From 5dca552d5daee69c064374146bcda9e63be63b20 Mon Sep 17 00:00:00 2001 From: micbou Date: Thu, 8 Sep 2016 18:09:27 +0200 Subject: [PATCH] Do not depend on UltiSnips internals Use UltiSnips#SnippetsInCurrentScope to fetch snippets. Add an entry in the FAQ about the :UltiSnipsAddFiletypes command. --- README.md | 10 +++++++++ doc/youcompleteme.txt | 38 +++++++++++++++++++++------------- python/ycm/youcompleteme.py | 41 ++++++++++++------------------------- 3 files changed, 47 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 3ceb303d..ae120cb7 100644 --- a/README.md +++ b/README.md @@ -2648,6 +2648,16 @@ g:UltiSnipsJumpForwardTrigger g:UltiSnipsJumpBackwardTrigger ``` +### Snippets added with `:UltiSnipsAddFiletypes` do not appear in the popup menu + +For efficiency, YCM only fetches UltiSnips snippets in specific scenarios like +visiting a buffer or setting its filetype. You can force YCM to retrieve them by +manually triggering the `FileType` autocommand: + +```viml +:doautocmd FileType +``` + ### Why isn't YCM just written in plain VimScript, FFS? Because of the identifier completion engine and subsequence-based filtering. diff --git a/doc/youcompleteme.txt b/doc/youcompleteme.txt index 11a67fa9..143cb0a5 100644 --- a/doc/youcompleteme.txt +++ b/doc/youcompleteme.txt @@ -145,23 +145,24 @@ Contents ~ 19. YCM does not read identifiers from my tags files |youcompleteme-ycm-does-not-read-identifiers-from-my-tags-files| 20. 'CTRL-U' in insert mode does not work |CTRL-sub-U| 21. YCM conflicts with UltiSnips TAB key usage |youcompleteme-ycm-conflicts-with-ultisnips-tab-key-usage| - 22. Why isn't YCM just written in plain VimScript, FFS? |youcompleteme-why-isnt-ycm-just-written-in-plain-vimscript-ffs| - 23. Why does YCM demand such a recent version of Vim? |youcompleteme-why-does-ycm-demand-such-recent-version-of-vim| - 24. I get annoying messages in Vim's status area when I type |youcompleteme-i-get-annoying-messages-in-vims-status-area-when-i-type| - 25. Nasty bugs happen if I have the 'vim-autoclose' plugin installed |vim-sub-autoclose| - 26. Is there some sort of YCM mailing list? I have questions |youcompleteme-is-there-sort-of-ycm-mailing-list-i-have-questions| - 27. I get an internal compiler error when installing |youcompleteme-i-get-an-internal-compiler-error-when-installing| - 28. I get weird errors when I press 'Ctrl-C' in Vim |Ctrl-sub-C| - 29. Why did YCM stop using Syntastic for diagnostics display? |youcompleteme-why-did-ycm-stop-using-syntastic-for-diagnostics-display| - 30. Completion doesn't work with the C++ standard library headers |youcompleteme-completion-doesnt-work-with-c-standard-library-headers| - 31. When I open a JavaScript file, I get an annoying warning about '.tern-project' + 22. Snippets added with |:UltiSnipsAddFiletypes| do not appear in the popup menu + 23. Why isn't YCM just written in plain VimScript, FFS? |youcompleteme-why-isnt-ycm-just-written-in-plain-vimscript-ffs| + 24. Why does YCM demand such a recent version of Vim? |youcompleteme-why-does-ycm-demand-such-recent-version-of-vim| + 25. I get annoying messages in Vim's status area when I type |youcompleteme-i-get-annoying-messages-in-vims-status-area-when-i-type| + 26. Nasty bugs happen if I have the 'vim-autoclose' plugin installed |vim-sub-autoclose| + 27. Is there some sort of YCM mailing list? I have questions |youcompleteme-is-there-sort-of-ycm-mailing-list-i-have-questions| + 28. I get an internal compiler error when installing |youcompleteme-i-get-an-internal-compiler-error-when-installing| + 29. I get weird errors when I press 'Ctrl-C' in Vim |Ctrl-sub-C| + 30. Why did YCM stop using Syntastic for diagnostics display? |youcompleteme-why-did-ycm-stop-using-syntastic-for-diagnostics-display| + 31. Completion doesn't work with the C++ standard library headers |youcompleteme-completion-doesnt-work-with-c-standard-library-headers| + 32. When I open a JavaScript file, I get an annoying warning about '.tern-project' file |.tern-sub-project| - 32. When I start vim I get a runtime error saying 'R6034 An application has made an + 33. When I start vim I get a runtime error saying 'R6034 An application has made an attempt to load the C runtime library incorrectly.' |R6034-An-application-has-made-an-attempt-to-load-the-C-runtime-library-incorrectly.| - 33. I hear that YCM only supports Python 2, is that true? |youcompleteme-i-hear-that-ycm-only-supports-python-2-is-that-true| - 34. On Windows I get "E887: Sorry, this command is disabled, the Python's site + 34. I hear that YCM only supports Python 2, is that true? |youcompleteme-i-hear-that-ycm-only-supports-python-2-is-that-true| + 35. On Windows I get "E887: Sorry, this command is disabled, the Python's site module could not be loaded" |E887:-Sorry-this-command-is-disabled-the-Python-s-site-module-could-not-be-loaded| - 35. I can't complete python packages in a virtual environment. |youcompleteme-i-cant-complete-python-packages-in-virtual-environment.| + 36. I can't complete python packages in a virtual environment. |youcompleteme-i-cant-complete-python-packages-in-virtual-environment.| 12. Contributor Code of Conduct |youcompleteme-contributor-code-of-conduct| 13. Contact |youcompleteme-contact| 14. License |youcompleteme-license| @@ -2904,6 +2905,15 @@ options: g:UltiSnipsJumpForwardTrigger g:UltiSnipsJumpBackwardTrigger < +------------------------------------------------------------------------------- +Snippets added with *:UltiSnipsAddFiletypes* do not appear in the popup menu + +For efficiency, YCM only fetches UltiSnips snippets in specific scenarios like +visiting a buffer or setting its filetype. You can force YCM to retrieve them +by manually triggering the 'FileType' autocommand: +> + :doautocmd FileType +< ------------------------------------------------------------------------------- *youcompleteme-why-isnt-ycm-just-written-in-plain-vimscript-ffs* Why isn't YCM just written in plain VimScript, FFS? ~ diff --git a/python/ycm/youcompleteme.py b/python/ycm/youcompleteme.py index bd6ccdba..423fbf7b 100644 --- a/python/ycm/youcompleteme.py +++ b/python/ycm/youcompleteme.py @@ -51,12 +51,6 @@ from ycm.client.event_notification import ( SendEventNotificationAsync, EventNotification ) from ycm.client.shutdown_request import SendShutdownRequest -try: - from UltiSnips import UltiSnips_Manager - USE_ULTISNIPS_DATA = True -except ImportError: - USE_ULTISNIPS_DATA = False - def PatchNoProxy(): current_value = os.environ.get('no_proxy', '') @@ -319,7 +313,7 @@ class YouCompleteMe( object ): if not self.IsServerAlive(): return extra_data = {} - _AddUltiSnipsDataIfNeeded( extra_data ) + self._AddUltiSnipsDataIfNeeded( extra_data ) SendEventNotificationAsync( 'BufferVisit', extra_data ) @@ -690,25 +684,16 @@ class YouCompleteMe( object ): extra_conf_vim_data ) -def _AddUltiSnipsDataIfNeeded( extra_data ): - if not USE_ULTISNIPS_DATA: - return + def _AddUltiSnipsDataIfNeeded( self, extra_data ): + # See :h UltiSnips#SnippetsInCurrentScope. + try: + vim.eval( 'UltiSnips#SnippetsInCurrentScope( 1 )' ) + except vim.error: + return - try: - # Since UltiSnips may run in a different python interpreter (python 3) than - # YCM, UltiSnips_Manager singleton is not necessary the same as the one - # used by YCM. In particular, it means that we cannot rely on UltiSnips to - # set the current filetypes to the singleton. We need to do it ourself. - UltiSnips_Manager.reset_buffer_filetypes() - UltiSnips_Manager.add_buffer_filetypes( - vimsupport.GetVariableValue( '&filetype' ) ) - rawsnips = UltiSnips_Manager._snips( '', True ) - except: - return - - # UltiSnips_Manager._snips() returns a class instance where: - # class.trigger - name of snippet trigger word ( e.g. defn or testcase ) - # class.description - description of the snippet - extra_data[ 'ultisnips_snippets' ] = [ - { 'trigger': x.trigger, 'description': x.description } for x in rawsnips - ] + snippets = vimsupport.GetVariableValue( 'g:current_ulti_dict_info' ) + extra_data[ 'ultisnips_snippets' ] = [ + { 'trigger': trigger, + 'description': snippet[ 'description' ] } + for trigger, snippet in iteritems( snippets ) + ]