diff --git a/plugin/youcompleteme.vim b/plugin/youcompleteme.vim index 906b17b1..ba4eb141 100644 --- a/plugin/youcompleteme.vim +++ b/plugin/youcompleteme.vim @@ -129,6 +129,10 @@ let g:ycm_echo_current_diagnostic = \ get( g:, 'ycm_echo_current_diagnostic', \ get( g:, 'syntastic_echo_current_error', 1 ) ) +let g:ycm_always_populate_loc_list = + \ get( g:, 'ycm_always_populate_loc_list', + \ get( g:, 'syntastic_always_populate_loc_list', 0 ) ) + let g:ycm_error_symbol = \ get( g:, 'ycm_error_symbol', \ get( g:, 'syntastic_error_symbol', '>>' ) ) diff --git a/python/ycm/diagnostic_interface.py b/python/ycm/diagnostic_interface.py index c58a2eae..ef67d869 100644 --- a/python/ycm/diagnostic_interface.py +++ b/python/ycm/diagnostic_interface.py @@ -47,11 +47,15 @@ class DiagnosticInterface( object ): if self._user_options[ 'enable_signs' ]: self._next_sign_id = _UpdateSigns( self._buffer_number_to_line_to_diags, - self._next_sign_id ) + self._next_sign_id ) if self._user_options[ 'enable_highlighting' ]: _UpdateSquiggles( self._buffer_number_to_line_to_diags ) + if self._user_options[ 'always_populate_loc_list' ]: + vimsupport.SetLocationList( + vimsupport.ConvertDiagnosticsToQfList( diags ) ) + def _EchoDiagnosticForLine( self, line_num ): buffer_num = vim.current.buffer.number diff --git a/python/ycm/vimsupport.py b/python/ycm/vimsupport.py index ff57840b..91245c59 100644 --- a/python/ycm/vimsupport.py +++ b/python/ycm/vimsupport.py @@ -147,6 +147,30 @@ def AddDiagnosticSyntaxMatch( line_num, group, line_num, column_num, line_end_num, column_end_num ) ) +def SetLocationList( diagnostics ): + """Diagnostics should be in qflist format; see ":h setqflist" for details.""" + vim.eval( 'setloclist( 0, {0} )'.format( json.dumps( diagnostics ) ) ) + + +def ConvertDiagnosticsToQfList( diagnostics ): + def ConvertDiagnosticToQfFormat( diagnostic ): + # see :h getqflist for a description of the dictionary fields + # Note that, as usual, Vim is completely inconsistent about whether + # line/column numbers are 1 or 0 based in its various APIs. Here, it wants + # them to be 1-based. + location = diagnostic[ 'location' ] + return { + 'bufnr' : GetBufferNumberForFilename( location[ 'filepath' ] ), + 'lnum' : location[ 'line_num' ] + 1, + 'col' : location[ 'column_num' ] + 1, + 'text' : diagnostic[ 'text' ], + 'type' : diagnostic[ 'kind' ], + 'valid' : 1 + } + + return [ ConvertDiagnosticToQfFormat( x ) for x in diagnostics ] + + # Given a dict like {'a': 1}, loads it into Vim as if you ran 'let g:a = 1' # When |overwrite| is True, overwrites the existing value in Vim. def LoadDictIntoVimGlobals( new_globals, overwrite = True ): diff --git a/python/ycm/youcompleteme.py b/python/ycm/youcompleteme.py index 89ff71c2..f04fef60 100644 --- a/python/ycm/youcompleteme.py +++ b/python/ycm/youcompleteme.py @@ -274,7 +274,7 @@ class YouCompleteMe( object ): # until the next request is created. self._latest_file_parse_request = None if qflist_format: - return [ _ConvertDiagnosticDataToVimData( x ) for x in diagnostics ] + return vimsupport.ConvertDiagnosticsToQfList( diagnostics ) else: return diagnostics return [] @@ -379,17 +379,3 @@ def _AddUltiSnipsDataIfNeeded( extra_data ): } for x in rawsnips ] -def _ConvertDiagnosticDataToVimData( diagnostic ): - # see :h getqflist for a description of the dictionary fields - # Note that, as usual, Vim is completely inconsistent about whether - # line/column numbers are 1 or 0 based in its various APIs. Here, it wants - # them to be 1-based. - location = diagnostic[ 'location' ] - return { - 'bufnr' : vimsupport.GetBufferNumberForFilename( location[ 'filepath' ] ), - 'lnum' : location[ 'line_num' ] + 1, - 'col' : location[ 'column_num' ] + 1, - 'text' : diagnostic[ 'text' ], - 'type' : diagnostic[ 'kind' ], - 'valid' : 1 - }