1
0
mirror of https://github.com/gryf/.vim.git synced 2025-12-17 11:30:29 +01:00

Substituted pylint compiled with new one.

Added Pep8 command
clean up in vimrc and ftplugin/python/common
This commit is contained in:
2010-09-12 20:05:35 +02:00
parent 2b81844ae6
commit 73d7af783c
6 changed files with 419 additions and 189 deletions

60
.vimrc
View File

@@ -74,7 +74,7 @@ set noswapfile
"}}}
"COMMON: specific vim behaviour for Python files {{{
"
"remove all trailing whitespace for python before write
"remove all trailing whitespace for specified files before write
autocmd BufWritePre *.py :call <SID>StripTrailingWhitespaces()
autocmd BufWritePre *.rst :call <SID>StripTrailingWhitespaces()
autocmd BufWritePre *.wiki :call <SID>StripTrailingWhitespaces()
@@ -164,17 +164,9 @@ let g:DirDiffExcludes = "CVS,*.class,*.exe,.*.swp,*.pyc,*.pyo"
"}}}
"KEYS: User definied keyboard shortcuts {{{
"set <C-F1>=^[[11^
"set <S-F1> = ^[[23~
"nmap <TAB> :bnext<CR>
"nmap <S-F1> :split<CR>
"nmap <C-F1> :vsplit<CR>
"Cycle through buffers.
map <C-p> :bp<CR>
map <C-n> :bn<CR>
"map <C-PageUp> :bp<CR>
"map <C-PageDown> :bn<CR>
"Cycle through tabs.
if $TERM == 'rxvt-unicode'
@@ -182,11 +174,7 @@ if $TERM == 'rxvt-unicode'
map <C-PageUp> :tabp<CR>
endif
map <F5> :call <SID>runPyLint()<cr>
map <F6> :call <SID>PyLintBuf()<cr>
"map ctags plugin to show popup menu in gvim
"map <F6> :popup Tags<CR>
map <F5> :call <SID>Make()<cr>
"QuickFix jumps
map <F9> :cp<CR>
@@ -207,8 +195,6 @@ map ]b :call OpenInFirefox()<cr>
"make displaying tags easy
nmap <Leader>t :TlistToo<CR>
"aswell minibufexplorer
"map <Leader>b :TMiniBufExplorer<CR><CR>
"eclim Buffer shortcut
map <Leader>b :Buffers<CR>
@@ -221,42 +207,18 @@ nmap ,cs :silent call <SID>CopyFileName(0)<CR>
map <C-F> :TlistToo!<cr>:FufFile **/<CR>
" }}}
" FUNCTIONS: usefull functions for all of th files {{{
"Sessions
"autocmd VimEnter * call LoadSession()
"autocmd VimLeave * call SaveSession()
"
"function! SaveSession()
" execute 'mksession!'
"endfunction
"
"function! LoadSession()
" if argc() == 0
" execute 'source Session.vim'
" endif
"endfunction
function <SID>runPyLint()
" Simple wrapper for :make command
function <SID>Make()
echohl Statement
echo "Running pylint (ctrl-c to cancel) ..."
echo "Running make (ctrl-c to cancel) ..."
echohl Normal
:Pylint
endfunction
function <SID>PyLintBuf()
echohl Statement
echo "Running pylint (ctrl-c to cancel) ..."
echohl Normal
let file = expand('%:p')
let cmd = 'pylint --reports=n --output-format=text "' . file . '"'
if has('win32') || has('win64')
let cmd = 'cmd /c "' . cmd . '"'
silent make
if getqflist() != []
copen
endif
exec "bel silent new " . file . ".lint"
exec "silent! read! " . cmd
endfunction
function! <SID>StripTrailingWhitespaces()
" Remove trailing whitespace
function <SID>StripTrailingWhitespaces()
" Preparation: save last search, and cursor position.
let _s=@/
let l = line(".")
@@ -284,6 +246,7 @@ function <SID>CopyFileName(full)
echo l:full_fn + " copied to clipboard"
endfunction
" Toggle QuickFix buffer
command -bang -nargs=? QFix call QFixToggle(<bang>0)
function! QFixToggle(forced)
if exists("g:qfix_win") && a:forced == 0
@@ -295,6 +258,7 @@ function! QFixToggle(forced)
endif
endfunction
" Toggle location buffer
command -bang -nargs=? LWin call LocationWindowToggle(<bang>0)
function! LocationWindowToggle(forced)
if exists("g:loc_win") && a:forced == 0

