Merge pull request #220 from kongo2002/c_config

Add configuration file support for C/C++
This commit is contained in:
Martin Grenfell 2012-03-28 04:27:02 -07:00
commit e961f17c7c
3 changed files with 63 additions and 0 deletions

View File

@ -65,6 +65,41 @@ function! syntastic#c#GetIncludeDirs(filetype)
return join(map(s:Unique(include_dirs), '"-I" . v:val'), ' ') return join(map(s:Unique(include_dirs), '"-I" . v:val'), ' ')
endfunction 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 " search the first 100 lines for include statements that are
" given in the handlers dictionary " given in the handlers dictionary

View File

@ -46,6 +46,13 @@
" "
" let g:syntastic_c_compiler_options = ' -ansi' " 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 " 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' " specify whether errors of files included via the g:syntastic_c_include_dirs'
" setting are removed from the result set: " 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' let g:syntastic_c_compiler_options = '-std=gnu99'
endif endif
if !exists('g:syntastic_c_config_file')
let g:syntastic_c_config_file = '.syntastic_c_config'
endif
function! SyntaxCheckers_c_GetLocList() function! SyntaxCheckers_c_GetLocList()
let makeprg = 'gcc -fsyntax-only ' let makeprg = 'gcc -fsyntax-only '
let errorformat = '%-G%f:%s:,%-G%f:%l: %#error: %#(Each undeclared '. 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 let makeprg .= b:syntastic_c_cflags
endif endif
" add optional config file parameters
let makeprg .= syntastic#c#ReadConfig(g:syntastic_c_config_file)
" process makeprg " process makeprg
let errors = SyntasticMake({ 'makeprg': makeprg, let errors = SyntasticMake({ 'makeprg': makeprg,
\ 'errorformat': errorformat }) \ 'errorformat': errorformat })

View File

@ -46,6 +46,13 @@
" "
" let g:syntastic_cpp_compiler_options = ' -std=c++0x' " 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 " Using the global variable 'g:syntastic_cpp_remove_include_errors' you can
" specify whether errors of files included via the " specify whether errors of files included via the
" g:syntastic_cpp_include_dirs' setting are removed from the result set: " g:syntastic_cpp_include_dirs' setting are removed from the result set:
@ -64,6 +71,10 @@ endif
let s:save_cpo = &cpo let s:save_cpo = &cpo
set cpo&vim set cpo&vim
if !exists('g:syntastic_cpp_config_file')
let g:syntastic_cpp_config_file = '.syntastic_cpp_config'
endif
function! SyntaxCheckers_cpp_GetLocList() function! SyntaxCheckers_cpp_GetLocList()
let makeprg = 'g++ -fsyntax-only ' let makeprg = 'g++ -fsyntax-only '
let errorformat = '%-G%f:%s:,%f:%l:%c: %m,%f:%l: %m' 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 let makeprg .= b:syntastic_cpp_cflags
endif endif
" add optional config file parameters
let makeprg .= syntastic#c#ReadConfig(g:syntastic_cpp_config_file)
" process makeprg " process makeprg
let errors = SyntasticMake({ 'makeprg': makeprg, let errors = SyntasticMake({ 'makeprg': makeprg,
\ 'errorformat': errorformat }) \ 'errorformat': errorformat })