From 290e866599e2ab709a7cc3dff69b7659a9eddbcb Mon Sep 17 00:00:00 2001 From: eistaa Date: Wed, 17 Sep 2014 20:04:41 +0200 Subject: [PATCH 1/1] Added markers & cleaned options. --- autoload/flake8.vim | 225 +++++++++++++++++++++++++++++++++++++ ftplugin/python_flake8.vim | 134 ++++++---------------- 2 files changed, 259 insertions(+), 100 deletions(-) create mode 100644 autoload/flake8.vim diff --git a/autoload/flake8.vim b/autoload/flake8.vim new file mode 100644 index 0000000..67d6965 --- /dev/null +++ b/autoload/flake8.vim @@ -0,0 +1,225 @@ +" +" 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) + execute 'let s:'.a:name.'='.a:default + else + execute 'let s:'.a:name.'="'.a:globalPrefix.'".g:'.a:name + endif +endfunction " }}} + +function! s:SetupConfig() " {{{ + "" 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 + + let s:markerdata = {} + if s:flake8_error_marker != '' + let s:markerdata['E'] = { + \ 'color': 'Flake8_Error', + \ 'marker': s:flake8_error_marker, + \ 'sign': 'Flake8_E', + \ } + endif + if s:flake8_warning_marker != '' + let s:markerdata['W'] = { + \ 'color': 'Flake8_Warning', + \ 'marker': s:flake8_warning_marker, + \ 'sign': 'Flake8_W', + \ } + endif + if s:flake8_pyflake_marker != '' + let s:markerdata['F'] = { + \ 'color': 'Flake8_PyFlake', + \ 'marker': s:flake8_pyflake_marker, + \ 'sign': 'Flake8_F', + \ } + endif + if s:flake8_complexity_marker != '' + let s:markerdata['C'] = { + \ 'color': 'Flake8_Complexity', + \ 'marker': s:flake8_complexity_marker, + \ 'sign': 'Flake8_C', + \ } + endif + if s:flake8_naming_marker != '' + let s:markerdata['N'] = { + \ 'color': 'Flake8_Nameing', + \ 'marker': s:flake8_naming_marker, + \ 'sign': 'Flake8_N', + \ } + endif +endfunction " }}} + +"" do flake8 + +function! s:Flake8() " {{{ + " read config + call s:SetupConfig() + + if !executable(s:flake8_cmd) + echoerr "File " . s:flake8_cmd . " not found. Please install it first." + return + endif + + " 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! "%" + + echo s:flake8_cmd.s:flake8_builtins.s:flake8_ignore.s:flake8_max_line_length.s:flake8_max_complexity + + " 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) + execute "sign define ".val['sign']." text=".val['marker']." texthl=".val['color'] + endfor + endif + + " clear old + call s:UnplaceMarkers() + let s:matchids = [] + let s:signids = [] + + " place + let index = 100 + for result in a:results + let type = strpart(result.text, 0, 1) + if has_key(s:markerdata, type) + " file markers + if !s:flake8_show_in_file == 0 + let s:matchids += [matchadd(s:markerdata[type]['color'], + \ "\\%".result.lnum."l\\%".result.col."c")] + endif + " gutter markers + if !s:flake8_show_in_gutter == 0 + execute ":sign place ".index." name=".s:markerdata[type]['sign'] + \ . " line=".result.lnum." file=".expand("%:p") + let s:signids += [index] + let index += 1 + endif + endif + endfor +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 + if exists('s:matchids') + for i in s:matchids + call matchdelete(i) + endfor + unlet s:matchids + endif +endfunction " }}} + +"" }}} + +let &cpo = s:save_cpo +unlet s:save_cpo + diff --git a/ftplugin/python_flake8.vim b/ftplugin/python_flake8.vim index 18d0bf3..cd6586a 100644 --- a/ftplugin/python_flake8.vim +++ b/ftplugin/python_flake8.vim @@ -11,111 +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 - - if exists("g:flake8_hide_quickfix") - let s:flake8_hide_quickfix=g:flake8_hide_quickfix - else - let s:flake8_hide_quickfix=0 - 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 - if s:flake8_hide_quickfix == 0 - execute s:flake8_quickfix_location." copen" - setlocal wrap - nnoremap c :cclose - nnoremap q :cclose - endif - 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 Flake8_Error + \ ctermbg=DarkRed ctermfg=Red cterm=bold + \ guibg=DarkRed guifg=Red gui=bold +" pep8 warnings +highlight Flake8_Warning + \ ctermbg=Yellow ctermfg=DarkYellow cterm=bold + \ guibg=Yellow guifg=DarkYellow gui=bold +" PyFlakes codes +highlight Flake8_PyFlake + \ ctermbg=DarkBlue ctermfg=Blue cterm=bold + \ guibg=DarkBlue guifg=Blue gui=bold +" McCabe complexity warnings +highlight Flake8_Complexity + \ ctermbg=DarkBlue ctermfg=Blue cterm=bold + \ guibg=DarkBlue guifg=Blue gui=bold +" naming conventions +highlight 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() + noremap :call flake8#Flake8() endif endif + +let &cpo = s:save_cpo +unlet s:save_cpo + -- 2.39.5