Search code examples
vimyoucompleteme

YouCompleteMe(vim plugin) GoToDefinition doesn't work


let g:ycm_global_ycm_extra_conf='~/.vim/bundle/youcompleteme/.ycm_extra_conf.py'
let g:ycm_min_num_of_chars_for_completion=1
let g:ycm_confirm_extra_conf=0
let g:ycm_autoclose_preview_window_after_completion = 1 
nnoremap <F5>           :YcmForceCompileAndDiagnostics<CR>
nnoremap <leader>gic    :YcmCompleter GoToInclude<CR>
nnoremap <leader>gdc    :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gdf    :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gip    :YcmCompleter GoToImprecise<CR>
nnoremap <leader>f      :YcmCompleter FixIt<CR>

This is the part of ~/.vimrc related to ycm.
Also, flags in .ycm_extra_conf.py contains the result of echo | gcc -std=c++11 -v -E -x c++ - which refers to include paths for C-family.

  • The problem
    While auto-complete works fine, GoToDefinition doesn't work at all.
    (Here what works means, ycm can recognize local header file in projects.)
    According to the NOTE, GoToDefinition only works in the current translation unit.
    However, GoToDefinition only works in the file being edited in my case.

  • What I tried: Give up to make .ycm_extra_conf.py global

    1. Copy .ycm_extra_conf.py into the top of project and modify g:ycm_global_ycm_extra_conf in ~/.vimrc.
    2. Do YcmForceCompileAndDiagnostics
    3. Check final_flags in FlagsForFile function in .ycm_extra_conf.py file.
    4. final_flags was like this.
      ['-Wall', '-Wextra', '-Werror', '-Wc++98-compat', '-Wno-long-long', '-Wno-variadic-macros', '-fexceptions', '-DN DEBUG', '-DUSE_CLANG_COMPLETER', '-std=c++11', '-x', 'c++', '-isystem', '/home/illuxic/Redbase/../BoostParts', ' -isystem', '/System/Library/Frameworks/Python.framework/Headers', '-isystem', '/home/illuxic/Redbase/../llvm/inc lude', '-isystem', '/home/illuxic/Redbase/../llvm/tools/clang/include', '-I', '/home/illuxic/Redbase/.', '-I', ' /home/illuxic/Redbase/./ClangCompleter', '-isystem', '/home/illuxic/Redbase/./tests/gmock/gtest', '-isystem', '/ home/illuxic/Redbase/./tests/gmock/gtest/include', '-isystem', '/home/illuxic/Redbase/./tests/gmock', '-isystem' , '/home/illuxic/Redbase/./tests/gmock/include', '-isystem', '/usr/include/c++/5', '-isystem', '/usr/include/x86 _64-linux-gnu/c++/5', '-isystem', '/usr/include/c++/5/backward', '-isystem', '/usr/lib/gcc/x86_64-linux-gnu/5/in clude', '-isystem', '/usr/local/include', '-isystem', '/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed', '-isystem ', '/usr/include/x86_64-linux-gnu', '-isystem', '/usr/include']
    5. GoToDefinition still gives me 'RuntimeError: Can't jump to definition.'

How can I make GoToDefinition work?
It can't recognize not only indirectly included header files but also directly included header files.


Solution

  • You can see the additional details in here.
    What I'd misunderstood is in the comment written by @puremourning.
    I recommend you to read this comment first.