X-Git-Url: https://git.rmz.io/dotfiles.git/blobdiff_plain/04b521f057e089a7f445d75f792bf7ae3a3273c6..9f8043f254153951ad032048d14d576813d85ee4:/vim/ycm_extra_conf.py diff --git a/vim/ycm_extra_conf.py b/vim/ycm_extra_conf.py index ba18821..b4202ef 100644 --- a/vim/ycm_extra_conf.py +++ b/vim/ycm_extra_conf.py @@ -1,88 +1,86 @@ -import os -import shlex -import subprocess +from glob import glob +from os import path + import ycm_core -def FlagsForFile( filename, **kwargs ): - client_data = kwargs['client_data'] - cwd = client_data['getcwd()'] - # These are the compilation flags that will be used in case there's no - # compilation database set (by default, one is not set). - flags = [ - '-Wall', - # '-Wextra', - # '-Wshadow', - # '-Werror', - # '-Wc++98-compat', - # '-Wno-long-long', - # '-Wno-variadic-macros', - # '-fexceptions', - # '-DNDEBUG', - '-std=c++11', - '-stdlib=libc++', - '-x', 'c++', - '-I', '.', - '-I', './include', - '-isystem', '/usr/include/c++/4.9.0', - '-isystem', '/usr/include/c++/4.9.0/x86_64-unknown-linux-gnu', - '-isystem', '/usr/include/c++/4.9.0/backward', - '-isystem', '/usr/lib/clang/3.4.1/include' - ] - flags += rospack() - relative_to = cwd - final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) - print flags - return { - 'flags': final_flags, - 'do_cache': True - } +def findCompilationDatabaseFolder(dir='.'): + dirs = [path.dirname(f) for f in glob(dir + '/**/compile_commands.json', + recursive=True)] + return dirs + + +def generateQtFlags(): + flags = ['-isystem', '/usr/include/qt/'] + for p in glob('/usr/include/qt/*/'): + flags += ['-isystem', p] + return flags -# This function makes it easy to pull in additional flags from rospack -def rospack(): - cmd = ['rospack', 'cflags-only-I'] - try: - out = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE).stdout - except: - return [] - line = out.readline()[:-1].split(" ") - includes = [] - for include in line: - if include.startswith(os.path.expanduser('~')): - includes += ['-I', include] - else: - includes += ['-isystem', include] - return filter(lambda a: a != ' ', includes) +def isHeader(filename): + ext = path.splitext(filename)[1] + return ext in ['.hpp', '.h'] -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 +def GetCompilationInfoForFile(database, filename): + if isHeader(filename): + basename = path.splitext(filename)[0] + for ext in ['.cpp', '.c']: + cpp_file = basename + ext + if path.exists(cpp_file): + compilation_info = database.GetCompilationInfoForFile( + cpp_file) + if compilation_info.compiler_flags_: + return compilation_info + return None + return database.GetCompilationInfoForFile(filename) - 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 +def FlagsForFile(filename, **kwargs): + client_data = kwargs['client_data'] + cwd = client_data['getcwd()'] - if flag.startswith( path_flag ): - path = flag[ len( path_flag ): ] - new_flag = path_flag + os.path.join( working_directory, path ) - break + extra_flags = [ + '-Wall', + '-Wextra', + # '-Wshadow', + # '-Werror', + # '-Wc++98-compat', + # '-Wno-long-long', + # '-Wno-variadic-macros', + # '-fexceptions', + # '-DNDEBUG', + ] - if new_flag: - new_flags.append( new_flag ) - return new_flags + folders = findCompilationDatabaseFolder(cwd) + if not folders: + folder = None + else: + folder = folders[0] + if len(folders) > 1: + print("Multiple compilation databases found!") + print(folders) + print("Selecting first: %s" % (folder)) + + if folder: + database = ycm_core.CompilationDatabase(folder) + compilation_info = GetCompilationInfoForFile(database, filename) + if not compilation_info: + return None + flags = list(compilation_info.compiler_flags_) + else: + flags = [ + '-std=c++14', + '-stdlib=libstdc++', + '-x', 'c++', + '-isystem', '/usr/include', + '-isystem', '/usr/local/include', + '-I', cwd, + '-I', cwd + '/include', + ] + flags += generateQtFlags() + return { + 'flags': flags + extra_flags, + 'do_cache': True + }