85
bin/pylint_parseable.py Executable file
View File

@@ -0,0 +1,85 @@
#!/usr/bin/env python
"""
This script can be used as a pylint command replacement, especially useful as
a "make" command for VIm
"""
import sys
import re
from StringIO import StringIO
from optparse import OptionParser
from pylint import lint
from pylint.reporters.text import TextReporter
SYS_STDERR = sys.stderr
DUMMY_STDERR = StringIO()
CONF_MSG = 'No config file found, using default configuration\n'
def parsable_pylint(filename):
"""
Simple wrapper for pylint checker. Provides nice, parseable output.
filename - python fileneame to check
returns list of dicts of errors, i.e.:
[{'lnum': 5, 'col': 10, 'type': 'C0324', text: 'Comma not followed by a space'},
....
]
"""
# args
args = ['-rn', # display only the messages instead of full report
'-iy', # Include message's id in output
filename]
buf = StringIO() # file-like buffer, instead of stdout
reporter = TextReporter(buf)
sys.stderr = DUMMY_STDERR
lint.Run(args, reporter=reporter, exit=False)
sys.stderr = SYS_STDERR
DUMMY_STDERR.seek(0)
error_list = DUMMY_STDERR.readlines()
DUMMY_STDERR.truncate(0)
if error_list and CONF_MSG in error_list:
error_list.remove(CONF_MSG)
if error_list:
raise Exception(''.join(error_list))
buf.seek(0)
code_line = {}
error_list = []
carriage_re = re.compile(r'\s*\^+$')
error_re = re.compile(r'^([C,R,W,E,F].+):\s+?([0-9]+):?.*:\s(.*)$')
for line in buf:
line = line.rstrip() # remove trailing newline character
if error_re.match(line):
if code_line:
error_list.append(code_line)
code_line = {}
code_line['type'], code_line['lnum'], code_line['text'] = \
error_re.match(line).groups()
if carriage_re.match(line) and code_line:
code_line['col'] = carriage_re.match(line).group().find('^') + 1
return error_list
if __name__ == "__main__":
parser = OptionParser("usage: %prog python_file")
(options, args) = parser.parse_args()
if len(args) == 1:
for line in parsable_pylint(args[0]):
line['short'] = line['type'][0]
line['fname'] = args[0]
if 'col' in line:
out = "%(fname)s: %(short)s: %(lnum)s: %(col)s: %(type)s %(text)s"
else:
out = "%(fname)s: %(short)s: %(lnum)s: 0: %(type)s %(text)s"
print out % line

View File

