All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
2 " Python filetype plugin for running flake8
3 " Language: Python (ft=python)
4 " Maintainer: Vincent Driessen <vincent@3rdcloud.com>
5 " Version: Vim 7 (may work with lower Vim versions, but not tested)
6 " URL: http://github.com/nvie/vim-flake8
13 function! flake8#Flake8()
17 function! flake8#Flake8UnplaceMarkers()
18 call s:UnplaceMarkers()
27 function! s:DeclareOption(name, globalPrefix, default) " {{{
28 if !exists('g:'.a:name)
30 execute 'let s:'.a:name.'='.a:default
32 execute 'let s:'.a:name.'=""'
35 execute 'let l:global="g:".a:name'
37 execute 'let s:'.a:name.'="'.a:globalPrefix.'".g:'.a:name
39 execute 'let s:'.a:name.'=""'
44 function! s:Setup() " {{{
48 call s:DeclareOption('flake8_cmd', '', '"flake8"')
50 call s:DeclareOption('flake8_quickfix_location', '', '"belowright"')
51 call s:DeclareOption('flake8_show_quickfix', '', 1)
53 call s:DeclareOption('flake8_show_in_gutter', '', 0)
54 call s:DeclareOption('flake8_show_in_file', '', 0)
55 call s:DeclareOption('flake8_max_markers', '', 500)
57 call s:DeclareOption('flake8_error_marker', '', '"E>"')
58 call s:DeclareOption('flake8_warning_marker', '', '"W>"')
59 call s:DeclareOption('flake8_pyflake_marker', '', '"F>"')
60 call s:DeclareOption('flake8_complexity_marker', '', '"C>"')
61 call s:DeclareOption('flake8_naming_marker', '', '"N>"')
65 if !exists('s:markerdata')
67 let s:markerdata['E'] = { 'name': 'Flake8_Error' }
68 let s:markerdata['W'] = { 'name': 'Flake8_Warning' }
69 let s:markerdata['F'] = { 'name': 'Flake8_PyFlake' }
70 let s:markerdata['C'] = { 'name': 'Flake8_Complexity' }
71 let s:markerdata['N'] = { 'name': 'Flake8_Nameing' }
73 let s:markerdata['E'].marker = s:flake8_error_marker
74 let s:markerdata['W'].marker = s:flake8_warning_marker
75 let s:markerdata['F'].marker = s:flake8_pyflake_marker
76 let s:markerdata['C'].marker = s:flake8_complexity_marker
77 let s:markerdata['N'].marker = s:flake8_naming_marker
82 function! s:Flake8() " {{{
86 if !executable(s:flake8_cmd)
87 echoerr "File " . s:flake8_cmd . " not found. Please install it first."
92 call s:UnplaceMarkers()
96 " store old grep settings (to restore later)
97 let l:old_gfm=&grepformat
99 let l:old_shellpipe=&shellpipe
101 " write any changes before continuing
106 set lazyredraw " delay redrawing
107 cclose " close any existing cwindows
109 " set shellpipe to > instead of tee (suppressing output)
112 " perform the grep itself
113 let &grepformat="%f:%l:%c: %m\,%f:%l: %m"
114 let &grepprg=s:flake8_cmd
117 " restore grep settings
118 let &grepformat=l:old_gfm
119 let &grepprg=l:old_gp
120 let &shellpipe=l:old_shellpipe
123 let l:results=getqflist()
124 let l:has_results=results != []
127 if !s:flake8_show_in_gutter == 0 || !s:flake8_show_in_file == 0
128 call s:PlaceMarkers(l:results)
131 if !s:flake8_show_quickfix == 0
133 execute s:flake8_quickfix_location." copen"
135 nnoremap <buffer> <silent> c :cclose<CR>
136 nnoremap <buffer> <silent> q :cclose<CR>
144 if l:has_results == 0
145 echon "Flake8 check OK"
147 echon "Flake8 found issues"
153 function! s:PlaceMarkers(results) " {{{
155 if !s:flake8_show_in_gutter == 0
157 for val in values(s:markerdata)
159 execute "sign define ".val.name." text=".val.marker." texthl=".val.name
166 let l:index = l:index0
167 for result in a:results
168 if l:index >= (s:flake8_max_markers+l:index0)
171 let l:type = strpart(result.text, 0, 1)
172 if has_key(s:markerdata, l:type) && s:markerdata[l:type].marker != ''
174 if !s:flake8_show_in_file == 0
175 if !has_key(s:markerdata[l:type], 'matchstr')
176 let s:markerdata[l:type].matchstr = '\%('
178 let s:markerdata[l:type].matchstr .= '\|'
180 let s:markerdata[l:type].matchstr .= '\%'.result.lnum.'l\%'.result.col.'c'
183 if !s:flake8_show_in_gutter == 0
184 execute ":sign place ".index." name=".s:markerdata[l:type].name
185 \ . " line=".result.lnum." file=".expand("%:p")
186 let s:signids += [l:index]
193 if !s:flake8_show_in_file == 0
194 for l:val in values(s:markerdata)
195 if l:val.marker != '' && has_key(l:val, 'matchstr')
196 let l:val.matchid = matchadd(l:val.name, l:val.matchstr.'\)')
202 function! s:UnplaceMarkers() " {{{
204 if exists('s:signids')
206 execute ":sign unplace ".i
211 for l:val in values(s:markerdata)
212 if has_key(l:val, 'matchid')
213 call matchdelete(l:val.matchid)
222 let &cpo = s:save_cpo