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:
parent
4d1f2e23ef
commit
5359f7f4e1
@ -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
31
syntax_checkers/python/codec.py
Executable 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))
|
@ -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'
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user