X-Git-Url: https://git.rmz.io/dotfiles.git/blobdiff_plain/7766518825040eacb1c168c3bb004d22d2d73f30..b47ffe60e244c9165f40371736079320ea2d848b:/vim/ftplugin/cpp.vim diff --git a/vim/ftplugin/cpp.vim b/vim/ftplugin/cpp.vim index cb3d9bd..19850a7 100644 --- a/vim/ftplugin/cpp.vim +++ b/vim/ftplugin/cpp.vim @@ -1,5 +1,3 @@ -setlocal foldmethod=syntax - setlocal textwidth=100 " indent 4 spaces @@ -8,15 +6,100 @@ setlocal tabstop=4 setlocal softtabstop=4 setlocal expandtab +"TODO these are ignored because we set indentexpr in `indent/cpp.vim` +" Ideally, indentexpr should read the settings from .clang-format if it exists setlocal nosmartindent setlocal autoindent setlocal cinkeys-=0# " don't reindent PP directives setlocal cinoptions+=:0 " don't indent case labels " Load the doxygen syntax -let g:load_doxygen_syntax=1 +let b:load_doxygen_syntax = 1 -augroup fswitch - au BufEnter *.h let b:fswitchdst = 'cpp,c' - au BufEnter *.h let b:fswitchlocs = 'reg:/include/source/' +augroup fswitch_cpp + au! + au BufEnter *.h let b:fswitchdst = 'cpp,cc,c' + au BufEnter *.h let b:fswitchlocs = '.,reg:|include.*|src|' + au BufEnter *.hpp let b:fswitchdst = 'cpp,c' + au BufEnter *.hpp let b:fswitchlocs = '.,reg:|include.*|src|' + au BufEnter *.cpp let b:fswitchdst = 'hpp,h' + au BufEnter *.cpp let b:fswitchlocs = '.,reg:|src|include/**|' augroup END + +let g:switch_custom_definitions = + \ [ + \ ['EXPECT_FALSE', 'EXPECT_TRUE'], + \ ['EXPECT_EQ', 'EXPECT_NE'], + \ ['EXPECT_LT', 'EXPECT_GT'], + \ ['ASSERT_FALSE', 'ASSERT_TRUE'], + \ ['ASSERT_EQ', 'ASSERT_NE'], + \ ['ASSERT_LT', 'ASSERT_GT'] + \ ] + +let g:switch_const_definitions = + \ [ { + \ '\%(const \)\@!\([[:alnum:]_:<>]\{-}\) \%(&\)\@!': 'const \1 ', + \ 'const \([[:alnum:]_:<>]\{-}\) &\@!': 'const \1 &' , + \ 'const \([[:alnum:]_:<>]\{-}\) &': '\1 ' + \ } ] + +nnoremap c :call switch#Switch({'definitions': g:switch_const_definitions}) + +setlocal errorformat= +" TODO I don't remember these errorformat or what they match, maybe CMake? {{{ +setlocal errorformat+=\ %##%n\ %m\ %f:%l:%c +setlocal errorformat+=\ %##%n\ %m\ %f +setlocal errorformat+=%n +"}}} +setlocal errorformat+=%f:%l:%c:\ %trror:\ %m +setlocal errorformat+=%f:%l:%c:\ %tarning:\ %m +setlocal errorformat+=%D%*\\a[%*\\d]:\ Entering\ directory\ [`']%f' +setlocal errorformat+=%X%*\\a[%*\\d]:\ Leaving\ directory\ [`']%f' +setlocal errorformat+=%D%*\\a:\ Entering\ directory\ [`']%f' +setlocal errorformat+=%X%*\\a:\ Leaving\ directory\ [`']%f' +setlocal errorformat+=%*[^[]\[%tRROR\]%m\ \[%f:%l\] +setlocal errorformat+=%*[^[]\[%tARNING\]%m\ \[%f:%l\] + +packadd termdebug +let g:termdebug_wide = 1 +function! s:Debug(...) + tabedit % + let t:debug_tab=1 + au BufDelete !gdb ++once if exists('t:debug_tab') | tabclose | endif + + "TODO restore mappings + "TODO make mappings local to source buffer + nnoremap :call TermDebugSendCommand('advance -source '.expand('%').' -line '.line(".")) + nnoremap :Step + nnoremap :Over + nnoremap :Finish +endfunction +command! -nargs=* -complete=file -bang Debug call Debug() | Termdebug +command! -nargs=+ -complete=file -bang DebugCommand call Debug() | TermdebugCommand + +setlocal foldmethod=syntax +" set foldlevel according to number of matches of 'namespace' and 'class' not +" containing ';' +function! InitialFoldLevel() + let v:errmsg = "" + keepjumps keeppatterns silent! 1,/}/s/^\(namespace\|class\) \+[^;]*$//n + if v:errmsg == "" + let &l:foldlevel=str2nr(split(v:statusmsg)[0]) + endif +endf +call InitialFoldLevel() + +function! MyCppFoldText() + let l:line = getline(v:foldstart) + " expand tabs in line, foldtext does not do it on its own + let l:line = substitute(l:line, "\t", repeat(" ", shiftwidth()), "g") + let l:width = min([&textwidth, winwidth(0)]) + let l:lineinfo = printf("%d", v:foldend - v:foldstart) + let l:ellipsis = "…" + return printf("%.*s%s%*d", + \ l:width - strdisplaywidth(l:ellipsis..l:lineinfo), l:line, + \ l:ellipsis, + \ l:width - strdisplaywidth(l:line..l:ellipsis), l:lineinfo) +endfunction +setlocal foldtext=MyCppFoldText() +setlocal fillchars+=fold:\