From d8f3aa5d508296bd2847b89a4f668cf5a89e399c Mon Sep 17 00:00:00 2001 From: kongo2002 Date: Tue, 27 Mar 2012 22:15:06 +0200 Subject: [PATCH 1/3] add ReadConfig() function for C/C++ checkers --- autoload/syntastic/c.vim | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/autoload/syntastic/c.vim b/autoload/syntastic/c.vim index 73623b15..49f7099e 100644 --- a/autoload/syntastic/c.vim +++ b/autoload/syntastic/c.vim @@ -65,6 +65,41 @@ function! syntastic#c#GetIncludeDirs(filetype) return join(map(s:Unique(include_dirs), '"-I" . v:val'), ' ') endfunction +" read additional compiler flags from the given configuration file +" the file format and its parsing mechanism is inspired by clang_complete +function! syntastic#c#ReadConfig(file) + " search in the current file's directory upwards + let config = findfile(a:file, '.;') + if config == '' || !filereadable(config) | return '' | endif + + " convert filename into absolute path + let filepath = substitute(fnamemodify(config, ':p:h'), '\', '/', 'g') + + " try to read config file + try + let lines = map(readfile(config), + \ 'substitute(v:val, ''\'', ''/'', ''g'')') + catch /E484/ + return '' + endtry + + let parameters = [] + for line in lines + let matches = matchlist(line, '^\s*-I\s*\(\S\+\)') + if matches != [] && matches[1] != '' + " this one looks like an absolute path + if match(matches[1], '^\%(/\|\a:\)') != -1 + call add(parameters, '-I' . matches[1]) + else + call add(parameters, '-I' . filepath . '/' . matches[1]) + endif + else + call add(parameters, line) + endif + endfor + + return join(parameters, ' ') +endfunction " search the first 100 lines for include statements that are " given in the handlers dictionary From c791c3103e160f489931e2875007204b2fd5ed52 Mon Sep 17 00:00:00 2001 From: kongo2002 Date: Tue, 27 Mar 2012 22:26:15 +0200 Subject: [PATCH 2/3] add ReadConfig support to C syntax checker --- syntax_checkers/c.vim | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/syntax_checkers/c.vim b/syntax_checkers/c.vim index c20b68d0..8da23f31 100644 --- a/syntax_checkers/c.vim +++ b/syntax_checkers/c.vim @@ -46,6 +46,13 @@ " " let g:syntastic_c_compiler_options = ' -ansi' " +" Additionally the setting 'g:syntastic_c_config_file' allows you to define a +" file that contains additional compiler arguments like include directories or +" CFLAGS. The file is expected to contain one option per line. If none is +" given the filename defaults to '.syntastic_c_config': +" +" let g:syntastic_c_config_file = '.config' +" " Using the global variable 'g:syntastic_c_remove_include_errors' you can " specify whether errors of files included via the g:syntastic_c_include_dirs' " setting are removed from the result set: @@ -68,6 +75,10 @@ if !exists('g:syntastic_c_compiler_options') let g:syntastic_c_compiler_options = '-std=gnu99' endif +if !exists('g:syntastic_c_config_file') + let g:syntastic_c_config_file = '.syntastic_c_config' +endif + function! SyntaxCheckers_c_GetLocList() let makeprg = 'gcc -fsyntax-only ' let errorformat = '%-G%f:%s:,%-G%f:%l: %#error: %#(Each undeclared '. @@ -113,6 +124,9 @@ function! SyntaxCheckers_c_GetLocList() let makeprg .= b:syntastic_c_cflags endif + " add optional config file parameters + let makeprg .= syntastic#c#ReadConfig(g:syntastic_c_config_file) + " process makeprg let errors = SyntasticMake({ 'makeprg': makeprg, \ 'errorformat': errorformat }) From 0f1ea022e96f972a0d5287d79be1ed254e89dce5 Mon Sep 17 00:00:00 2001 From: kongo2002 Date: Tue, 27 Mar 2012 22:28:35 +0200 Subject: [PATCH 3/3] add ReadConfig to C++ checker as well --- syntax_checkers/cpp.vim | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/syntax_checkers/cpp.vim b/syntax_checkers/cpp.vim index 7fe2e0ec..20528e47 100644 --- a/syntax_checkers/cpp.vim +++ b/syntax_checkers/cpp.vim @@ -46,6 +46,13 @@ " " let g:syntastic_cpp_compiler_options = ' -std=c++0x' " +" Additionally the setting 'g:syntastic_cpp_config_file' allows you to define +" a file that contains additional compiler arguments like include directories +" or CFLAGS. The file is expected to contain one option per line. If none is +" given the filename defaults to '.syntastic_cpp_config': +" +" let g:syntastic_cpp_config_file = '.config' +" " Using the global variable 'g:syntastic_cpp_remove_include_errors' you can " specify whether errors of files included via the " g:syntastic_cpp_include_dirs' setting are removed from the result set: @@ -64,6 +71,10 @@ endif let s:save_cpo = &cpo set cpo&vim +if !exists('g:syntastic_cpp_config_file') + let g:syntastic_cpp_config_file = '.syntastic_cpp_config' +endif + function! SyntaxCheckers_cpp_GetLocList() let makeprg = 'g++ -fsyntax-only ' let errorformat = '%-G%f:%s:,%f:%l:%c: %m,%f:%l: %m' @@ -101,6 +112,9 @@ function! SyntaxCheckers_cpp_GetLocList() let makeprg .= b:syntastic_cpp_cflags endif + " add optional config file parameters + let makeprg .= syntastic#c#ReadConfig(g:syntastic_cpp_config_file) + " process makeprg let errors = SyntasticMake({ 'makeprg': makeprg, \ 'errorformat': errorformat })