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()
18 function! flake8#Flake8UnplaceMarkers()
19 call s:UnplaceMarkers()
29 let s:displayed_warnings = 0
31 if !s:displayed_warnings
32 let l:show_website_url = 0
34 let l:msg = "has been deprecated in favour of flake8 config files"
35 for setting_name in ['g:flake8_ignore', 'g:flake8_builtins', 'g:flake8_max_line_length', 'g:flake8_max_complexity']
36 if exists(setting_name)
37 echohl WarningMsg | echom setting_name l:msg | echohl None
38 let l:show_website_url = 1
43 let l:url = "http://flake8.readthedocs.org/en/latest/config.html"
44 echohl WarningMsg | echom l:url | echohl None
46 let s:displayed_warnings = 1
52 function! s:DeclareOption(name, globalPrefix, default) " {{{
53 if !exists('g:'.a:name)
55 execute 'let s:'.a:name.'='.a:default
57 execute 'let s:'.a:name.'=""'
60 execute 'let l:global="g:".a:name'
62 execute 'let s:'.a:name.'="'.a:globalPrefix.'".g:'.a:name
64 execute 'let s:'.a:name.'=""'
69 function! s:Setup() " {{{
73 call s:DeclareOption('flake8_cmd', '', '"flake8"')
75 call s:DeclareOption('flake8_quickfix_location', '', '"belowright"')
76 call s:DeclareOption('flake8_quickfix_height', '', 5)
77 call s:DeclareOption('flake8_show_quickfix', '', 1)
79 call s:DeclareOption('flake8_show_in_gutter', '', 0)
80 call s:DeclareOption('flake8_show_in_file', '', 0)
81 call s:DeclareOption('flake8_max_markers', '', 500)
83 call s:DeclareOption('flake8_error_marker', '', '"E>"')
84 call s:DeclareOption('flake8_warning_marker', '', '"W>"')
85 call s:DeclareOption('flake8_pyflake_marker', '', '"F>"')
86 call s:DeclareOption('flake8_complexity_marker', '', '"C>"')
87 call s:DeclareOption('flake8_naming_marker', '', '"N>"')
91 if !exists('s:markerdata')
93 let s:markerdata['E'] = {'name': 'Flake8_Error'}
94 let s:markerdata['W'] = {'name': 'Flake8_Warning'}
95 let s:markerdata['F'] = {'name': 'Flake8_PyFlake'}
96 let s:markerdata['C'] = {'name': 'Flake8_Complexity'}
97 let s:markerdata['N'] = {'name': 'Flake8_Nameing'}
99 let s:markerdata['E'].marker = s:flake8_error_marker
100 let s:markerdata['W'].marker = s:flake8_warning_marker
101 let s:markerdata['F'].marker = s:flake8_pyflake_marker
102 let s:markerdata['C'].marker = s:flake8_complexity_marker
103 let s:markerdata['N'].marker = s:flake8_naming_marker
108 function! s:Flake8() " {{{
112 let l:executable = split(s:flake8_cmd)[0]
114 if !executable(l:executable)
115 echoerr "File " . l:executable . " not found. Please install it first."
120 call s:UnplaceMarkers()
124 " store old grep settings (to restore later)
125 let l:old_gfm=&grepformat
126 let l:old_gp=&grepprg
127 let l:old_shellpipe=&shellpipe
129 " write any changes before continuing
134 set lazyredraw " delay redrawing
136 " set shellpipe to > instead of tee (suppressing output)
139 " perform the grep itself
140 let &grepformat="%f:%l:%c: %m\,%f:%l: %m"
141 let &grepprg=s:flake8_cmd
143 " close any existing cwindows,
144 " placed after 'grep' in case quickfix is open on autocmd QuickFixCmdPost
147 " restore grep settings
148 let &grepformat=l:old_gfm
149 let &grepprg=l:old_gp
150 let &shellpipe=l:old_shellpipe
153 let l:results=getqflist()
154 let l:has_results=results != []
157 if !s:flake8_show_in_gutter == 0 || !s:flake8_show_in_file == 0
158 call s:PlaceMarkers(l:results)
161 if !s:flake8_show_quickfix == 0
163 execute s:flake8_quickfix_location." copen".s:flake8_quickfix_height
165 nnoremap <buffer> <silent> c :cclose<CR>
166 nnoremap <buffer> <silent> q :cclose<CR>
174 if l:has_results == 0
175 echon "Flake8 check OK"
177 echon "Flake8 found issues"
183 function! s:PlaceMarkers(results) " {{{
185 if !s:flake8_show_in_gutter == 0
187 for val in values(s:markerdata)
189 execute "sign define ".val.name." text=".val.marker." texthl=".val.name
196 let l:index = l:index0
197 for result in a:results
198 if l:index >= (s:flake8_max_markers+l:index0)
201 let l:type = strpart(result.text, 0, 1)
202 if has_key(s:markerdata, l:type) && s:markerdata[l:type].marker != ''
204 if !s:flake8_show_in_file == 0
205 if !has_key(s:markerdata[l:type], 'matchstr')
206 let s:markerdata[l:type].matchstr = '\%('
208 let s:markerdata[l:type].matchstr .= '\|'
210 let s:markerdata[l:type].matchstr .= '\%'.result.lnum.'l\%'.result.col.'c'
213 if !s:flake8_show_in_gutter == 0
214 execute ":sign place ".index." name=".s:markerdata[l:type].name
215 \ . " line=".result.lnum." file=".expand("%:p")
216 let s:signids += [l:index]
223 if !s:flake8_show_in_file == 0
224 for l:val in values(s:markerdata)
225 if l:val.marker != '' && has_key(l:val, 'matchstr')
226 let l:val.matchid = matchadd(l:val.name, l:val.matchstr.'\)')
232 function! s:UnplaceMarkers() " {{{
234 if exists('s:signids')
236 execute ":sign unplace ".i
241 for l:val in values(s:markerdata)
242 if has_key(l:val, 'matchid')
243 call matchdelete(l:val.matchid)
252 let &cpo = s:save_cpo