From: Vincent Driessen Date: Sat, 25 Oct 2014 18:02:22 +0000 (+0200) Subject: Merge pull request #28 from eistaa/master X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/dcfb4b596bebab0bceb8ff9aaa56bd07607d612a?hp=293613dbe731a2875ce93739e7b64ee504d8bbab Merge pull request #28 from eistaa/master Additions --- diff --git a/README.mdown b/README.mdown index 4db8b3b..5b83c99 100644 --- a/README.mdown +++ b/README.mdown @@ -25,6 +25,11 @@ Usage It shows the errors inside a quickfix window, which will allow your to quickly jump to the error locations by simply pressing [Enter]. +If any of `g:flake8_show_in_gutter` or `g:flake8_show_in_file` are set to `1`, call: + + call flake8#Flake8UnplaceMarkers() + +To remove all markers. No default mapping is provided. Customization ------------- @@ -58,6 +63,45 @@ To customize the location of quick fix window, set `g:flake8_quickfix_location`: let g:flake8_quickfix_location="topleft" +To customize whether the quickfix window opens, set `g:flake8_show_quickfix`: + + let g:flake8_show_quickfix=0 " don't show + let g:flake8_show_quickfix=1 " show (default) + +To customize whether the show signs in the gutter, set `g:flake8_show_in_gutter`: + + let g:flake8_show_in_gutter=0 " don't show (default) + let g:flake8_show_in_gutter=1 " show + +To customize whether the show marks in the file, set `g:flake8_show_in_file`: + + let g:flake8_show_in_file=0 " don't show (default) + let g:flake8_show_in_file=1 " show + +To customize the number of marks to show, set `g:flake8_max_markers`: + + let g:flake8_max_markers=500 " (default) + +To customize the gutter markers, set any of `flake8_error_marker`, `flake8_warning_marker`, +`flake8_pyflake_marker`, `flake8_complexity_marker`, `flake8_naming_marker`. Setting one to +the empty string disables it. Ex.: + + flake8_error_marker='EE' " set error marker to 'EE' + flake8_warning_marker='WW' " set warning marker to 'WW' + flake8_pyflake_marker='' " disable PyFlakes warnings + flake8_complexity_marker='' " disable McCabe complexity warnings + flake8_naming_marker='' " disable naming warnings + +To customize the colors used for markers, define the highligth groups, `Flake8_Error`, +`Flake8_Warning`, `Flake8_PyFlake`, `Flake8_Complexity`, `Flake8_Naming`: + + " to use colors defined in the colorscheme + highlight link Flake8_Error Error + highlight link Flake8_Warning WarningMsg + highlight link Flake8_Complexity WarningMsg + highlight link Flake8_Naming WarningMsg + highlight link Flake8_PyFlake WarningMsg + Tips ---- A tip might be to run the Flake8 check every time you write a Python file, to @@ -75,16 +119,41 @@ This plugin goes well together with the following plugin: History ------- +1.5: Added markers and the option to don't show the quickfix window, also split functions into +a autoload file. Added: + + - Options: + - `g:flake8_show_quickfix` + - `g:flake8_show_in_gutter` + - `g:flake8_show_in_file` + - `g:flake8_max_markers` + - `flake8_error_marker` + - `flake8_warning_marker` + - `flake8_pyflake_marker` + - `flake8_complexity_marker` + - `flake8_naming_marker` + - Functions: + - `flake8#Flake8UnplaceMarkers()` + - `flake8#Flake8()` + - Highlighting: + - `Flake8_Error` + - `Flake8_Warning` + - `Flake8_Complexity` + - `Flake8_Naming` + - `Flake8_PyFlake` + +1.4: Suppress output to stdout. + 1.3: Added the following options: - - `g:flake8_builtins="_,apply"` - - `g:flake8_max_complexity=10` + - `g:flake8_builtins="_,apply"` + - `g:flake8_max_complexity=10` 1.2: Added the following options: - - `g:flake8_cmd="/opt/strangebin/flake8000"` - - `g:flake8_max_line_length=120` - - `g:flake8_ignore="E501,W293"` + - `g:flake8_cmd="/opt/strangebin/flake8000"` + - `g:flake8_max_line_length=120` + - `g:flake8_ignore="E501,W293"` 1.1: Added `g:flake8_ignore` option. diff --git a/autoload/flake8.vim b/autoload/flake8.vim new file mode 100644 index 0000000..de9633e --- /dev/null +++ b/autoload/flake8.vim @@ -0,0 +1,229 @@ +" +" Python filetype plugin for running flake8 +" Language: Python (ft=python) +" Maintainer: Vincent Driessen +" Version: Vim 7 (may work with lower Vim versions, but not tested) +" URL: http://github.com/nvie/vim-flake8 + +let s:save_cpo = &cpo +set cpo&vim + +"" ** external ** {{{ + +function! flake8#Flake8() + call s:Flake8() +endfunction + +function! flake8#Flake8UnplaceMarkers() + call s:UnplaceMarkers() +endfunction + +"" }}} + +"" ** internal ** {{{ + +"" config + +function! s:DeclareOption(name, globalPrefix, default) " {{{ + if !exists('g:'.a:name) + if a:default != '' + execute 'let s:'.a:name.'='.a:default + else + execute 'let s:'.a:name.'=""' + endif + else + execute 'let l:global="g:".a:name' + if l:global != '' + execute 'let s:'.a:name.'="'.a:globalPrefix.'".g:'.a:name + else + execute 'let s:'.a:name.'=""' + endif + endif +endfunction " }}} + +function! s:Setup() " {{{ + "" read options + + " flake8 command + call s:DeclareOption('flake8_cmd', '', '"flake8"') + " flake8 stuff + call s:DeclareOption('flake8_builtins', ' --builtins=', '') + call s:DeclareOption('flake8_ignore', ' --ignore=', '') + call s:DeclareOption('flake8_max_line_length', ' --max-line-length=', '') + call s:DeclareOption('flake8_max_complexity', ' --max-complexity=', '') + " quickfix + call s:DeclareOption('flake8_quickfix_location', '', '"belowright"') + call s:DeclareOption('flake8_show_quickfix', '', 1) + " markers to show + call s:DeclareOption('flake8_show_in_gutter', '', 0) + call s:DeclareOption('flake8_show_in_file', '', 0) + call s:DeclareOption('flake8_max_markers', '', 500) + " marker signs + call s:DeclareOption('flake8_error_marker', '', '"E>"') + call s:DeclareOption('flake8_warning_marker', '', '"W>"') + call s:DeclareOption('flake8_pyflake_marker', '', '"F>"') + call s:DeclareOption('flake8_complexity_marker', '', '"C>"') + call s:DeclareOption('flake8_naming_marker', '', '"N>"') + + "" setup markerdata + + if !exists('s:markerdata') + let s:markerdata = {} + let s:markerdata['E'] = { 'name': 'Flake8_Error' } + let s:markerdata['W'] = { 'name': 'Flake8_Warning' } + let s:markerdata['F'] = { 'name': 'Flake8_PyFlake' } + let s:markerdata['C'] = { 'name': 'Flake8_Complexity' } + let s:markerdata['N'] = { 'name': 'Flake8_Nameing' } + endif + let s:markerdata['E'].marker = s:flake8_error_marker + let s:markerdata['W'].marker = s:flake8_warning_marker + let s:markerdata['F'].marker = s:flake8_pyflake_marker + let s:markerdata['C'].marker = s:flake8_complexity_marker + let s:markerdata['N'].marker = s:flake8_naming_marker +endfunction " }}} + +"" do flake8 + +function! s:Flake8() " {{{ + " read config + call s:Setup() + + if !executable(s:flake8_cmd) + echoerr "File " . s:flake8_cmd . " not found. Please install it first." + return + endif + + " clear old + call s:UnplaceMarkers() + let s:matchids = [] + let s:signids = [] + + " store old grep settings (to restore later) + let l:old_gfm=&grepformat + let l:old_gp=&grepprg + let l:old_shellpipe=&shellpipe + + " write any changes before continuing + if &readonly == 0 + update + endif + + set lazyredraw " delay redrawing + cclose " close any existing cwindows + + " set shellpipe to > instead of tee (suppressing output) + set shellpipe=> + + " perform the grep itself + let &grepformat="%f:%l:%c: %m\,%f:%l: %m" + let &grepprg=s:flake8_cmd.s:flake8_builtins.s:flake8_ignore.s:flake8_max_line_length.s:flake8_max_complexity + silent! grep! "%" + + " restore grep settings + let &grepformat=l:old_gfm + let &grepprg=l:old_gp + let &shellpipe=l:old_shellpipe + + " process results + let l:results=getqflist() + let l:has_results=results != [] + if l:has_results + " markers + if !s:flake8_show_in_gutter == 0 || !s:flake8_show_in_file == 0 + call s:PlaceMarkers(l:results) + endif + " quickfix + if !s:flake8_show_quickfix == 0 + " open cwindow + execute s:flake8_quickfix_location." copen" + setlocal wrap + nnoremap c :cclose + nnoremap q :cclose + endif + endif + + set nolazyredraw + redraw! + + " Show status + if l:has_results == 0 + echon "Flake8 check OK" + else + echon "Flake8 found issues" + endif +endfunction " }}} + +"" markers + +function! s:PlaceMarkers(results) " {{{ + " in gutter? + if !s:flake8_show_in_gutter == 0 + " define signs + for val in values(s:markerdata) + if val.marker != '' + execute "sign define ".val.name." text=".val.marker." texthl=".val.name + endif + endfor + endif + + " place + let l:index0 = 100 + let l:index = l:index0 + for result in a:results + if l:index >= (s:flake8_max_markers+l:index0) + break + endif + let l:type = strpart(result.text, 0, 1) + if has_key(s:markerdata, l:type) && s:markerdata[l:type].marker != '' + " file markers + if !s:flake8_show_in_file == 0 + if !has_key(s:markerdata[l:type], 'matchstr') + let s:markerdata[l:type].matchstr = '\%(' + else + let s:markerdata[l:type].matchstr .= '\|' + endif + let s:markerdata[l:type].matchstr .= '\%'.result.lnum.'l\%'.result.col.'c' + endif + " gutter markers + if !s:flake8_show_in_gutter == 0 + execute ":sign place ".index." name=".s:markerdata[l:type].name + \ . " line=".result.lnum." file=".expand("%:p") + let s:signids += [l:index] + endif + let l:index += 1 + endif + endfor + + " in file? + if !s:flake8_show_in_file == 0 + for l:val in values(s:markerdata) + if l:val.marker != '' && has_key(l:val, 'matchstr') + let l:val.matchid = matchadd(l:val.name, l:val.matchstr.'\)') + endif + endfor + endif +endfunction " }}} + +function! s:UnplaceMarkers() " {{{ + " gutter markers + if exists('s:signids') + for i in s:signids + execute ":sign unplace ".i + endfor + unlet s:signids + endif + " file markers + for l:val in values(s:markerdata) + if has_key(l:val, 'matchid') + call matchdelete(l:val.matchid) + unlet l:val.matchid + unlet l:val.matchstr + endif + endfor +endfunction " }}} + +"" }}} + +let &cpo = s:save_cpo +unlet s:save_cpo + diff --git a/ftplugin/python_flake8.vim b/ftplugin/python_flake8.vim index 5310e3b..dd062d9 100644 --- a/ftplugin/python_flake8.vim +++ b/ftplugin/python_flake8.vim @@ -11,103 +11,45 @@ if exists("b:loaded_flake8_ftplugin") endif let b:loaded_flake8_ftplugin=1 -if !exists("*Flake8()") - function Flake8() - if exists("g:flake8_cmd") - let s:flake8_cmd=g:flake8_cmd - else - let s:flake8_cmd="flake8" - endif - - if !executable(s:flake8_cmd) - echoerr "File " . s:flake8_cmd . " not found. Please install it first." - return - endif - - set lazyredraw " delay redrawing - cclose " close any existing cwindows - - " store old grep settings (to restore later) - let l:old_gfm=&grepformat - let l:old_gp=&grepprg - let l:old_shellpipe=&shellpipe - - " write any changes before continuing - if &readonly == 0 - update - endif - - " read config - if exists("g:flake8_builtins") - let s:flake8_builtins_opt=" --builtins=".g:flake8_builtins - else - let s:flake8_builtins_opt="" - endif - - if exists("g:flake8_ignore") - let s:flake8_ignores=" --ignore=".g:flake8_ignore - else - let s:flake8_ignores="" - endif - - if exists("g:flake8_max_line_length") - let s:flake8_max_line_length=" --max-line-length=".g:flake8_max_line_length - else - let s:flake8_max_line_length="" - endif - - if exists("g:flake8_max_complexity") - let s:flake8_max_complexity=" --max-complexity=".g:flake8_max_complexity - else - let s:flake8_max_complexity="" - endif - - if exists("g:flake8_quickfix_location") - let s:flake8_quickfix_location=g:flake8_quickfix_location - else - let s:flake8_quickfix_location="belowright" - endif - - " set shellpipe to > instead of tee (suppressing output) - set shellpipe=> - - " perform the grep itself - let &grepformat="%f:%l:%c: %m\,%f:%l: %m" - let &grepprg=s:flake8_cmd.s:flake8_builtins_opt.s:flake8_ignores.s:flake8_max_line_length.s:flake8_max_complexity - silent! grep! "%" - - " restore grep settings - let &grepformat=l:old_gfm - let &grepprg=l:old_gp - let &shellpipe=l:old_shellpipe - - " open cwindow - let has_results=getqflist() != [] - if has_results - execute s:flake8_quickfix_location." copen" - setlocal wrap - nnoremap c :cclose - nnoremap q :cclose - endif - - set nolazyredraw - redraw! - - if has_results == 0 - " Show OK status - hi Green ctermfg=green - echohl Green - echon "Flake8 check OK" - echohl - endif - endfunction -endif +let s:save_cpo = &cpo +set cpo&vim + +"" Highlight groups for errors +" pep8 errors +highlight default Flake8_Error + \ ctermbg=DarkRed ctermfg=Red cterm=bold + \ guibg=DarkRed guifg=Red gui=bold +" pep8 warnings +highlight default Flake8_Warning + \ ctermbg=Yellow ctermfg=DarkYellow cterm=bold + \ guibg=Yellow guifg=DarkYellow gui=bold +" PyFlakes codes +highlight default Flake8_PyFlake + \ ctermbg=DarkBlue ctermfg=Blue cterm=bold + \ guibg=DarkBlue guifg=Blue gui=bold +" McCabe complexity warnings +highlight default Flake8_Complexity + \ ctermbg=DarkBlue ctermfg=Blue cterm=bold + \ guibg=DarkBlue guifg=Blue gui=bold +" naming conventions +highlight default Flake8_Naming + \ ctermbg=DarkBlue ctermfg=Blue cterm=bold + \ guibg=DarkBlue guifg=Blue gui=bold + +" to not break with old versions +function! Flake8() + call flake8#Flake8() +endfunction " Add mappings, unless the user didn't want this. " The default mapping is registered under to by default, unless the user " remapped it already (or a mapping exists already for ) if !exists("no_plugin_maps") && !exists("no_flake8_maps") - if !hasmapto('Flake8(') - noremap :call Flake8() + if !hasmapto('Flake8(') && !hasmapto('flake8#Flake8(') + noremap :call flake8#Flake8() endif endif + +let &cpo = s:save_cpo +unlet s:save_cpo +