@@ -1,126 +1,12 @@
" Vim compiler file for Python
" Compiler: Style checking tool for Python
" Maintainer: Oleksandr Tymoshenko <gonzo@univ.kiev.ua>
" Last Change: 2009 Apr 19
" Version: 0.5
" Contributors:
" Artur Wroblewski
" Menno
"
" Installation:
" Drop pylint.vim in ~/.vim/compiler directory. Ensure that your PATH
" environment variable includes the path to 'pylint' executable.
"
" Add the following line to the autocmd section of .vimrc
"
" autocmd FileType python compiler pylint
"
" Usage:
" Pylint is called after a buffer with Python code is saved. QuickFix
" window is opened to show errors, warnings and hints provided by Pylint.
" Code rate calculated by Pylint is displayed at the bottom of the
" window.
"
" Above is realized with :Pylint command. To disable calling Pylint every
" time a buffer is saved put into .vimrc file
"
" let g:pylint_onwrite = 0
"
" Displaying code rate calculated by Pylint can be avoided by setting
"
" let g:pylint_show_rate = 0
"
" Openning of QuickFix window can be disabled with
"
" let g:pylint_cwindow = 0
"
" Of course, standard :make command can be used as in case of every
" other compiler.
"
if exists('current_compiler')
finish
endif
let current_compiler = 'pylint'
if !exists('g:pylint_onwrite')
let g:pylint_onwrite = 1
" Compiler: Static code checking tool for Python
" Maintainer: Roman 'gryf' Dobosz
" Last Change: 2010-09-12
" Version: 1.0
if exists("current_compiler")
finish
endif
if !exists('g:pylint_show_rate')
let g:pylint_show_rate = 1
endif
if !exists('g:pylint_cwindow')
let g:pylint_cwindow = 1
endif
if exists(':Pylint') != 2
command Pylint :call Pylint(0)
endif
if exists(":CompilerSet") != 2 " older Vim always used :setlocal
command -nargs=* CompilerSet setlocal <args>
endif
" We should echo filename because pylint truncates .py
" If someone know better way - let me know :)
CompilerSet makeprg=(echo\ '[%]';\ pylint\ -r\ y\ %)
" We could omit end of file-entry, there is only one file
" %+I... - include code rating information
" %-G... - remove all remaining report lines from quickfix buffer
CompilerSet efm=%+P[%f],%t:\ %#%l:%m,%Z,%+IYour\ code%m,%Z,%-G%.%#
if g:pylint_onwrite
augroup python
au!
au BufWritePost * call Pylint(1)
augroup end
endif
function! Pylint(writing)
if !a:writing && &modified
" Save before running
write
endif
if has('win32') || has('win16') || has('win95') || has('win64')
setlocal sp=>%s
else
setlocal sp=>%s\ 2>&1
endif
" If check is executed by buffer write - do not jump to first error
if !a:writing
silent make
else
silent make!
endif
if g:pylint_cwindow
cwindow
endif
call PylintEvaluation()
if g:pylint_show_rate
echon 'code rate: ' b:pylint_rate ', prev: ' b:pylint_prev_rate
endif
endfunction
function! PylintEvaluation()
let l:list = getqflist()
let b:pylint_rate = '0.00'
let b:pylint_prev_rate = '0.00'
for l:item in l:list
if l:item.type == 'I' && l:item.text =~ 'Your code has been rated'
let l:re_rate = '\(-\?[0-9]\{1,2\}\.[0-9]\{2\}\)/'
let b:pylint_rate = substitute(l:item.text, '.*rated at '.l:re_rate.'.*', '\1', 'g')
" Only if there is information about previous run
if l:item.text =~ 'previous run: '
let b:pylint_prev_rate = substitute(l:item.text, '.*previous run: '.l:re_rate.'.*', '\1', 'g')
endif
endif
endfor
endfunction
let current_compiler = "pylint"
CompilerSet makeprg=$HOME/.vim/bin/pylint_parseable.py\ %
CompilerSet efm=%f:\ %t:\ %l:\ %c:\ %m,%f:\ %t:\ %l:\ %m

View File

@@ -1,28 +1,61 @@
set cinkeys-=0#
set expandtab
set foldlevel=100
set foldmethod=indent
set indentkeys-=0#
set list
set noautoindent
set shiftwidth=4
set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class,with
set smarttab
set softtabstop=4
set tabstop=4
set textwidth=78
set colorcolumn=+1
setlocal cinkeys-=0#
setlocal indentkeys-=0#
setlocal expandtab
setlocal foldlevel=100
setlocal foldmethod=indent
setlocal list
setlocal noautoindent
setlocal shiftwidth=4
setlocal smartindent
setlocal cinwords=if,elif,else,for,while,try,except,finally,def,class,with
setlocal smarttab
setlocal softtabstop=4
setlocal tabstop=4
setlocal textwidth=78
setlocal colorcolumn=+1
inoremap # X<BS>#
set wildignore+=*.pyc
"inoremap # X<BS>#
"set ofu=syntaxcomplete#Complete
let g:pylint_onwrite = 0 " I don't want to run pylint on every save
compiler pylint
"autocmd FileType python setlocal omnifunc=pysmell#Complete
let python_highlight_all=1
"Load views for py files
autocmd BufWinLeave *.py mkview
autocmd BufWinEnter *.py silent loadview
compiler pylint
finish "end here. all below is just for the record.
" Pylint function, which can be optionally mapped to some keys. Currently
" not used.
if !exists('*<SID>runPyLint')
function <SID>runPyLint()
echohl Statement
echo "Running pylint (ctrl-c to cancel) ..."
echohl Normal
:Pylint
endfunction
endif
if !exists('*<SID>PyLintBuf')
function <SID>PyLintBuf()
echohl Statement
echo "Running pylint (ctrl-c to cancel) ..."
echohl Normal
let file = expand('%:p')
let cmd = 'pylint --reports=n --output-format=text "' . file . '"'
if has('win32') || has('win64')
let cmd = 'cmd /c "' . cmd . '"'
endif
exec "bel silent new " . file . ".lint"
exec "silent! read! " . cmd
endfunction
endif

