From d08be52c625f9b2cd6a0e177ac04fbf4f710faa6 Mon Sep 17 00:00:00 2001 From: micbou Date: Fri, 16 Nov 2018 13:34:53 +0100 Subject: [PATCH] Preserve previous window when updating matches Ensure p still go to the previous window after updating matches for the current buffer. --- python/ycm/tests/test_utils.py | 22 +++++++++++++++++----- python/ycm/vimsupport.py | 7 +++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/python/ycm/tests/test_utils.py b/python/ycm/tests/test_utils.py index 5a1086f0..19f1a6a2 100644 --- a/python/ycm/tests/test_utils.py +++ b/python/ycm/tests/test_utils.py @@ -178,6 +178,14 @@ def _MockVimBufferEval( value ): return None +def _MockVimWindowEval( value ): + if value == 'winnr("#")': + # For simplicity, we always assume there is no previous window. + return 0 + + return None + + def _MockVimOptionsEval( value ): result = VIM_OPTIONS.get( value ) if result is not None: @@ -266,6 +274,10 @@ def _MockVimEval( value ): if result is not None: return result + result = _MockVimWindowEval( value ) + if result is not None: + return result + result = _MockVimMatchEval( value ) if result is not None: return result @@ -485,10 +497,10 @@ class VimWindows( object ): def __getitem__( self, number ): """Emulates vim.windows[ number ]""" - for window in self._windows: - if number == window.number: - return window - raise KeyError( number ) + try: + return self._windows[ number ] + except IndexError: + raise IndexError( 'no such window' ) def __iter__( self ): @@ -581,7 +593,7 @@ def MockVimBuffers( buffers, window_buffers, cursor_position = ( 1, 1 ) ): with patch( 'vim.buffers', VimBuffers( buffers ) ): with patch( 'vim.windows', VimWindows( window_buffers, cursor_position ) ) as windows: - with patch( 'vim.current', VimCurrent( windows[ 1 ] ) ): + with patch( 'vim.current', VimCurrent( windows[ 0 ] ) ): yield VIM_MOCK diff --git a/python/ycm/vimsupport.py b/python/ycm/vimsupport.py index 03c0f7f4..dd90138d 100644 --- a/python/ycm/vimsupport.py +++ b/python/ycm/vimsupport.py @@ -1230,16 +1230,23 @@ def AutocommandEventsIgnored( events = [ 'all' ] ): 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