From 5359f7f4e16a32ccf809c885206c9d6cfc53133b Mon Sep 17 00:00:00 2001 From: LCD 47 Date: Sat, 17 Jan 2015 11:17:35 +0200 Subject: [PATCH] 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: ". 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 --- plugin/syntastic.vim | 2 +- syntax_checkers/python/codec.py | 31 +++++++++++++++++++++++++++++++ syntax_checkers/python/python.vim | 10 ++++++++-- 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100755 syntax_checkers/python/codec.py diff --git a/plugin/syntastic.vim b/plugin/syntastic.vim index f9a2a1f2..79c200f2 100644 --- a/plugin/syntastic.vim +++ b/plugin/syntastic.vim @@ -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 diff --git a/syntax_checkers/python/codec.py b/syntax_checkers/python/codec.py new file mode 100755 index 00000000..6e980c7b --- /dev/null +++ b/syntax_checkers/python/codec.py @@ -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\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)) diff --git a/syntax_checkers/python/python.vim b/syntax_checkers/python/python.vim index 1ffc073e..6d0c11e6 100644 --- a/syntax_checkers/python/python.vim +++ b/syntax_checkers/python/python.vim @@ -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(':p:h', 1) . syntastic#util#Slash() . 'compile.py' +let s:base_path = expand(':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'