119
ftplugin/python/pep8_fn.vim Normal file
View File

@@ -0,0 +1,119 @@
" File: pep8_fn.vim
" Author: Roman 'gryf' Dobosz (gryf73 at gmail.com)
" Version: 1.0
" Last Modified: 2010-09-12
"
" Overview
" --------
" This plugin provides functionality to static checks for python files
" regarding PEP8 guidance[1] as ":Pep8" command.
"
" This function does not use pep8[2] command line utility, but relies on pep8
" module.
"
" This script uses python, therefore VIm should be compiled with python
" support. You can check it by issuing ":version" command, and search for
" "+python" inside features list.
"
" Couple of ideas was taken from pyflakes.vim[3] plugin.
"
" Installation
" ------------
" 1. Copy the pep8_fn.vim file to the $HOME/.vim/ftplugin/python or
" $HOME/vimfiles/ftplugin/python or $VIM/vimfiles/ftplugin/python
" directory. If python directory doesn't exists, it should be created.
" Refer to the following Vim help topics for more information about Vim
" plugins:
" :help add-plugin
" :help add-global-plugin
" :help runtimepath
" 2. It should be possible to import pep8 from python interpreter (it should
" report no error):
" >>> import pep8
" >>>
" If there are errors, install pep8 first. Simplest way to do it, is to
" use easy_install[4] shell command as a root:
" # easy_install pep8
" 3. Restart Vim.
" 4. You can now use the ":Pep8" which will examine current python buffer
" and open quickfix buffer with errors if any.
"
" [1] http://www.python.org/dev/peps/pep-0008/
" [2] http://pypi.python.org/pypi/pep8
" [3] http://www.vim.org/scripts/script.php?script_id=2441
" [4] http://pypi.python.org/pypi/setuptools
if exists("b:did_pep8_plugin")
finish " only load once
else
let b:did_pep8_plugin = 1
endif
if !exists("b:did_pep8_init")
let b:did_pep8_init = 0
if !has('python')
echoerr "Error: the pep8_fn.vim plugin requires Vim to be compiled with +python"
finish
endif
python << EOF
import vim
import sys
from StringIO import StringIO
try:
import pep8
except ImportError:
raise AssertionError('Error: pep8_fn.vim requires module pep8')
class VImPep8(object):
def __init__(self):
self.fname = vim.current.buffer.name
self.bufnr = vim.current.buffer.number
self.output = []
def reporter(self, lnum, col, text, check):
self.output.append([lnum, col, text])
def run(self):
pep8.process_options(['-r', vim.current.buffer.name])
checker = pep8.Checker(vim.current.buffer.name)
checker.report_error = self.reporter
checker.check_all()
self.process_output()
def process_output(self):
vim.command('call setqflist([])')
qf_list = []
qf_dict = {}
for line in self.output:
qf_dict['bufnr'] = self.bufnr
qf_dict['lnum'] = line[0]
qf_dict['col'] = line[1]
qf_dict['text'] = line[2]
qf_dict['type'] = line[2][0]
qf_list.append(qf_dict)
qf_dict = {}
self.output = []
vim.command('call setqflist(%s)' % str(qf_list))
if qf_list:
vim.command('copen')
EOF
let b:did_pep8_init = 1
endif
if !exists('*s:Pep8')
function s:Pep8()
python << EOF
VImPep8().run()
EOF
endfunction
endif
if !exists(":Pep8")
command Pep8 call s:Pep8()
endif

