diff --git a/vim/ycm_global_conf.py b/vim/ycm_global_conf.py new file mode 100755 index 0000000..75a4162 --- /dev/null +++ b/vim/ycm_global_conf.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- + +import os +import subprocess +import re + + +def LoadSystemIncludes( filetype ): + regex = re.compile(r'(?:\#include \<...\> search starts here\:)(?P.*?)(?:End of search list)', re.DOTALL) + process = subprocess.Popen(['clang', '-v', '-E', '-x', filetype, '-'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + process_out, process_err = process.communicate('') + output = process_out + process_err + includes = [] + for p in re.search(regex, output.decode('utf-8')).group('list').split('\n'): + p = p.strip() + if len(p) > 0 and p.find('(framework directory)') < 0: + includes.append('-isystem') + includes.append(p) + return includes + + +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 + + +def FlagsForFile(filename, **kwargs): + base_flags = [ + '-Wall', + '-Wextra', + '-Werror' + '-pedantic', + '-I', + '.' + ] + extra_flags = [] + + data = kwargs['client_data'] + filetype = data['&filetype'] + + if filetype == 'c': + language = 'c' + elif filetype == 'cpp': + language = 'c++' + extra_flags += ['-std=c++11'] + elif filetype == 'objc': + language = 'objective-c' + + flags = base_flags + extra_flags + ['-x', language] + LoadSystemIncludes(language) + + relative_to = DirectoryOfThisScript() + final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) + + return { + 'flags': final_flags +} diff --git a/vimrc b/vimrc index eda4294..67dba49 100644 --- a/vimrc +++ b/vimrc @@ -61,9 +61,9 @@ if has("unix") || has("mac") map ll :Latexmk if isdirectory(expand("$HOME/.vim/bundle/YouCompleteMe")) "[Workaround for YCM non-portability]" - "No need for Plugin 'Valloric/YouCompleteMe', it's installed system-wide - let g:ycm_global_ycm_extra_conf = '$HOME/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py' - let g:ycm_server_python_interpreter = '/usr/bin/python2' + Plugin 'Valloric/YouCompleteMe' + let g:ycm_global_ycm_extra_conf = expand("$HOME/.vim/ycm_global_conf.py") + let g:ycm_extra_conf_vim_data =[ "&filetype" ] "[We're using ale for linting]" let g:ycm_show_diagnostics_ui = 0 let g:ycm_collect_identifiers_from_tags_files=1