--- /dev/null
+"
+" Python filetype plugin for running flake8
+" Language: Python (ft=python)
+" Maintainer: Vincent Driessen <vincent@3rdcloud.com>
+" 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 <buffer> <silent> c :cclose<CR>
+ nnoremap <buffer> <silent> q :cclose<CR>
+ 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
+
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 <buffer> <silent> c :cclose<CR>
- nnoremap <buffer> <silent> q :cclose<CR>
- 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 <F7> by default, unless the user
" remapped it already (or a mapping exists already for <F7>)
if !exists("no_plugin_maps") && !exists("no_flake8_maps")
if !hasmapto('Flake8(')
- noremap <buffer> <F7> :call Flake8()<CR>
+ noremap <buffer> <F7> :call flake8#Flake8()<CR>
endif
endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+