summary refs log tree commit diff
path: root/.vim/after/ftplugin/c.vim
blob: 85ff8a282f45626752e11b6a64d8bb7fd5533f50 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
setlocal cindent

setlocal foldmethod=syntax
setlocal foldlevel=10

if exists('g:loaded_gutentags')
    let g:gutentags_enabled = 1
endif

" toggle between header and implementation in c/cpp
function! Alternate_c()
    let file = expand('%')
    if match(file, '\.c') > 0
        exe ':e %<.h'
    elseif match(file, '\.h') > 0
        exe ':e %<.c'
    endif
endfunction

nmap <Leader>a :call alternate#alternate()

" source: https://github.com/igankevich/mesonic/blob/master/plugin/meson.vim
function! MesonProjectDir()
    let l:dir = getcwd()      " a starting directory to look for meson.build file
    let l:project_dir = l:dir " the top-most directory with meson.build file
    let l:nesting = 100       " maximal no. of subdirectories in a project

    " find top-most directory with readable meson.build file
    while fnamemodify(l:dir, ':p') !=# '/' && l:nesting > 0
	    if filereadable(l:dir . '/' . 'meson.build')
		    let l:project_dir = l:dir
	    endif
	    let l:dir = l:dir . '/..'
	    let l:nesting = l:nesting - 1
    endwhile

    " why one needs to do it two times?
    let l:project_dir = fnamemodify(l:project_dir, ':p')
    let l:project_dir = fnamemodify(l:project_dir, ':p')
    return l:project_dir
endfunction

if exists('g:loaded_neomake')
    function! s:ninja_InitForJob(_jobinfo) dict
	" set cwd to project dir
	if !has_key(self, 'cwd')
	    let self.cwd = MesonProjectDir()
	endif
	" generate new error format lines
	" source: https://github.com/igankevich/mesonic/blob/master/compiler/meson.vim#L67
	if !has_key(self, 'errorformat')
	    let g:meson_error_format = [
	    \ '%EMeson encountered an error in file ' . l:project_subdir . '%f\, line %l\, column %c:,%Z%m',
	    \ '%Dninja: Entering directory `%f''',
	    \ '%f:%l.%c-%[%^:]%#: %t%[%^:]%#: %m'
	    \ ]
	    let self.errorformat = join(g:meson_error_format, ',')
	endif
	return self
    endfunction
    function! s:ninja_postprocess(entry)
	if empty(a:entry.type)
	    let a:entry.type = 'E'
	endif
    endfunction
    let g:neomake_c_ninja_maker = {
    \ 'exe': 'ninja',
    \ 'args': ['-C', 'build'],
    \ 'append_file': 0,
    \ 'postprocess': function('s:ninja_postprocess'),
    \ 'InitForJob': function('s:ninja_InitForJob'),
    \ }
    let g:neomake_c_ninjaclean_maker = {
    \ 'exe': 'ninja',
    \ 'args': ['-C', 'build', 'clean'],
    \ 'append_file': 0,
    \ 'postprocess': function('s:ninja_postprocess'),
    \ 'InitForJob': function('s:ninja_InitForJob'),
    \ }
    let g:neomake_c_enabled_makers = ['ninja']
endif