Python checker: new option g:syntastic_python_python_use_codec (@delfick).

The new option tells the checket to load the file in memory and look for
a comment line "# coding: <codec>".  If found, the named codec is used
to decode the file before checking.  This makes sense only if said codec
doesn't change the line numbers of the initial file.  An example of such
codec is "spec" provided by the "Nose of Yeti" library:

https://github.com/delfick/nose-of-yeti
This commit is contained in:
LCD 47 2015-01-17 11:17:35 +02:00
parent 4d1f2e23ef
commit 5359f7f4e1
3 changed files with 40 additions and 3 deletions

View File

@ -19,7 +19,7 @@ if has('reltime')
lockvar! g:_SYNTASTIC_START
endif
let g:_SYNTASTIC_VERSION = '3.5.0-72'
let g:_SYNTASTIC_VERSION = '3.5.0-146'
lockvar g:_SYNTASTIC_VERSION
" Sanity checks {{{1

31
syntax_checkers/python/codec.py Executable file
View File

@ -0,0 +1,31 @@
#!/usr/bin/env python
from __future__ import print_function
from sys import argv, exit
import codecs
import re
import os
if len(argv) != 2:
exit(1)
try:
with open(argv[1]) as fle:
text = fle.readlines()
if text:
match = re.match(r"#\s*coding\s*:\s*(?P<coding>\w+)", text[0])
if match:
text = codecs.lookup(match.groupdict()["coding"]).incrementaldecoder().decode(
''.join(text).encode('utf-8')).encode('utf-8')
if isinstance(text, list):
text = ''.join(text).encode('utf-8')
compile(text, argv[1], 'exec', 0, 1)
except SyntaxError as err:
print('%s:%s:%s: %s' % (err.filename, err.lineno, err.offset, err.msg))
except Exception as err:
print('%s:%s:%s: %s' % (os.path.abspath(argv[1]), 1, 0, err))

View File

@ -15,10 +15,14 @@ if exists("g:loaded_syntastic_python_python_checker")
endif
let g:loaded_syntastic_python_python_checker = 1
if !exists('g:syntastic_python_python_use_codec')
let g:syntastic_python_python_use_codec = 0
endif
let s:save_cpo = &cpo
set cpo&vim
let s:compiler = expand('<sfile>:p:h', 1) . syntastic#util#Slash() . 'compile.py'
let s:base_path = expand('<sfile>:p:h', 1) . syntastic#util#Slash()
function! SyntaxCheckers_python_python_IsAvailable() dict
if !executable(self.getExec())
@ -32,7 +36,9 @@ function! SyntaxCheckers_python_python_IsAvailable() dict
endfunction
function! SyntaxCheckers_python_python_GetLocList() dict
let makeprg = self.makeprgBuild({ 'exe': [self.getExec(), s:compiler] })
let compiler = s:base_path . (g:syntastic_python_python_use_codec ? 'codec.py' : 'compile.py')
call self.log('using compiler script', compiler)
let makeprg = self.makeprgBuild({ 'exe': [self.getExec(), compiler] })
let errorformat = '%E%f:%l:%c: %m'