Auto merge of #3229 - micbou:keep-previous-window, r=puremourning

[READY] Preserve previous window when updating matches

Ensure `<c-w>p` still go to the previous window after updating matches for the current buffer.

Fixes #3228.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3229)
<!-- Reviewable:end -->
This commit is contained in:
zzbot 2018-11-18 05:48:57 -08:00 committed by GitHub
commit f2d999bbb1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 5 deletions

View File

@ -178,6 +178,14 @@ def _MockVimBufferEval( value ):
return None 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 ): def _MockVimOptionsEval( value ):
result = VIM_OPTIONS.get( value ) result = VIM_OPTIONS.get( value )
if result is not None: if result is not None:
@ -266,6 +274,10 @@ def _MockVimEval( value ):
if result is not None: if result is not None:
return result return result
result = _MockVimWindowEval( value )
if result is not None:
return result
result = _MockVimMatchEval( value ) result = _MockVimMatchEval( value )
if result is not None: if result is not None:
return result return result
@ -485,10 +497,10 @@ class VimWindows( object ):
def __getitem__( self, number ): def __getitem__( self, number ):
"""Emulates vim.windows[ number ]""" """Emulates vim.windows[ number ]"""
for window in self._windows: try:
if number == window.number: return self._windows[ number ]
return window except IndexError:
raise KeyError( number ) raise IndexError( 'no such window' )
def __iter__( self ): 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.buffers', VimBuffers( buffers ) ):
with patch( 'vim.windows', VimWindows( window_buffers, with patch( 'vim.windows', VimWindows( window_buffers,
cursor_position ) ) as windows: cursor_position ) ) as windows:
with patch( 'vim.current', VimCurrent( windows[ 1 ] ) ): with patch( 'vim.current', VimCurrent( windows[ 0 ] ) ):
yield VIM_MOCK yield VIM_MOCK

View File

@ -1237,16 +1237,23 @@ def AutocommandEventsIgnored( events = [ 'all' ] ):
vim.options[ 'eventignore' ] = old_eventignore vim.options[ 'eventignore' ] = old_eventignore
def GetPreviousWindowNumber():
return GetIntValue( 'winnr("#")' ) - 1
@contextlib.contextmanager @contextlib.contextmanager
def CurrentWindow(): def CurrentWindow():
"""Context manager to perform operations on other windows than the current one """Context manager to perform operations on other windows than the current one
without triggering autocommands related to window movement. Use the without triggering autocommands related to window movement. Use the
SwitchWindow function to move to other windows while under the context.""" SwitchWindow function to move to other windows while under the context."""
previous_window = vim.windows[ GetPreviousWindowNumber() ]
current_window = vim.current.window current_window = vim.current.window
with AutocommandEventsIgnored( [ 'WinEnter', 'Winleave' ] ): with AutocommandEventsIgnored( [ 'WinEnter', 'Winleave' ] ):
try: try:
yield yield
finally: finally:
# Ensure <c-w>p still go to the previous window.
vim.current.window = previous_window
vim.current.window = current_window vim.current.window = current_window