]> 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 7a6ca96b4a4e328ee75a082ee15b0c84c17fd007..b4202ef2c8cd69ac15f977c4acd1581a01a0ae06 100644 (file)
@@ -1,83 +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++14',
-  '-stdlib=libstdc++',
-  '-x', 'c++',
-  '-I', '.',
-  '-I', './include',
-  ]
-  flags += rospack()
-  relative_to = cwd
-  final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
 
-  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
+    }