From 3151820ff57427813e412bb2107bd660a1c1bd5f Mon Sep 17 00:00:00 2001 From: micbou Date: Sun, 25 Nov 2018 23:33:26 +0100 Subject: [PATCH] Update diagnostic matches only in current window --- python/ycm/diagnostic_interface.py | 37 +++++++++++----------- python/ycm/tests/youcompleteme_test.py | 5 ++- python/ycm/vimsupport.py | 44 -------------------------- 3 files changed, 21 insertions(+), 65 deletions(-) diff --git a/python/ycm/diagnostic_interface.py b/python/ycm/diagnostic_interface.py index ca5976ad..5475d961 100644 --- a/python/ycm/diagnostic_interface.py +++ b/python/ycm/diagnostic_interface.py @@ -129,28 +129,29 @@ class DiagnosticInterface( object ): if not self._user_options[ 'enable_diagnostic_highlighting' ]: return - with vimsupport.CurrentWindow(): - for window in vimsupport.GetWindowsForBufferNumber( self._bufnr ): - vimsupport.SwitchWindow( window ) + # Vim doesn't provide a way to update the matches for a different window + # than the current one (which is a view of the current buffer). + if vimsupport.GetCurrentBufferNumber() != self._bufnr: + return - matches_to_remove = vimsupport.GetDiagnosticMatchesInCurrentWindow() + matches_to_remove = vimsupport.GetDiagnosticMatchesInCurrentWindow() - for diags in itervalues( self._line_to_diags ): - # Insert squiggles in reverse order so that errors overlap warnings. - for diag in reversed( diags ): - group = ( 'YcmErrorSection' if _DiagnosticIsError( diag ) else - 'YcmWarningSection' ) + for diags in itervalues( self._line_to_diags ): + # Insert squiggles in reverse order so that errors overlap warnings. + for diag in reversed( diags ): + group = ( 'YcmErrorSection' if _DiagnosticIsError( diag ) else + 'YcmWarningSection' ) - for pattern in _ConvertDiagnosticToMatchPatterns( diag ): - # The id doesn't matter for matches that we may add. - match = vimsupport.DiagnosticMatch( 0, group, pattern ) - try: - matches_to_remove.remove( match ) - except ValueError: - vimsupport.AddDiagnosticMatch( match ) + for pattern in _ConvertDiagnosticToMatchPatterns( diag ): + # The id doesn't matter for matches that we may add. + match = vimsupport.DiagnosticMatch( 0, group, pattern ) + try: + matches_to_remove.remove( match ) + except ValueError: + vimsupport.AddDiagnosticMatch( match ) - for match in matches_to_remove: - vimsupport.RemoveDiagnosticMatch( match ) + for match in matches_to_remove: + vimsupport.RemoveDiagnosticMatch( match ) def _UpdateSigns( self ): diff --git a/python/ycm/tests/youcompleteme_test.py b/python/ycm/tests/youcompleteme_test.py index 71e1ad63..b7acd7d9 100644 --- a/python/ycm/tests/youcompleteme_test.py +++ b/python/ycm/tests/youcompleteme_test.py @@ -1047,14 +1047,13 @@ def YouCompleteMe_AsyncDiagnosticUpdate_PerFile_test( ycm, ] ) ] ) + # FIXME: diagnostic matches in windows other than the current one are not + # updated. assert_that( test_utils.VIM_MATCHES_FOR_WINDOW, has_entries( { 1: contains( VimMatch( 'YcmErrorSection', '\\%1l\\%1c\\_.\\{-}\\%1l\\%1c' ) - ), - 3: contains( - VimMatch( 'YcmErrorSection', '\\%3l\\%3c\\_.\\{-}\\%3l\\%3c' ) ) } ) ) diff --git a/python/ycm/vimsupport.py b/python/ycm/vimsupport.py index 956e3093..a7ad562c 100644 --- a/python/ycm/vimsupport.py +++ b/python/ycm/vimsupport.py @@ -23,7 +23,6 @@ from __future__ import absolute_import from builtins import * # noqa from future.utils import iterkeys -import contextlib import vim import os import json @@ -1218,49 +1217,6 @@ def BuildRange( start_line, end_line ): } -@contextlib.contextmanager -def AutocommandEventsIgnored( events = [ 'all' ] ): - """Context manager to perform operations without triggering autocommand - events. |events| is a list of events to ignore. By default, all events are - ignored.""" - old_eventignore = vim.options[ 'eventignore' ] - ignored_events = { - event for event in ToUnicode( old_eventignore ).split( ',' ) if event } - ignored_events.update( events ) - vim.options[ 'eventignore' ] = ','.join( ignored_events ) - try: - yield - finally: - vim.options[ 'eventignore' ] = old_eventignore - - -def GetPreviousWindowNumber(): - return GetIntValue( 'winnr("#")' ) - 1 - - -@contextlib.contextmanager -def CurrentWindow(): - """Context manager to perform operations on other windows than the current one - without triggering autocommands related to window movement. Use the - SwitchWindow function to move to other windows while under the context.""" - previous_window = vim.windows[ GetPreviousWindowNumber() ] - current_window = vim.current.window - with AutocommandEventsIgnored( [ 'WinEnter', 'Winleave' ] ): - try: - yield - finally: - # Ensure p still go to the previous window. - vim.current.window = previous_window - vim.current.window = current_window - - -def SwitchWindow( window ): - """Move to the window object |window|. This function should be called under - the CurrentWindow context if you are going to switch back to the original - window.""" - vim.current.window = window - - # Expects version_string in 'MAJOR.MINOR.PATCH' format, e.g. '8.1.278' def VimVersionAtLeast( version_string ): major, minor, patch = ( int( x ) for x in version_string.split( '.' ) )