From b5aad9d9909f64bcf2d5a2ac53f732b6da59065e Mon Sep 17 00:00:00 2001
From: Tomas Pecka <peckato1@fit.cvut.cz>
Date: Fri, 10 Feb 2017 16:51:59 +0100
Subject: [PATCH] vim:YouCompleteMe conf file

---
 .gitignore         |   1 -
 .ycm_extra_conf.py | 130 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 130 insertions(+), 1 deletion(-)
 create mode 100644 .ycm_extra_conf.py

diff --git a/.gitignore b/.gitignore
index f2173098e4..ec9d7e5ef7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,7 +28,6 @@
 # vim backup and swap files
 *~
 *.swp
-.ycm_extra_conf.py*
 
 bin/*
 bin-release/*
diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py
new file mode 100644
index 0000000000..b75f5e4dd1
--- /dev/null
+++ b/.ycm_extra_conf.py
@@ -0,0 +1,130 @@
+# Partially stolen from https://bitbucket.org/mblum/libgp/src/2537ea7329ef/.ycm_extra_conf.py
+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 = [
+    '-pipe',
+    '-std=c++11',
+    '-g',
+    '-O0',
+    '-DDEBUG',
+    '-c',
+    '-Wall',
+    '-pedantic',
+    '-Wextra',
+    '-Werror',
+    '-Wshadow',
+    '-Wpointer-arith',
+    '-Wcast-qual',
+    '-Wdelete-non-virtual-dtor',
+    '-Wredundant-decls',
+    '-fPIC',
+
+    '-x', 'c++',
+
+    '-I./alib2algo/src',
+    '-I./alib2common/src',
+    '-I./alib2data/src',
+    '-I./alib2elgo/src',
+    '-I./alib2measurepp/src',
+    '-I./alib2raw/src',
+    '-I./alib2std/src',
+    '-I./alib2str/src',
+]
+
+# 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
+#
+# 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 compilation_database_folder:
+    database = ycm_core.CompilationDatabase(compilation_database_folder)
+else:
+    database = None
+
+SOURCE_EXTENSIONS = ['.cpp', '.c', '.cxx']
+
+
+def DirectoryOfThisScript():
+    return os.path.dirname(os.path.abspath(__file__))
+
+
+def IsHeaderFile(filename):
+    extension = os.path.splitext(filename)[1]
+    return extension in ['.h', '.hxx', '.hpp', '.hh']
+
+
+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 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_)
+
+    else:
+        relative_to = DirectoryOfThisScript()
+        final_flags = MakeRelativePathsInFlagsAbsolute(flags, relative_to)
+
+    return {
+        'flags': final_flags,
+        'do_cache': True
+    }
-- 
GitLab