From: Samir Benmendil Date: Sun, 14 May 2017 21:25:02 +0000 (+0100) Subject: vim: update ycm_extra_conf with my changes X-Git-Url: https://git.rmz.io/dotfiles.git/commitdiff_plain/6fe984608fd817c0f222e0768d8b2696c557c2a0 vim: update ycm_extra_conf with my changes --- diff --git a/vim/ycm_extra_conf.py b/vim/ycm_extra_conf.py index f02f017..deeac5e 100644 --- a/vim/ycm_extra_conf.py +++ b/vim/ycm_extra_conf.py @@ -1,17 +1,31 @@ # https://github.com/Valloric/ycmd/blob/master/cpp/ycm/.ycm_extra_conf.py # https://jonasdevlieghere.com/a-better-youcompleteme-config/ +# https://github.com/arximboldi/dotfiles/blob/master/emacs/.ycm_extra_conf.py import os import os.path +from glob import glob import logging import ycm_core BASE_FLAGS = [ '-Wall', '-std=c++1z', - '-xc++', - '-I/usr/lib/' - '-I/usr/include/' + '-x', 'c++', + '-isystem', '/usr/include', + '-isystem', '/usr/local/include', +] + +EXTRA_FLAGS = [ + '-Wall', + '-Wextra', + # '-Wshadow', + # '-Werror', + # '-Wc++98-compat', + # '-Wno-long-long', + # '-Wno-variadic-macros', + # '-fexceptions', + # '-DNDEBUG', ] SOURCE_EXTENSIONS = [ @@ -30,9 +44,37 @@ HEADER_EXTENSIONS = [ '.hh' ] + +# Implementation taken from +# https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Python +def levenshtein(s, t): + ''' From Wikipedia article; Iterative with two matrix rows. ''' + if s == t: return 0 + elif len(s) == 0: return len(t) + elif len(t) == 0: return len(s) + v0 = [None] * (len(t) + 1) + v1 = [None] * (len(t) + 1) + for i in range(len(v0)): + v0[i] = i + for i in range(len(s)): + v1[0] = i + 1 + for j in range(len(t)): + cost = 0 if s[i] == t[j] else 1 + v1[j + 1] = min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost) + for j in range(len(v0)): + v0[j] = v1[j] + + return v1[len(t)] + +def generate_qt_flags(): + flags = ['-isystem', '/usr/include/qt/'] + for p in glob('/usr/include/qt/*/'): + flags += ['-isystem', p] + return flags + + def find_similar_file_in_database(dbpath, filename): import json - import Levenshtein logging.info("Trying to find some file close to: " + filename) db = json.load(open(dbpath)) best_filename = '' @@ -40,7 +82,7 @@ def find_similar_file_in_database(dbpath, filename): for entry in db: entry_filename = os.path.normpath( os.path.join(entry["directory"], entry["file"])) - distance = Levenshtein.distance(str(filename), str(entry_filename)) + distance = levenshtein(str(filename), str(entry_filename)) if distance < best_distance: best_filename = entry_filename best_distance = distance @@ -68,6 +110,24 @@ def get_compilation_info_for_file(dbpath, database, filename): logging.info("Replacing header with: " + replacement_file) return database.GetCompilationInfoForFile(replacement_file) + +def find_nearest_compilation_database(root='.'): + dirs = glob(root + '/*/compile_commands.json', recursive=True) + + if len(dirs) == 1: + return dirs[0] + elif len(dirs) > 1: + logging.info("Multiple compilation databases found!") + logging.info(dirs) + logging.info("Selecting first: %s" % (dir)) + return dirs[0] + + parent = os.path.dirname(os.path.abspath(root)) + if parent == root: + raise RuntimeError("Could not find compile_commands.json") + return find_nearest_compilation_database(parent) + + def find_nearest(path, target): candidates = [ os.path.join(path, target), @@ -83,6 +143,7 @@ def find_nearest(path, target): raise RuntimeError("Could not find " + target) return find_nearest(parent, target) + def make_relative_paths_in_flags_absolute(flags, working_directory): if not working_directory: return list(flags) @@ -107,15 +168,6 @@ def make_relative_paths_in_flags_absolute(flags, working_directory): new_flags.append(new_flag) return new_flags -def flags_for_clang_complete(root): - try: - clang_complete_path = find_nearest(root, '.clang_complete') - clang_complete_flags = open(clang_complete_path, 'r').read().splitlines() - return clang_complete_flags - except Exception, err: - logging.info("Error while looking flags for .clang_complete in root: " + root) - logging.error(err) - return None def flags_for_include(root): try: @@ -126,14 +178,15 @@ def flags_for_include(root): real_path = os.path.join(dirroot, dir_path) flags = flags + ["-I" + real_path] return flags - except Exception, err: + except Exception as err: logging.info("Error while looking flags for includes in root: " + root) logging.error(err) return None + def flags_for_compilation_database(root, filename): try: - compilation_db_path = find_nearest(root, 'compile_commands.json') + compilation_db_path = find_nearest_compilation_database(root) compilation_db_dir = os.path.dirname(compilation_db_path) logging.info("Set compilation database directory to " + compilation_db_dir) compilation_db = ycm_core.CompilationDatabase(compilation_db_dir) @@ -148,27 +201,31 @@ def flags_for_compilation_database(root, filename): return make_relative_paths_in_flags_absolute( compilation_info.compiler_flags_, compilation_info.compiler_working_dir_) - except Exception, err: + except Exception as err: logging.info("Error while trying to get flags for " + filename + " in compilation database") logging.error(err) return None -def flags_for_file(filename): - root = os.path.realpath(filename) + +def FlagsForFile(filename, **kwargs): + client_data = kwargs['client_data'] + root = client_data['getcwd()'] + compilation_db_flags = flags_for_compilation_database(root, filename) if compilation_db_flags: final_flags = compilation_db_flags else: final_flags = BASE_FLAGS - clang_flags = flags_for_clang_complete(root) - if clang_flags: - final_flags = final_flags + clang_flags include_flags = flags_for_include(root) if include_flags: final_flags = final_flags + include_flags + + final_flags += generate_qt_flags() + final_flags += [ + '-I', root, + '-I', root + '/include', + ] return { - 'flags': final_flags, + 'flags': final_flags + EXTRA_FLAGS, 'do_cache': True } - -FlagsForFile = flags_for_file