]> git.rmz.io Git - dotfiles.git/commitdiff
vim: global ycm_extra_conf
authorSamir Benmendil <samir.benmendil@ultrahaptics.com>
Mon, 24 Oct 2016 08:14:28 +0000 (09:14 +0100)
committerSamir Benmendil <samir.benmendil@ultrahaptics.com>
Mon, 24 Oct 2016 08:14:28 +0000 (09:14 +0100)
This will search for a compile_commands.json file in any subdirectory
and use that to get flags.

Revert to some simple default flags.

vim/ycm_extra_conf.py

index f0e3679a8182bb48a2189e894b5bbc1471089497..b262265c28b19c1d13e2446bdb42b0800cf34cca 100644 (file)
@@ -1,13 +1,48 @@
-import os
+from glob import glob
+from os import path
+
+import ycm_core
+
+
+def findCompilationDatabaseFolder(dir='.'):
+    dirs = [path.dirname(f) for f in glob(dir + '/**/compile_commands.json',
+                                          recursive=True)]
+    return dirs
+
+
+def generateQtFlags():
+    flags = []
+    for p in glob('/usr/include/qt/*/'):
+        flags += ['-isystem', p]
+    return flags
+
+
+def isHeader(filename):
+    ext = path.splitext(filename)[1]
+    return ext in ['.hpp', '.h']
+
+
+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)
 
 
 def FlagsForFile(filename, **kwargs):
     client_data = kwargs['client_data']
     cwd = client_data['getcwd()']
 
-    flags = [
+    extra_flags = [
         '-Wall',
-        '-Wextra',
+        '-Wextra',
         # '-Wshadow',
         # '-Werror',
         # '-Wc++98-compat',
@@ -15,52 +50,37 @@ def FlagsForFile(filename, **kwargs):
         # '-Wno-variadic-macros',
         # '-fexceptions',
         # '-DNDEBUG',
-        '-std=c++14',
-        '-stdlib=libstdc++',
-        '-x', 'c++',
-        '-isystem', '/usr/include',
-        '-isystem', '/usr/local/include',
-        '-isystem', '/usr/include/qt',
-        '-I', '.',
-        '-I', './include',
     ]
-    relative_to = cwd
-    final_flags = MakeRelativePathsInFlagsAbsolute(flags, relative_to)
+
+    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': final_flags,
+        'flags': flags + extra_flags,
         'do_cache': True
     }
-
-
-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