It shows the errors inside a quickfix window, which will allow your to quickly
jump to the error locations by simply pressing [Enter].
+If any of `g:flake8_show_in_gutter` or `g:flake8_show_in_file` are set to `1`, call:
+
+ call flake8#Flake8UnplaceMarkers()
+
+To remove all markers. No default mapping is provided.
Customization
-------------
let g:flake8_quickfix_location="topleft"
+To customize whether the quickfix window opens, set `g:flake8_show_quickfix`:
+
+ let g:flake8_show_quickfix=0 " don't show
+ let g:flake8_show_quickfix=1 " show (default)
+
+To customize whether the show signs in the gutter, set `g:flake8_show_in_gutter`:
+
+ let g:flake8_show_in_gutter=0 " don't show (default)
+ let g:flake8_show_in_gutter=1 " show
+
+To customize whether the show marks in the file, set `g:flake8_show_in_file`:
+
+ let g:flake8_show_in_file=0 " don't show (default)
+ let g:flake8_show_in_file=1 " show
+
+To customize the number of marks to show, set `g:flake8_max_markers`:
+
+ let g:flake8_max_markers=500 " (default)
+
+To customize the gutter markers, set any of `flake8_error_marker`, `flake8_warning_marker`,
+`flake8_pyflake_marker`, `flake8_complexity_marker`, `flake8_naming_marker`. Setting one to
+the empty string disables it. Ex.:
+
+ flake8_error_marker='EE' " set error marker to 'EE'
+ flake8_warning_marker='WW' " set warning marker to 'WW'
+ flake8_pyflake_marker='' " disable PyFlakes warnings
+ flake8_complexity_marker='' " disable McCabe complexity warnings
+ flake8_naming_marker='' " disable naming warnings
+
+To customize the colors used for markers, define the highligth groups, `Flake8_Error`,
+`Flake8_Warning`, `Flake8_PyFlake`, `Flake8_Complexity`, `Flake8_Naming`:
+
+ " to use colors defined in the colorscheme
+ highlight link Flake8_Error Error
+ highlight link Flake8_Warning WarningMsg
+ highlight link Flake8_Complexity WarningMsg
+ highlight link Flake8_Naming WarningMsg
+ highlight link Flake8_PyFlake WarningMsg
+
Tips
----
A tip might be to run the Flake8 check every time you write a Python file, to
History
-------
+1.5: Added markers and the option to don't show the quickfix window, also split functions into
+a autoload file. Added:
+
+ - Options:
+ - `g:flake8_show_quickfix`
+ - `g:flake8_show_in_gutter`
+ - `g:flake8_show_in_file`
+ - `g:flake8_max_markers`
+ - `flake8_error_marker`
+ - `flake8_warning_marker`
+ - `flake8_pyflake_marker`
+ - `flake8_complexity_marker`
+ - `flake8_naming_marker`
+ - Functions:
+ - `flake8#Flake8UnplaceMarkers()`
+ - `flake8#Flake8()`
+ - Highlighting:
+ - `Flake8_Error`
+ - `Flake8_Warning`
+ - `Flake8_Complexity`
+ - `Flake8_Naming`
+ - `Flake8_PyFlake`
+
+1.4: Suppress output to stdout.
+
1.3: Added the following options:
- - `g:flake8_builtins="_,apply"`
- - `g:flake8_max_complexity=10`
+ - `g:flake8_builtins="_,apply"`
+ - `g:flake8_max_complexity=10`
1.2: Added the following options:
- - `g:flake8_cmd="/opt/strangebin/flake8000"`
- - `g:flake8_max_line_length=120`
- - `g:flake8_ignore="E501,W293"`
+ - `g:flake8_cmd="/opt/strangebin/flake8000"`
+ - `g:flake8_max_line_length=120`
+ - `g:flake8_ignore="E501,W293"`
1.1: Added `g:flake8_ignore` option.
--- /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)
+ if a:default != ''
+ execute 'let s:'.a:name.'='.a:default
+ else
+ execute 'let s:'.a:name.'=""'
+ endif
+ else
+ execute 'let l:global="g:".a:name'
+ if l:global != ''
+ execute 'let s:'.a:name.'="'.a:globalPrefix.'".g:'.a:name
+ else
+ execute 'let s:'.a:name.'=""'
+ endif
+ endif
+endfunction " }}}
+
+function! s:Setup() " {{{
+ "" 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
+
+ if !exists('s:markerdata')
+ let s:markerdata = {}
+ let s:markerdata['E'] = { 'name': 'Flake8_Error' }
+ let s:markerdata['W'] = { 'name': 'Flake8_Warning' }
+ let s:markerdata['F'] = { 'name': 'Flake8_PyFlake' }
+ let s:markerdata['C'] = { 'name': 'Flake8_Complexity' }
+ let s:markerdata['N'] = { 'name': 'Flake8_Nameing' }
+ endif
+ let s:markerdata['E'].marker = s:flake8_error_marker
+ let s:markerdata['W'].marker = s:flake8_warning_marker
+ let s:markerdata['F'].marker = s:flake8_pyflake_marker
+ let s:markerdata['C'].marker = s:flake8_complexity_marker
+ let s:markerdata['N'].marker = s:flake8_naming_marker
+endfunction " }}}
+
+"" do flake8
+
+function! s:Flake8() " {{{
+ " read config
+ call s:Setup()
+
+ if !executable(s:flake8_cmd)
+ echoerr "File " . s:flake8_cmd . " not found. Please install it first."
+ return
+ endif
+
+ " clear old
+ call s:UnplaceMarkers()
+ let s:matchids = []
+ let s:signids = []
+
+ " 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! "%"
+
+ " 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)
+ if val.marker != ''
+ execute "sign define ".val.name." text=".val.marker." texthl=".val.name
+ endif
+ endfor
+ endif
+
+ " place
+ let l:index0 = 100
+ let l:index = l:index0
+ for result in a:results
+ if l:index >= (s:flake8_max_markers+l:index0)
+ break
+ endif
+ let l:type = strpart(result.text, 0, 1)
+ if has_key(s:markerdata, l:type) && s:markerdata[l:type].marker != ''
+ " file markers
+ if !s:flake8_show_in_file == 0
+ if !has_key(s:markerdata[l:type], 'matchstr')
+ let s:markerdata[l:type].matchstr = '\%('
+ else
+ let s:markerdata[l:type].matchstr .= '\|'
+ endif
+ let s:markerdata[l:type].matchstr .= '\%'.result.lnum.'l\%'.result.col.'c'
+ endif
+ " gutter markers
+ if !s:flake8_show_in_gutter == 0
+ execute ":sign place ".index." name=".s:markerdata[l:type].name
+ \ . " line=".result.lnum." file=".expand("%:p")
+ let s:signids += [l:index]
+ endif
+ let l:index += 1
+ endif
+ endfor
+
+ " in file?
+ if !s:flake8_show_in_file == 0
+ for l:val in values(s:markerdata)
+ if l:val.marker != '' && has_key(l:val, 'matchstr')
+ let l:val.matchid = matchadd(l:val.name, l:val.matchstr.'\)')
+ endif
+ endfor
+ endif
+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
+ for l:val in values(s:markerdata)
+ if has_key(l:val, 'matchid')
+ call matchdelete(l:val.matchid)
+ unlet l:val.matchid
+ unlet l:val.matchstr
+ endif
+ endfor
+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
-
- " 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
- execute s:flake8_quickfix_location." copen"
- setlocal wrap
- nnoremap <buffer> <silent> c :cclose<CR>
- nnoremap <buffer> <silent> q :cclose<CR>
- 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 default Flake8_Error
+ \ ctermbg=DarkRed ctermfg=Red cterm=bold
+ \ guibg=DarkRed guifg=Red gui=bold
+" pep8 warnings
+highlight default Flake8_Warning
+ \ ctermbg=Yellow ctermfg=DarkYellow cterm=bold
+ \ guibg=Yellow guifg=DarkYellow gui=bold
+" PyFlakes codes
+highlight default Flake8_PyFlake
+ \ ctermbg=DarkBlue ctermfg=Blue cterm=bold
+ \ guibg=DarkBlue guifg=Blue gui=bold
+" McCabe complexity warnings
+highlight default Flake8_Complexity
+ \ ctermbg=DarkBlue ctermfg=Blue cterm=bold
+ \ guibg=DarkBlue guifg=Blue gui=bold
+" naming conventions
+highlight default 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>
+ if !hasmapto('Flake8(') && !hasmapto('flake8#Flake8(')
+ noremap <buffer> <F7> :call flake8#Flake8()<CR>
endif
endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+