]> git.madduck.net Git - etc/vim.git/blob - autoload/flake8.vim

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

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.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Speedup on placing file markers.
[etc/vim.git] / autoload / flake8.vim
1 "
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
7
8 let s:save_cpo = &cpo
9 set cpo&vim
10
11 "" ** external ** {{{
12
13 function! flake8#Flake8()
14     call s:Flake8()
15 endfunction
16
17 function! flake8#Flake8UnplaceMarkers()
18     call s:UnplaceMarkers()
19 endfunction
20
21 "" }}}
22
23 "" ** internal ** {{{
24
25 "" config
26
27 function! s:DeclareOption(name, globalPrefix, default)  " {{{
28     if !exists('g:'.a:name)
29         if a:default != ''
30             execute 'let s:'.a:name.'='.a:default
31         else
32             execute 'let s:'.a:name.'=""'
33         endif
34     else
35         execute 'let l:global="g:".a:name'
36         if l:global != ''
37             execute 'let s:'.a:name.'="'.a:globalPrefix.'".g:'.a:name
38         else
39             execute 'let s:'.a:name.'=""'
40         endif
41     endif
42 endfunction  " }}}
43
44 function! s:SetupConfig()  " {{{
45     "" read options
46
47     " flake8 command
48     call s:DeclareOption('flake8_cmd', '', '"flake8"')
49     " flake8 stuff
50     call s:DeclareOption('flake8_builtins',        ' --builtins=',        '')
51     call s:DeclareOption('flake8_ignore',          ' --ignore=',          '')
52     call s:DeclareOption('flake8_max_line_length', ' --max-line-length=', '')
53     call s:DeclareOption('flake8_max_complexity',  ' --max-complexity=',  '')
54     " quickfix
55     call s:DeclareOption('flake8_quickfix_location', '', '"belowright"')
56     call s:DeclareOption('flake8_show_quickfix',     '', 1)
57     " markers to show
58     call s:DeclareOption('flake8_show_in_gutter', '',   0)
59     call s:DeclareOption('flake8_show_in_file',   '',   0)
60     call s:DeclareOption('flake8_max_markers',    '', 500)
61     " marker signs
62     call s:DeclareOption('flake8_error_marker',      '', '"E>"')
63     call s:DeclareOption('flake8_warning_marker',    '', '"W>"')
64     call s:DeclareOption('flake8_pyflake_marker',    '', '"F>"')
65     call s:DeclareOption('flake8_complexity_marker', '', '"C>"')
66     call s:DeclareOption('flake8_naming_marker',     '', '"N>"')
67
68     "" setup markerdata
69
70     let s:markerdata = {}
71     if s:flake8_error_marker != ''
72     let s:markerdata['E'] = {
73                     \   'color':    'Flake8_Error',
74                     \   'marker':   s:flake8_error_marker,
75                     \   'sign':     'Flake8_E',
76                     \ }
77     endif
78     if s:flake8_warning_marker != ''
79         let s:markerdata['W'] = {
80                     \   'color':  'Flake8_Warning',
81                     \   'marker': s:flake8_warning_marker,
82                     \   'sign':   'Flake8_W',
83                     \ }
84     endif
85     if s:flake8_pyflake_marker != ''
86         let s:markerdata['F'] = {
87                     \   'color':  'Flake8_PyFlake',
88                     \   'marker': s:flake8_pyflake_marker,
89                     \   'sign':   'Flake8_F',
90                     \ }
91     endif
92     if s:flake8_complexity_marker != ''
93         let s:markerdata['C'] = {
94                     \   'color':  'Flake8_Complexity',
95                     \   'marker': s:flake8_complexity_marker,
96                     \   'sign':   'Flake8_C',
97                     \ }
98     endif
99     if s:flake8_naming_marker != ''
100         let s:markerdata['N'] = {
101                     \   'color':  'Flake8_Nameing',
102                     \   'marker': s:flake8_naming_marker,
103                     \   'sign':   'Flake8_N',
104                     \ }
105     endif
106 endfunction  " }}}
107
108 "" do flake8
109
110 function! s:Flake8()  " {{{
111     " read config
112     call s:SetupConfig()
113
114     if !executable(s:flake8_cmd)
115         echoerr "File " . s:flake8_cmd . " not found. Please install it first."
116         return
117     endif
118
119     " store old grep settings (to restore later)
120     let l:old_gfm=&grepformat
121     let l:old_gp=&grepprg
122     let l:old_shellpipe=&shellpipe
123
124     " write any changes before continuing
125     if &readonly == 0
126         update
127     endif
128
129     set lazyredraw   " delay redrawing
130     cclose           " close any existing cwindows
131
132     " set shellpipe to > instead of tee (suppressing output)
133     set shellpipe=>
134
135     " perform the grep itself
136     let &grepformat="%f:%l:%c: %m\,%f:%l: %m"
137     let &grepprg=s:flake8_cmd.s:flake8_builtins.s:flake8_ignore.s:flake8_max_line_length.s:flake8_max_complexity
138     silent! grep! "%"
139
140     " restore grep settings
141     let &grepformat=l:old_gfm
142     let &grepprg=l:old_gp
143     let &shellpipe=l:old_shellpipe
144
145     " process results
146     let l:results=getqflist()
147     let l:has_results=results != []
148     if l:has_results
149         " markers
150         if !s:flake8_show_in_gutter == 0 || !s:flake8_show_in_file == 0
151             call s:PlaceMarkers(l:results)
152         endif
153         " quickfix
154         if !s:flake8_show_quickfix == 0
155             " open cwindow
156             execute s:flake8_quickfix_location." copen"
157             setlocal wrap
158             nnoremap <buffer> <silent> c :cclose<CR>
159             nnoremap <buffer> <silent> q :cclose<CR>
160         endif
161     endif
162
163     set nolazyredraw
164     redraw!
165
166     " Show status
167     if l:has_results == 0
168         echon "Flake8 check OK"
169     else
170         echon "Flake8 found issues"
171     endif
172 endfunction  " }}}
173
174 "" markers
175
176 function! s:PlaceMarkers(results)  " {{{
177     " in gutter?
178     if !s:flake8_show_in_gutter == 0
179         " define signs
180         for val in values(s:markerdata)
181             execute "sign define ".val['sign']." text=".val['marker']." texthl=".val['color']
182         endfor
183     endif
184
185     " clear old
186     call s:UnplaceMarkers()
187     let s:matchids = []
188     let s:signids  = []
189
190     " place
191     let l:index0 = 100
192     let l:index  = l:index0
193     for result in a:results
194         if l:index >= (s:flake8_max_markers+l:index0)
195             break
196         endif
197         let l:type = strpart(result.text, 0, 1)
198         if has_key(s:markerdata, l:type)
199             " file markers
200             if !s:flake8_show_in_file == 0
201                 if !has_key(s:markerdata, 'matchstr')
202                     let s:markerdata[l:type]['matchstr'] = '\%('
203                 else
204                     let s:markerdata[l:type]['matchstr'] .= '\|'
205                 endif
206                 let s:markerdata[l:type]['matchstr'] .= '\%'.result.lnum.'l\%'.result.col.'c'
207             endif
208             " gutter markers
209             if !s:flake8_show_in_gutter == 0
210                 execute ":sign place ".index." name=".s:markerdata[l:type]['sign']
211                             \ . " line=".result.lnum." file=".expand("%:p")
212                 let s:signids += [l:index]
213             endif
214             let l:index += 1
215         endif
216     endfor
217
218     " in file?
219     if !s:flake8_show_in_file == 0
220         for l:val in values(s:markerdata)
221             if l:val['matchstr'] != ''
222                 let l:val['matchid'] = matchadd(l:val['color'], l:val['matchstr'].'\)')
223             endif
224         endfor
225     endif
226 endfunction  " }}}
227
228 function! s:UnplaceMarkers()  " {{{
229     " gutter markers
230     if exists('s:signids')
231         for i in s:signids
232             execute ":sign unplace ".i
233         endfor
234         unlet s:signids
235     endif
236     " file markers
237     for l:val in values(s:markerdata)
238         if has_key(l:val, 'matchid')
239             call matchdelete(l:val['matchid'])
240             unlet l:val['matchid']
241             unlet l:val['matchstr']
242         endif
243     endfor
244 endfunction  " }}}
245
246 "" }}}
247
248 let &cpo = s:save_cpo
249 unlet s:save_cpo
250