View File

@@ -0,0 +1,143 @@
" File: pythonlint.vim
" Author: Roman 'gryf' Dobosz (gryf73 at gmail.com)
" Version: 1.0
" Last Modified: 2010-09-11
"
" Overview
" --------
" This plugin provides ":Pylint" command, which put pylint result into quickfix
" buffer. This function does not uses pylint[1] command line utility, only
" python pylint.lint module is used instead. So it makes the pylint
" egg/package required for running this script.
"
" This script uses python, therefore VIm should be compiled with python
" support. You can check it by issuing ":version" command, and search for
" "+python" inside features list.
"
" Couple of ideas was taken from pyflakes.vim[2] plugin.
"
" Installation
" ------------
" 1. Copy the pythonlint.vim file to the $HOME/.vim/ftplugin/python or
" $HOME/vimfiles/ftplugin/python or $VIM/vimfiles/ftplugin/python
" directory. If python directory doesn't exists, it should be created.
" Refer to the following Vim help topics for more information about Vim
" plugins:
" :help add-plugin
" :help add-global-plugin
" :help runtimepath
" 2. It should be possible to import pylint from python interpreter (it should
" report no error):
" >>> import pylint
" >>>
" If there are errors, install pylint first. Simplest way to do it, is to
" use easy_install[3] shell command as a root:
" # easy_install pylint
" 3. Restart Vim.
" 4. You can now use the ":Pylint" which will examine current python buffer
" and open quickfix buffer with errors if any.
"
" [1] http://www.logilab.org/project/pylint
" [2] http://www.vim.org/scripts/script.php?script_id=2441
" [3] http://pypi.python.org/pypi/setuptools
if exists("b:did_pylint_plugin")
finish " only load once
else
let b:did_pylint_plugin = 1
endif
if !exists("b:did_pylint_init")
let b:did_pylint_init = 0
if !has('python')
echoerr "Error: the pythonlint.vim plugin requires Vim to be compiled with +python"
finish
endif
python << EOF
import vim
import sys
from StringIO import StringIO
try:
from pylint import lint
from pylint.reporters.text import TextReporter
except ImportError:
raise AssertionError('Pylint is required for this plugin')
class VImPylint(object):
sys_stderr = sys.stderr
dummy_stderr = StringIO()
conf_msg = 'No config file found, using default configuration\n'
@classmethod
def run(self):
"""execute pylint and fill the quickfix"""
# clear QF window
vim.command('call setqflist([])')
# args
args = ['-rn', # display only the messages instead of full report
'-iy', # Include message's id in output
vim.current.buffer.name]
buf = StringIO() # file-like buffer, instead of stdout
reporter = TextReporter(buf)
sys.stderr = self.dummy_stderr
lint.Run(args, reporter=reporter, exit=False)
sys.stderr = self.sys_stderr
self.dummy_stderr.seek(0)
error_list = self.dummy_stderr.readlines()
self.dummy_stderr.truncate(0)
if error_list and self.conf_msg in error_list:
error_list.remove(self.conf_msg)
if error_list:
raise Exception(''.join(error_list))
buf.seek(0)
bufnr = vim.current.buffer.number
code_line = {}
error_list = []
carriage_re = re.compile(r'\s*\^+$')
error_re = re.compile(r'^([C,R,W,E,F].+):\s+?([0-9]+):?.*:\s(.*)$')
for line in buf:
line = line.rstrip() # remove trailing newline character
if error_re.match(line):
if code_line:
code_line['bufnr'] = bufnr
error_list.append(code_line)
code_line = {}
code_line['type'], code_line['lnum'], code_line['text'] = \
error_re.match(line).groups()
if carriage_re.match(line) and code_line:
code_line['col'] = carriage_re.match(line).group().find('^') \
+ 1
vim.command('call setqflist(%s)' % str(error_list))
if error_list:
vim.command('copen')
EOF
let b:did_pylint_init = 1
endif
if !exists('*s:Pylint')
function s:Pylint()
python << EOF
VImPylint.run()
EOF
endfunction
endif
if !exists(":Pylint")
command Pylint call s:Pylint()
endif