]> git.rmz.io Git - dotfiles.git/blobdiff - vim/ycm_extra_conf.py
vim: add ftplugin/c with fswitch and ycm goto bindings
[dotfiles.git] / vim / ycm_extra_conf.py
index 0e3b5da74524f743d1fb83162c44a49bf06db33d..b4202ef2c8cd69ac15f977c4acd1581a01a0ae06 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 = ['-isystem', '/usr/include/qt/']
+    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,49 +50,37 @@ def FlagsForFile(filename, **kwargs):
         # '-Wno-variadic-macros',
         # '-fexceptions',
         # '-DNDEBUG',
-        '-std=c++11',
-        '-stdlib=libstdc++',
-        '-x', 'c++',
-        '-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