Использование Uncrustify с VIM

В моем vimrc я вызываю Uncrustify этой командой:

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

После этого в некотором коде я получаю Windows Fatal error:

Но когда я вызываю uncrustify для того же кода в консоли, используя опцию -f, ошибки не возникает.

Как я могу изменить свой vimrc, чтобы избежать таких ошибок в будущем? Что может вызвать эту ошибку?

3 ответа

Решение

Для правильной интеграции Uncrustify с Vim добавьте следующее в .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

Теперь вы можете сопоставить эту функцию (Uncrustify) к комбинации клавиш, или вы можете сделать удобный трюк, который я использую. Создать файл ~/.vim/after/ftplugin/cpp.vim где вы можете переопределить любые настройки Vim, особенно для C++, и добавить туда следующую строку:

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

Это в основном добавляет ловушку перед сохранением. Теперь, когда вы сохраняете файл с кодом C++, он будет автоматически отформатирован Uncrustify с использованием файла конфигурации, который вы указали ранее.

Например, то же самое можно сделать для Java: в ~/.vim/after/ftplugin/java.vim добавлять:

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

Вы поняли.

ПРИМЕЧАНИЕ: все представленное здесь хорошо проверено и используется мной каждый день.

Я обнаружил, что достаточно разместить следующий код в вашем.vimrc:

let g:uncrustifyCfgFile = '~/.uncrustify.cfg'
function! UncrustifyFunc(options) range
    exec a:firstline.','.a:lastline.'!uncrustify '.a:options
                \.' -c '.g:uncrustifyCfgFile.' -q -l '.&filetype
endfunction

command! -range=% UncrustifyRange <line1>,<line2>call UncrustifyFunc('--frag')
command! Uncrustify  let s:save_cursor = getcurpos() 
                  \| %call UncrustifyFunc('') 
                  \| call setpos('.', s:save_cursor)

Обратите внимание, это предполагает, что у вас есть двоичный файл uncrustify в вашем $PATH.

Также предполагается, что ваш файл конфигурации ~/.uncrustify.cfg, однако вы можете изменить это, изменив переменную g:uncrustifyCfgFile.

Позвонить, запустить

:Uncrustify

Он также работает с диапазонами (что и подтолкнуло меня к созданию этой функции). Пример визуального выбора:

:'<,'>UncrustifyRange

Я устал только от C, CPP и JAVA (я предполагаю, что другие тоже будут работать)

В дополнение к ответу @Alexander Shukaev добавление следующего выполнит проверку правильности расшифровки конфигурации, а не автоматического форматирования, если обнаружена ошибка:

        let output = system('uncrustify -q -c ' . a:cfgfile)

  if v:shell_error != 0
      echo output
  endif

  return v:shell_error
endfunction

" Don't forget to add Uncrustify executable to $PATH (on Unix) or 
" %PATH% (on Windows) for this command to work.
function! Uncrustify(language)
  if CheckUncrustifyCfg(g:uncrustify_cfg_file_path)
      echo "Config file" g:uncrustify_cfg_file_path "has errors"
      echo "No formatting will be performed"
      return
  endif

  call Preserve(':silent %!uncrustify'
      \ . ' -q '
      \ . ' -l ' . a:language
      \ . ' -c ' . g:uncrustify_cfg_file_path)
endfunction
Другие вопросы по тегам