Search code examples
vimuncrustify

Using Uncrustify with VIM


In my vimrc I call Uncrustify by this command:

%!uncrustify -l CPP -c D:\uncrustify\default.cfg

After that on some code I get a Windows Fatal error:

But when I call uncrustify on the same code in the console using the -f option, there is no error.

How can I change my vimrc to avoid such errors in the future? What can invoke this error?


Solution

  • In order to integrate Uncrustify with Vim properly, add the following to your .vimrc:

    " Restore cursor position, window position, and last search after running a
    " command.
    function! Preserve(command)
      " Save the last search.
      let search = @/
    
      " Save the current cursor position.
      let cursor_position = getpos('.')
    
      " Save the current window position.
      normal! H
      let window_position = getpos('.')
      call setpos('.', cursor_position)
    
      " Execute the command.
      execute a:command
    
      " Restore the last search.
      let @/ = search
    
      " Restore the previous window position.
      call setpos('.', window_position)
      normal! zt
    
      " Restore the previous cursor position.
      call setpos('.', cursor_position)
    endfunction
    
    " Specify path to your Uncrustify configuration file.
    let g:uncrustify_cfg_file_path =
        \ shellescape(fnamemodify('~/.uncrustify.cfg', ':p'))
    
    " Don't forget to add Uncrustify executable to $PATH (on Unix) or 
    " %PATH% (on Windows) for this command to work.
    function! Uncrustify(language)
      call Preserve(':silent %!uncrustify'
          \ . ' -q '
          \ . ' -l ' . a:language
          \ . ' -c ' . g:uncrustify_cfg_file_path)
    endfunction
    

    Now you can either map this function (Uncrustify) to a combination of keys or you could do the convenient trick that I use. Create a file ~/.vim/after/ftplugin/cpp.vim where you can override any Vim settings particularly for C++ and add the following line there:

    autocmd BufWritePre <buffer> :call Uncrustify('cpp')
    

    This basically adds a pre-save hook. Now when you save the file with C++ code it will be automatically formatted by Uncrustify utilizing the configuration file you supplied earlier.

    For example, the same could be done for Java: in ~/.vim/after/ftplugin/java.vim add:

    autocmd BufWritePre <buffer> :call Uncrustify('java')
    

    You got the point.

    NOTE: Everything presented here is well-tested and used every day by me.