Использование 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