Add config file detection for clang-format.
Also - add CurrentFormatter command. - more verbosity. - update readme.
This commit is contained in:
parent
29e088848a
commit
d704fd1647
14
README.md
14
README.md
@ -67,7 +67,9 @@ au BufWrite * :Autoformat
|
||||
|
||||
For each filetype, vim-autoformat has a list of applicable formatters.
|
||||
If you have multiple formatters installed that are supported for some filetype, vim-autoformat just uses the first that occurs in this list of applicable formatters.
|
||||
You can either set this list manually in your vimrc (see section *How can I change the behaviour of formatters, or add one myself?*, or change the formatter with the highest priority by the commands `:NextFormatter` and `:PreviousFormatter`.
|
||||
You can either set this list manually in your vimrc (see section *How can I change the behaviour of formatters, or add one myself?*,
|
||||
or change the formatter with the highest priority by the commands `:NextFormatter` and `:PreviousFormatter`.
|
||||
To print the currently selected formatter use `:CurrentFormatter`.
|
||||
If you have a composite filetype with dots (like `django.python` or `php.wordpress`), vim-autoformat first tries to detect and use formatters for the exact original filetype, and then tries the same for all supertypes occuring from left to right in the original filetype separated by dots (`.`).
|
||||
|
||||
Default formatprograms
|
||||
@ -75,9 +77,11 @@ Default formatprograms
|
||||
Here is a list of formatprograms that are supported by default, and thus will be detected and used by vim when they are installed properly.
|
||||
|
||||
* `clang-format` for __C__, __C++__, __Objective-C__ (supports formatting ranges).
|
||||
clang-format is a product of LLVM source builds.
|
||||
Clang-format is a product of LLVM source builds.
|
||||
If you `brew install llvm`, clang-format can be found in /usr/local/Cellar/llvm/bin/.
|
||||
To load style configuration from a .clang-format file, add to your .vimrc: `let g:formatdef_clangformat_objc = '"clang-format -style=file"'`.
|
||||
Vim-autoformat checks whether there exists a `.clang-format` or a `_clang-format` file up in
|
||||
the current directory's ancestry. Based on that it eithers uses that file or tries to match
|
||||
vim options as much as possible.
|
||||
Details: http://clang.llvm.org/docs/ClangFormat.html.
|
||||
|
||||
* `astyle` for __C#__, __C++__, __C__ and __Java__.
|
||||
@ -203,7 +207,9 @@ would then only format the selected part.
|
||||
If you're struggling with getting a formatter to work, it may help to set vim-autoformat in
|
||||
verbose-mode. Vim-autoformat will then output errors on formatters that failed.
|
||||
```vim
|
||||
let g:autoformat_verbosemode = 1
|
||||
let g:autoformat_verbosemode=1
|
||||
" OR:
|
||||
let verbose=1
|
||||
```
|
||||
To read all messages in a vim session type `:messages`.
|
||||
|
||||
|
@ -58,6 +58,9 @@ endfunction
|
||||
" Try all formatters, starting with the currently selected one, until one
|
||||
" works. If none works, autoindent the buffer.
|
||||
function! s:TryAllFormatters(...) range
|
||||
" Detect verbosity
|
||||
let verbose = &verbose || exists("g:autoformat_verbosemode")
|
||||
|
||||
" Make sure formatters are defined and detected
|
||||
if !call('<SID>find_formatters', a:000)
|
||||
" No formatters defined, so autoindent code
|
||||
@ -101,13 +104,22 @@ function! s:TryAllFormatters(...) range
|
||||
let success = s:TryFormatterPython3()
|
||||
endif
|
||||
if success
|
||||
if verbose
|
||||
echo "Definition in '".formatdef_var."' was successful."
|
||||
endif
|
||||
return 1
|
||||
else
|
||||
if verbose
|
||||
echo "Definition in '".formatdef_var."' was unsuccessful."
|
||||
endif
|
||||
let s:index = (s:index + 1) % len(b:formatters)
|
||||
endif
|
||||
|
||||
if s:index == b:current_formatter_index
|
||||
" Tried all formatters, none worked so autoindent code
|
||||
if verbose
|
||||
echo "No format definitions were successful. Trying to autoindent code."
|
||||
endif
|
||||
exe "normal gg=G"
|
||||
return 0
|
||||
endif
|
||||
@ -142,8 +154,8 @@ stdoutdata, stderrdata = p.communicate(text)
|
||||
if stderrdata:
|
||||
if verbose:
|
||||
formattername = vim.eval('b:formatters[s:index]')
|
||||
print('Formatter {} has errors: {}. Skipping.'.format(formattername, stderrdata))
|
||||
print('Failing config: {} '.format(repr(formatprg), stderrdata))
|
||||
print('Formatter {} has errors: {} Skipping.'.format(formattername, stderrdata))
|
||||
print('Failing config: {}'.format(repr(formatprg), stderrdata))
|
||||
vim.command('return 0')
|
||||
else:
|
||||
# It is not certain what kind of line endings are being used by the format program.
|
||||
@ -190,8 +202,8 @@ stdoutdata, stderrdata = p.communicate(text)
|
||||
if stderrdata:
|
||||
if verbose:
|
||||
formattername = vim.eval('b:formatters[s:index]')
|
||||
print('Formatter {} has errors: {}. Skipping.'.format(formattername, stderrdata))
|
||||
print('Failing config: {} '.format(repr(formatprg), stderrdata))
|
||||
print('Formatter {} has errors: {} Skipping.'.format(formattername, stderrdata))
|
||||
print('Failing config: {}'.format(repr(formatprg), stderrdata))
|
||||
vim.command('return 0')
|
||||
else:
|
||||
# It is not certain what kind of line endings are being used by the format program.
|
||||
@ -244,6 +256,15 @@ function! s:PreviousFormatter()
|
||||
echom 'Selected formatter: '.b:formatters[b:current_formatter_index]
|
||||
endfunction
|
||||
|
||||
function! s:CurrentFormatter()
|
||||
call s:find_formatters()
|
||||
if !exists('b:current_formatter_index')
|
||||
let b:current_formatter_index = 0
|
||||
endif
|
||||
echom 'Selected formatter: '.b:formatters[b:current_formatter_index]
|
||||
endfunction
|
||||
|
||||
" Create commands for iterating through formatter list
|
||||
command! NextFormatter call s:NextFormatter()
|
||||
command! PreviousFormatter call s:PreviousFormatter()
|
||||
command! CurrentFormatter call s:CurrentFormatter()
|
||||
|
@ -25,9 +25,16 @@ endif
|
||||
|
||||
" Generic C, C++, Objective-C
|
||||
if !exists('g:formatdef_clangformat')
|
||||
let g:formatdef_clangformat = "'clang-format -lines='.a:firstline.':'.a:lastline.' --assume-filename='.bufname('%').' -style=\"{BasedOnStyle: WebKit, AlignTrailingComments: true, '.(&textwidth ? 'ColumnLimit: '.&textwidth.', ' : '').(&expandtab ? 'UseTab: Never, IndentWidth: '.shiftwidth() : 'UseTab: Always').'}\"'"
|
||||
let s:configfile_def = "'clang-format -lines='.a:firstline.':'.a:lastline.' --assume-filename='.bufname('%').' -style=file'"
|
||||
let s:noconfigfile_def = "'clang-format -lines='.a:firstline.':'.a:lastline.' --assume-filename='.bufname('%').' -style=\"{BasedOnStyle: WebKit, AlignTrailingComments: true, '.(&textwidth ? 'ColumnLimit: '.&textwidth.', ' : '').(&expandtab ? 'UseTab: Never, IndentWidth: '.shiftwidth() : 'UseTab: Always').'}\"'"
|
||||
let g:formatdef_clangformat = "g:ClangConfigFileExists() ? (" . s:configfile_def . ") : (" . s:noconfigfile_def . ")"
|
||||
endif
|
||||
|
||||
function! g:ClangConfigFileExists()
|
||||
return len(findfile(".clang-format", ".;")) || len(findfile("_clang-format", ".;"))
|
||||
endfunction
|
||||
|
||||
|
||||
|
||||
" C
|
||||
if !exists('g:formatdef_astyle_c')
|
||||
|
Loading…
Reference in New Issue
Block a user