简体   繁体   English

C++:使用 Youcompleteme 自动完成工具的 Vim 编辑器 - 未列出标准标题

[英]C++: Vim editor using Youcompleteme auto completion tool - does not list standard header

I am writing some C++ code using Vim with Youcompleteme autocompletion tool.我正在使用 Vim 和 Youcompleteme 自动完成工具编写一些 C++ 代码。
I noticed when i type the below to include iostream header ..当我输入以下内容以包含 iostream 标头时,我注意到..

#include <i..

i do not see the iostream header being displayed.我没有看到显示的iostream标头。
Here's the complete .ycm_extra_conf.py file.这是完整的 .ycm_extra_conf.py 文件。
Appreciate any help.感谢任何帮助。

:
import os
import ycm_core

# These are the compilation flags that will be used in case there's no
# compilation database set (by default, one is not set).
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
flags = [
'-Wall',
'-Wextra',
'-Werror',
'-Wno-long-long',
'-Wno-variadic-macros',
'-fexceptions',
'-DNDEBUG',
# You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM
# source code needs it.
'-DUSE_CLANG_COMPLETER',
# THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
# language to use when compiling headers. So it will guess. Badly. So C++
# headers will be compiled as C headers. You don't want that so ALWAYS specify
# a "-std=<something>".
# For a C project, you would set this to something like 'c99' instead of
# 'c++11'.
'-std=c++11',
# ...and the same thing goes for the magic -x option which specifies the
# language that the files to be compiled are written in. This is mostly
# relevant for c++ headers.
# For a C project, you would set this to 'c' instead of 'c++'.
'-x',
'c++',
'-isystem',
'../BoostParts',
'-isystem',
# This path will only work on OS X, but extra paths that don't exist are not
# harmful
'/System/Library/Frameworks/Python.framework/Headers',
'-isystem',
'../llvm/include',
'-isystem',
'../llvm/tools/clang/include',
'-I',
'.',
'-I',
'./ClangCompleter',
'-isystem',
'./tests/gmock/gtest',
'-isystem',
'./tests/gmock/gtest/include',
'-isystem',
'./tests/gmock',
'-isystem',
'./tests/gmock/include',
]


# Set this to the absolute path to the folder (NOT the file!) containing the
# compile_commands.json file to use that instead of 'flags'. See here for
# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
#
# You can get CMake to generate this file for you by adding:
#   set( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
# to your CMakeLists.txt file.
#
# Most projects will NOT need to set this to anything; you can just change the
# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
compilation_database_folder = ''

if os.path.exists( compilation_database_folder ):
 database = ycm_core.CompilationDatabase( compilation_database_folder )
else:
  database = None

SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]

def DirectoryOfThisScript():
  return os.path.dirname( os.path.abspath( __file__ ) )


def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
  if not working_directory:
    return list( flags )
  new_flags = []
  make_next_absolute = False
  path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
  for flag in flags:
    new_flag = flag

    if make_next_absolute:
      make_next_absolute = False
      if not flag.startswith( '/' ):
        new_flag = os.path.join( working_directory, flag )

    for path_flag in path_flags:
      if flag == path_flag:
        make_next_absolute = True
        break

      if flag.startswith( path_flag ):
        path = flag[ len( path_flag ): ]
        new_flag = path_flag + os.path.join( working_directory, path )
        break
   if new_flag:
      new_flags.append( new_flag )
  return new_flags


def IsHeaderFile( filename ):
  extension = os.path.splitext( filename )[ 1 ]
  return extension in [ '.h', '.hxx', '.hpp', '.hh' ]


def GetCompilationInfoForFile( filename ):
  # The compilation_commands.json file generated by CMake does not have entries
  # for header files. So we do our best by asking the db for flags for a
  # corresponding source file, if any. If one exists, the flags for that file
  # should be good enough.
  if IsHeaderFile( filename ):
    basename = os.path.splitext( filename )[ 0 ]
    for extension in SOURCE_EXTENSIONS:
      replacement_file = basename + extension
      if os.path.exists( replacement_file ):
        compilation_info = database.GetCompilationInfoForFile(
          replacement_file )
        if compilation_info.compiler_flags_:
          return compilation_info
    return None
  return database.GetCompilationInfoForFile( filename )


def FlagsForFile( filename, **kwargs ):
  if database:
    # Bear in mind that compilation_info.compiler_flags_ does NOT return a
    # python list, but a "list-like" StringVec object
    compilation_info = GetCompilationInfoForFile( filename )
    if not compilation_info:
      return None
   final_flags = MakeRelativePathsInFlagsAbsolute(
      compilation_info.compiler_flags_,
      compilation_info.compiler_working_dir_ )

    # NOTE: This is just for YouCompleteMe; it's highly likely that your project
    # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
    # ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.
    try:
      final_flags.remove( '-stdlib=libc++' )
    except ValueError:
      pass
  else:
    relative_to = DirectoryOfThisScript()
    final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )

  return { 'flags': final_flags }

Solution:解决方案:

  • change directory to ycm folder将目录更改为 ycm 文件夹
  • git checkout .ycm_extra_conf.py git checkout .ycm_extra_conf.py
  • Run the following:运行以下命令:
    -- install.py –clangd-completer -- install.py --clangd-completer
    -- git pull origin master -- git pull origin master
    -- git submodule update –init --recursive -- git 子模块更新 --init --recursive

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 YouCompleteMe和C ++诊断不当错误 - YouCompleteMe and C++ diagnostics inappropriate errors C++:在 class 主体之外定义但包含在 header 保护中的成员函数的 ODR 冲突(如 YouCompleteMe 插件中所示) - C++: ODR violation for member functions defined outside of class body but enclosed within header guard (as shown in YouCompleteMe plugin) C++ 标准是否支持进程? - Does the C++ standard support processes? 在C ++中使用自动循环 - Using auto in loops c++ C++ 标准库中的哪些头文件保证包含另一个头文件? - Which headers in the C++ standard library are guaranteed to include another header? 有没有办法检测是否包含 C++ 标准库的给定 header? - Is there a way to detect if a given header of the C++ Standard Library is included? c ++ auto没有命名类型 - c++ auto does not name a type C++ 标准是否要求 C 链接函数是“noexcept”? - Does the C++ standard mandate that C-linkage functions are `noexcept`? 为什么C++标准库总是通过std::initializer_list<t> 按价值而不是按参考?</t> - Why does the C++ standard library always pass std::initializer_list<T> by value rather than by reference? 是否有任何C ++标准的计划来解决初始化列表构造函数的不一致性? - are there any plans in C++ standard to address inconsistency of initializer list constructors?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM