Updated plugins
This commit is contained in:
parent
c3ba0f3c06
commit
e7a01094b6
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -5,3 +5,4 @@ sources_forked/yankring/doc/tags
|
|||
sources_non_forked/tlib/doc/tags
|
||||
my_configs.vim
|
||||
tags
|
||||
.DS_Store
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
" Copyright (c) 2013 Junegunn Choi
|
||||
" Copyright (c) 2014 Junegunn Choi
|
||||
"
|
||||
" MIT License
|
||||
"
|
||||
|
@ -33,13 +33,12 @@ function! s:set_color(group, attr, color)
|
|||
execute printf("hi %s %s%s=%s", a:group, gui ? 'gui' : 'cterm', a:attr, a:color)
|
||||
endfunction
|
||||
|
||||
function! s:blank()
|
||||
let main = bufwinnr(t:goyo_master)
|
||||
if main != -1
|
||||
execute main . 'wincmd w'
|
||||
else
|
||||
function! s:blank(repel)
|
||||
if bufwinnr(t:goyo_pads.r) <= bufwinnr(t:goyo_pads.l) + 1
|
||||
\ || bufwinnr(t:goyo_pads.b) <= bufwinnr(t:goyo_pads.t) + 3
|
||||
call s:goyo_off()
|
||||
endif
|
||||
execute 'wincmd' a:repel
|
||||
endfunction
|
||||
|
||||
function! s:init_pad(command)
|
||||
|
@ -59,12 +58,12 @@ function! s:init_pad(command)
|
|||
return bufnr
|
||||
endfunction
|
||||
|
||||
function! s:setup_pad(bufnr, vert, size)
|
||||
function! s:setup_pad(bufnr, vert, size, repel)
|
||||
let win = bufwinnr(a:bufnr)
|
||||
execute win . 'wincmd w'
|
||||
execute (a:vert ? 'vertical ' : '') . 'resize ' . max([0, a:size])
|
||||
augroup goyop
|
||||
autocmd WinEnter,CursorMoved <buffer> nested call s:blank()
|
||||
execute 'autocmd WinEnter,CursorMoved <buffer> nested call s:blank("'.a:repel.'")'
|
||||
autocmd WinLeave <buffer> call s:hide_statusline()
|
||||
augroup END
|
||||
|
||||
|
@ -86,17 +85,21 @@ function! s:hmargin()
|
|||
endfunction
|
||||
|
||||
function! s:resize_pads()
|
||||
let t:goyo_width = max([2, t:goyo_width])
|
||||
let t:goyo_margin_top = min([max([2, t:goyo_margin_top]), &lines / 2 - 1])
|
||||
let t:goyo_margin_bottom = min([max([2, t:goyo_margin_bottom]), &lines / 2 - 1])
|
||||
|
||||
let hmargin = s:hmargin()
|
||||
let tmargin = get(g:, 'goyo_margin_top', 4)
|
||||
let bmargin = get(g:, 'goyo_margin_bottom', 4)
|
||||
|
||||
augroup goyop
|
||||
autocmd!
|
||||
augroup END
|
||||
call s:setup_pad(t:goyo_pads.t, 0, tmargin - 1)
|
||||
call s:setup_pad(t:goyo_pads.b, 0, bmargin - 2)
|
||||
call s:setup_pad(t:goyo_pads.l, 1, hmargin / 2 - 1)
|
||||
call s:setup_pad(t:goyo_pads.r, 1, hmargin / 2 - 1)
|
||||
call s:setup_pad(t:goyo_pads.t, 0, t:goyo_margin_top - 1, 'j')
|
||||
call s:setup_pad(t:goyo_pads.b, 0, t:goyo_margin_bottom - 2, 'k')
|
||||
call s:setup_pad(t:goyo_pads.l, 1, hmargin / 2 - 1, 'l')
|
||||
call s:setup_pad(t:goyo_pads.r, 1, hmargin / 2 - 1, 'h')
|
||||
|
||||
let t:goyo_width = winwidth(0)
|
||||
endfunction
|
||||
|
||||
function! s:tranquilize()
|
||||
|
@ -119,6 +122,41 @@ function! s:hide_statusline()
|
|||
let &l:statusline = repeat(' ', winwidth(0))
|
||||
endfunction
|
||||
|
||||
function! s:hide_linenr()
|
||||
if !get(g:, 'goyo_linenr', 0)
|
||||
setlocal nonu
|
||||
if exists('&rnu')
|
||||
setlocal nornu
|
||||
endif
|
||||
endif
|
||||
if exists('&colorcolumn')
|
||||
setlocal colorcolumn=
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:maps_nop()
|
||||
let mapped = filter(['R', 'H', 'J', 'K', 'L', '|', '_', '='],
|
||||
\ "empty(maparg(\"\<c-w>\".v:val, 'n'))")
|
||||
for c in mapped
|
||||
execute 'nnoremap <c-w>'.escape(c, '|').' <nop>'
|
||||
endfor
|
||||
return mapped
|
||||
endfunction
|
||||
|
||||
function! s:maps_resize()
|
||||
let commands = {
|
||||
\ '>': ':<c-u>let t:goyo_width = winwidth(0) + 2 * v:count1 <bar> call <sid>resize_pads()<cr>',
|
||||
\ '<': ':<c-u>let t:goyo_width = winwidth(0) - 2 * v:count1 <bar> call <sid>resize_pads()<cr>',
|
||||
\ '+': ':<c-u>let t:goyo_margin_top -= v:count1 <bar> let t:goyo_margin_bottom -= v:count1 <bar> call <sid>resize_pads()<cr>',
|
||||
\ '-': ':<c-u>let t:goyo_margin_top += v:count1 <bar> let t:goyo_margin_bottom += v:count1 <bar> call <sid>resize_pads()<cr>'
|
||||
\ }
|
||||
let mapped = filter(keys(commands), "empty(maparg(\"\<c-w>\".v:val, 'n'))")
|
||||
for c in mapped
|
||||
execute 'nnoremap <silent> <c-w>'.c.' '.commands[c]
|
||||
endfor
|
||||
return mapped
|
||||
endfunction
|
||||
|
||||
function! s:goyo_on(width)
|
||||
let s:orig_tab = tabpagenr()
|
||||
|
||||
|
@ -127,6 +165,8 @@ function! s:goyo_on(width)
|
|||
|
||||
let t:goyo_master = winbufnr(0)
|
||||
let t:goyo_width = a:width
|
||||
let t:goyo_margin_top = get(g:, 'goyo_margin_top', 4)
|
||||
let t:goyo_margin_bottom = get(g:, 'goyo_margin_bottom', 4)
|
||||
let t:goyo_pads = {}
|
||||
let t:goyo_revert =
|
||||
\ { 'laststatus': &laststatus,
|
||||
|
@ -140,6 +180,7 @@ function! s:goyo_on(width)
|
|||
\ 'sidescroll': &sidescroll,
|
||||
\ 'sidescrolloff': &sidescrolloff
|
||||
\ }
|
||||
let t:goyo_maps = extend(s:maps_nop(), s:maps_resize())
|
||||
if has('gui_running')
|
||||
let t:goyo_revert.guioptions = &guioptions
|
||||
endif
|
||||
|
@ -177,16 +218,7 @@ function! s:goyo_on(width)
|
|||
silent! call lightline#disable()
|
||||
endif
|
||||
|
||||
if !get(g:, 'goyo_linenr', 0)
|
||||
setlocal nonu
|
||||
if exists('&rnu')
|
||||
setlocal nornu
|
||||
endif
|
||||
endif
|
||||
if exists('&colorcolumn')
|
||||
setlocal colorcolumn=
|
||||
endif
|
||||
|
||||
call s:hide_linenr()
|
||||
" Global options
|
||||
let &winheight = max([&winminheight, 1])
|
||||
set winminheight=1
|
||||
|
@ -217,11 +249,11 @@ function! s:goyo_on(width)
|
|||
|
||||
augroup goyo
|
||||
autocmd!
|
||||
autocmd BufWinLeave <buffer> call s:goyo_off()
|
||||
autocmd TabLeave * call s:goyo_off()
|
||||
autocmd VimResized * call s:resize_pads()
|
||||
autocmd ColorScheme * call s:tranquilize()
|
||||
autocmd WinEnter,WinLeave <buffer> call s:hide_statusline()
|
||||
autocmd BufWinEnter * call s:hide_linenr() | call s:hide_statusline()
|
||||
autocmd WinEnter,WinLeave * call s:hide_statusline()
|
||||
augroup END
|
||||
|
||||
call s:hide_statusline()
|
||||
|
@ -251,6 +283,10 @@ function! s:goyo_off()
|
|||
augroup END
|
||||
augroup! goyop
|
||||
|
||||
for c in t:goyo_maps
|
||||
execute 'nunmap <c-w>'.escape(c, '|')
|
||||
endfor
|
||||
|
||||
let goyo_revert = t:goyo_revert
|
||||
let goyo_disabled_gitgutter = t:goyo_disabled_gitgutter
|
||||
let goyo_disabled_signify = t:goyo_disabled_signify
|
||||
|
@ -268,6 +304,7 @@ function! s:goyo_off()
|
|||
tabclose
|
||||
execute 'normal! '.s:orig_tab.'gt'
|
||||
if winbufnr(0) == goyo_orig_buffer
|
||||
" Doesn't work if window closed with `q`
|
||||
execute printf('normal! %dG%d|', line, col)
|
||||
endif
|
||||
|
||||
|
|
|
@ -623,8 +623,13 @@ function! s:Path.str(...)
|
|||
|
||||
if has_key(options, 'truncateTo')
|
||||
let limit = options['truncateTo']
|
||||
if len(toReturn) > limit
|
||||
let toReturn = "<" . strpart(toReturn, len(toReturn) - limit + 1)
|
||||
if len(toReturn) > limit-1
|
||||
let toReturn = toReturn[(len(toReturn)-limit+1):]
|
||||
if len(split(toReturn, '/')) > 1
|
||||
let toReturn = '</' . join(split(toReturn, '/')[1:], '/') . '/'
|
||||
else
|
||||
let toReturn = '<' . toReturn
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
|
|
|
@ -18,10 +18,27 @@
|
|||
|
||||
|
||||
- - -
|
||||
1\. [Introduction](#introduction)
|
||||
2\. [Installation](#installation)
|
||||
3\. [FAQ](#faq)
|
||||
4\. [Other resources](#otherresources)
|
||||
1. [Introduction](#introduction)
|
||||
2. [Installation](#installation)
|
||||
2.1. [Requirements](#requirements)
|
||||
2.2. [Installing syntastic with Pathogen](#installpathogen)
|
||||
3. [Recommended settings](#settings)
|
||||
4. [FAQ](#faq)
|
||||
4.1. [I installed syntastic but it isn't reporting any errors...](#faqinfo)
|
||||
4.2. [The `python` checker complains about syntactically valid Python 3 constructs...](#faqpython3)
|
||||
4.3. [Are there any local checkers for HTML5 that I can use with syntastic?](#faqhtml5)
|
||||
4.4. [The `perl` checker has stopped working...](#faqperl)
|
||||
4.5. [What happened to the `rustc` checker?](#faqrust)
|
||||
4.6. [I run a checker and the location list is not updated...](#faqloclist)
|
||||
4.6. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist)
|
||||
4.7. [How can I pass additional arguments to a checker?](#faqargs)
|
||||
4.8. [Syntastic supports several checkers for my filetype - how do I tell which one(s) to use?](#faqcheckers)
|
||||
4.9. [What is the difference between syntax checkers and style checkers?](#faqstyle)
|
||||
4.10. [I have enabled multiple checkers for the current filetype. How can I display all of the errors from all of the checkers together?](#faqaggregate)
|
||||
4.11. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext)
|
||||
4.12. [The error window is closed automatically when I :quit the current buffer but not when I :bdelete it?](#faqbdelete)
|
||||
5. [Resources](#otherresources)
|
||||
|
||||
- - -
|
||||
|
||||
<a name="introduction"></a>
|
||||
|
@ -35,17 +52,17 @@ are detected, the user is notified and is happy because they didn't have to
|
|||
compile their code or execute their script to find them.
|
||||
|
||||
At the time of this writing, syntax checking plugins exist for ActionScript,
|
||||
Ada, AppleScript, Arduino, AsciiDoc, ASM, BEMHTML, Bro, Bourne shell, C,
|
||||
C++, C#, Cabal, Chef, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart,
|
||||
DocBook, Dust, Elixir, Erlang, eRuby, Fortran, Gentoo metadata, GLSL, Go,
|
||||
Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, JSON, JSX, LESS,
|
||||
Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown, MATLAB, NASM,
|
||||
Objective-C, Objective-C++, OCaml, Perl, Perl POD, PHP, gettext Portable
|
||||
Object, OS X and iOS property lists, Puppet, Python, R, Racket, Relax NG,
|
||||
reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, Tcl, TeX, Texinfo,
|
||||
Twig, TypeScript, Vala, Verilog, VHDL, VimL, xHtml, XML, XSLT, YACC, YAML,
|
||||
z80, Zope page templates, and zsh. See the [wiki][3] for details about the
|
||||
corresponding supported checkers.
|
||||
Ada, AppleScript, AsciiDoc, ASM, BEMHTML, Bro, Bourne shell, C, C++, C#, Cabal,
|
||||
Chef, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, DocBook, Dust,
|
||||
Elixir, Erlang, eRuby, Fortran, Gentoo metadata, GLSL, Go, Haml, Haskell,
|
||||
Haxe, Handlebars, HSS, HTML, Java, JavaScript, JSON, JSX, LESS, Lex, Limbo,
|
||||
LISP, LLVM intermediate language, Lua, Markdown, MATLAB, NASM, Objective-C,
|
||||
Objective-C++, OCaml, Perl, Perl POD, PHP, gettext Portable Object, OS X and
|
||||
iOS property lists, Puppet, Python, R, Racket, Relax NG, reStructuredText, RPM
|
||||
spec, Ruby, SASS/SCSS, Scala, Slim, Tcl, TeX, Texinfo, Twig, TypeScript, Vala,
|
||||
Verilog, VHDL, VimL, xHtml, XML, XSLT, YACC, YAML, z80, Zope page templates,
|
||||
and zsh. See the [wiki][3] for details about the corresponding supported
|
||||
checkers.
|
||||
|
||||
Below is a screenshot showing the methods that Syntastic uses to display syntax
|
||||
errors. Note that, in practise, you will only have a subset of these methods
|
||||
|
@ -128,18 +145,36 @@ If you get an error when you do this, then you probably didn't install
|
|||
following:
|
||||
|
||||
1. Created both the `~/.vim/autoload` and `~/.vim/bundle` directories.
|
||||
2. Added the `call pathogen#infect()` line to your `~/.vimrc` file
|
||||
2. Added the `execute pathogen#infect()` line to your `~/.vimrc` file
|
||||
3. Did the `git clone` of syntastic inside `~/.vim/bundle`
|
||||
4. Have permissions to access all of these directories.
|
||||
|
||||
<a name="settings"></a>
|
||||
|
||||
## 3\. Recommended settings
|
||||
|
||||
Syntastic has a large number of options that can be configured, and the
|
||||
defaults are not particularly well suitable for new users. It is recommended
|
||||
that you start by adding the following lines to your `vimrc` file, and return
|
||||
to them after reading the manual (see `:help syntastic` in Vim):
|
||||
```vim
|
||||
set statusline+=%#warningmsg#
|
||||
set statusline+=%{SyntasticStatuslineFlag()}
|
||||
set statusline+=%*
|
||||
|
||||
let g:syntastic_always_populate_loc_list = 1
|
||||
let g:syntastic_auto_loc_list = 1
|
||||
let g:syntastic_check_on_open = 1
|
||||
let g:syntastic_check_on_wq = 0
|
||||
```
|
||||
|
||||
<a name="faq"></a>
|
||||
|
||||
## 3\. FAQ
|
||||
## 4\. FAQ
|
||||
|
||||
<a name="faqinfo"></a>
|
||||
|
||||
__Q. I installed syntastic but it isn't reporting any errors...__
|
||||
__4.1. Q. I installed syntastic but it isn't reporting any errors...__
|
||||
|
||||
A. The most likely reason is that none of the syntax checkers that it requires
|
||||
is installed. For example: by default, python requires either `flake8` or
|
||||
|
@ -155,7 +190,7 @@ create an issue - or better yet, create a pull request.
|
|||
|
||||
<a name="faqpython3"></a>
|
||||
|
||||
__Q. The `python` checker complains about syntactically valid Python 3 constructs...__
|
||||
__4.2. Q. The `python` checker complains about syntactically valid Python 3 constructs...__
|
||||
|
||||
A. Configure the `python` checker to call a Python 3 interpreter rather than
|
||||
Python 2, e.g:
|
||||
|
@ -163,9 +198,27 @@ Python 2, e.g:
|
|||
let g:syntastic_python_python_exec = '/path/to/python3'
|
||||
```
|
||||
|
||||
<a name="faqhtml5"></a>
|
||||
|
||||
__4.3. Q. Are there any local checkers for HTML5 that I can use with syntastic?__
|
||||
|
||||
[HTML Tidy][18] has a fork named [HTML Tidy for HTML5][19]. It's a drop
|
||||
in replacement, and syntastic can use it without changes. Just install it
|
||||
somewhere and point `g:syntastic_html_tidy_exec` to its executable.
|
||||
|
||||
Alternatively, you can install [vnu.jar][21] from the [validator.nu][20]
|
||||
project and run it as a [HTTP server][23]:
|
||||
```sh
|
||||
$ java -Xss512k -cp /path/to/vnu.jar nu.validator.servlet.Main 8888
|
||||
```
|
||||
Then you can [configure][22] syntastic to use it:
|
||||
```vim
|
||||
let g:syntastic_html_validator_api = 'http://localhost:8888/'
|
||||
```
|
||||
|
||||
<a name="faqperl"></a>
|
||||
|
||||
__Q. The `perl` checker has stopped working...__
|
||||
__4.4. Q. The `perl` checker has stopped working...__
|
||||
|
||||
A. The `perl` checker runs `perl -c` against your file, which in turn
|
||||
__executes__ any `BEGIN`, `UNITCHECK`, and `CHECK` blocks, and any `use`
|
||||
|
@ -174,14 +227,14 @@ wrote the file yourself, but it's a security problem if you're checking third
|
|||
party files. Since there is currently no way to disable this behaviour while
|
||||
still producing useful results, the checker is now disabled by default. To
|
||||
(re-)enable it, make sure the `g:syntastic_perl_checkers` list includes `perl`,
|
||||
and set `g:syntastic_enable_perl_checker` to 1 in your vimrc:
|
||||
and set `g:syntastic_enable_perl_checker` to 1 in your `vimrc`:
|
||||
```vim
|
||||
let g:syntastic_enable_perl_checker = 1
|
||||
```
|
||||
|
||||
<a name="faqrust"></a>
|
||||
|
||||
__Q. What happened to the `rustc` checker?__
|
||||
__4.5. Q. What happened to the `rustc` checker?__
|
||||
|
||||
A. It has been included in the [Rust compiler package][12]. If you have
|
||||
a recent version of the Rust compiler, the checker should be picked up
|
||||
|
@ -189,27 +242,27 @@ automatically by syntastic.
|
|||
|
||||
<a name="faqloclist"></a>
|
||||
|
||||
__Q. I run a checker and the location list is not updated...__
|
||||
__Q. I run`:lopen` or `:lwindow` and the error window is empty...__
|
||||
__4.6. Q. I run a checker and the location list is not updated...__
|
||||
__4.6. Q. I run`:lopen` or `:lwindow` and the error window is empty...__
|
||||
|
||||
A. By default the location list is changed only when you run the `:Errors`
|
||||
command, in order to minimise conflicts with other plugins. If you want the
|
||||
location list to always be updated when you run the checkers, add this line to
|
||||
your vimrc:
|
||||
your `vimrc`:
|
||||
```vim
|
||||
let g:syntastic_always_populate_loc_list = 1
|
||||
```
|
||||
|
||||
<a name="faqargs"></a>
|
||||
|
||||
__Q. How can I pass additional arguments to a checker?__
|
||||
__4.7. Q. How can I pass additional arguments to a checker?__
|
||||
|
||||
A. Almost all syntax checkers use the `makeprgBuild()` function. Those checkers
|
||||
that do can be configured using global variables. The general form of the
|
||||
global `args` variables is `syntastic_<filetype>_<checker>_args`.
|
||||
|
||||
So, If you wanted to pass "--my --args --here" to the ruby mri checker you
|
||||
would add this line to your vimrc:
|
||||
So, If you wanted to pass `--my --args --here` to the ruby mri checker you
|
||||
would add this line to your `vimrc`:
|
||||
```vim
|
||||
let g:syntastic_ruby_mri_args = "--my --args --here"
|
||||
```
|
||||
|
@ -218,10 +271,10 @@ See `:help syntastic-checker-options` for more information.
|
|||
|
||||
<a name="faqcheckers"></a>
|
||||
|
||||
__Q. Syntastic supports several checkers for my filetype - how do I tell it
|
||||
__4.8. Q. Syntastic supports several checkers for my filetype - how do I tell it
|
||||
which one(s) to use?__
|
||||
|
||||
A. Stick a line like this in your vimrc:
|
||||
A. Stick a line like this in your `vimrc`:
|
||||
```vim
|
||||
let g:syntastic_<filetype>_checkers = ['<checker-name>']
|
||||
```
|
||||
|
@ -259,7 +312,7 @@ filetype of the current file is `php`).
|
|||
|
||||
<a name="faqstyle"></a>
|
||||
|
||||
__Q. What is the difference between syntax checkers and style checkers?__
|
||||
__4.9. Q. What is the difference between syntax checkers and style checkers?__
|
||||
|
||||
A. The errors and warnings they produce are highlighted differently and can
|
||||
be filtered by different rules, but otherwise the distinction is pretty much
|
||||
|
@ -289,10 +342,10 @@ See `:help syntastic_quiet_messages` for details.
|
|||
|
||||
<a name="faqaggregate"></a>
|
||||
|
||||
__Q. I have enabled multiple checkers for the current filetype. How can I
|
||||
__4.10. Q. I have enabled multiple checkers for the current filetype. How can I
|
||||
display all of the errors from all of the checkers together?__
|
||||
|
||||
A. Set `g:syntastic_aggregate_errors` to 1 in your vimrc:
|
||||
A. Set `g:syntastic_aggregate_errors` to 1 in your `vimrc`:
|
||||
```vim
|
||||
let g:syntastic_aggregate_errors = 1
|
||||
```
|
||||
|
@ -301,19 +354,19 @@ See `:help syntastic-aggregating-errors` for more details.
|
|||
|
||||
<a name="faqlnext"></a>
|
||||
|
||||
__Q. How can I jump between the different errors without using the location
|
||||
__4.11. Q. How can I jump between the different errors without using the location
|
||||
list at the bottom of the window?__
|
||||
|
||||
A. Vim provides several built-in commands for this. See `:help :lnext` and
|
||||
`:help :lprev`.
|
||||
`:help :lprevious`.
|
||||
|
||||
If you use these commands a lot then you may want to add shortcut mappings to
|
||||
your vimrc, or install something like [unimpaired][2], which provides such
|
||||
your `vimrc`, or install something like [unimpaired][2], which provides such
|
||||
mappings (among other things).
|
||||
|
||||
<a name="faqbdelete"></a>
|
||||
|
||||
__Q. The error window is closed automatically when I :quit the current buffer
|
||||
__4.12. Q. The error window is closed automatically when I :quit the current buffer
|
||||
but not when I :bdelete it?__
|
||||
|
||||
A. There is no safe way to handle that situation automatically, but you can
|
||||
|
@ -324,10 +377,9 @@ nnoremap <silent> <C-d> :lclose<CR>:bdelete<CR>
|
|||
cabbrev <silent> bd lclose\|bdelete
|
||||
```
|
||||
|
||||
|
||||
<a name="otherresources"></a>
|
||||
|
||||
## 4\. Other resources
|
||||
## 5\. Resources
|
||||
|
||||
The preferred place for posting suggestions, reporting bugs, and general
|
||||
discussions related to syntastic is the [issue tracker at GitHub][4].
|
||||
|
@ -358,6 +410,12 @@ a look at [jedi-vim][7], [python-mode][8], or [YouCompleteMe][9].
|
|||
[15]: https://github.com/MarcWeber/vim-addon-manager
|
||||
[16]: https://github.com/junegunn/vim-plug/
|
||||
[17]: https://github.com/gmarik/Vundle.vim
|
||||
[18]: http://tidy.sourceforge.net/
|
||||
[19]: http://w3c.github.io/tidy-html5/
|
||||
[20]: http://about.validator.nu/
|
||||
[21]: https://github.com/validator/validator/releases/latest
|
||||
[22]: https://github.com/scrooloose/syntastic/wiki/HTML%3A---validator
|
||||
[23]: http://validator.github.io/validator/#standalone
|
||||
|
||||
<!--
|
||||
vim:tw=79:sw=4:
|
||||
|
|
|
@ -18,9 +18,17 @@ endfunction " }}}2
|
|||
" read additional compiler flags from the given configuration file
|
||||
" the file format and its parsing mechanism is inspired by clang_complete
|
||||
function! syntastic#c#ReadConfig(file) " {{{2
|
||||
" search in the current file's directory upwards
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: looking for', a:file)
|
||||
|
||||
" search upwards from the current file's directory
|
||||
let config = findfile(a:file, '.;')
|
||||
if config == '' || !filereadable(config)
|
||||
if config == ''
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file not found')
|
||||
return ''
|
||||
endif
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: config file:', config)
|
||||
if !filereadable(config)
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file unreadable')
|
||||
return ''
|
||||
endif
|
||||
|
||||
|
@ -31,6 +39,7 @@ function! syntastic#c#ReadConfig(file) " {{{2
|
|||
try
|
||||
let lines = readfile(config)
|
||||
catch /\m^Vim\%((\a\+)\)\=:E48[45]/
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: error reading file')
|
||||
return ''
|
||||
endtry
|
||||
|
||||
|
@ -62,7 +71,7 @@ endfunction " }}}2
|
|||
" GetLocList() for C-like compilers
|
||||
function! syntastic#c#GetLocList(filetype, subchecker, options) " {{{2
|
||||
try
|
||||
let flags = s:_getCflags(a:filetype, a:subchecker, a:options)
|
||||
let flags = s:_get_cflags(a:filetype, a:subchecker, a:options)
|
||||
catch /\m\C^Syntastic: skip checks$/
|
||||
return []
|
||||
endtry
|
||||
|
@ -70,9 +79,9 @@ function! syntastic#c#GetLocList(filetype, subchecker, options) " {{{2
|
|||
let makeprg = syntastic#util#shexpand(g:syntastic_{a:filetype}_compiler) .
|
||||
\ ' ' . flags . ' ' . syntastic#util#shexpand('%')
|
||||
|
||||
let errorformat = s:_getCheckerVar('g', a:filetype, a:subchecker, 'errorformat', a:options['errorformat'])
|
||||
let errorformat = s:_get_checker_var('g', a:filetype, a:subchecker, 'errorformat', a:options['errorformat'])
|
||||
|
||||
let postprocess = s:_getCheckerVar('g', a:filetype, a:subchecker, 'remove_include_errors', 0) ?
|
||||
let postprocess = s:_get_checker_var('g', a:filetype, a:subchecker, 'remove_include_errors', 0) ?
|
||||
\ ['filterForeignErrors'] : []
|
||||
|
||||
" process makeprg
|
||||
|
@ -91,25 +100,25 @@ function! s:_init() " {{{2
|
|||
let s:handlers = []
|
||||
let s:cflags = {}
|
||||
|
||||
call s:_regHandler('\m\<cairo', 's:_check_pkg', ['cairo', 'cairo'])
|
||||
call s:_regHandler('\m\<freetype', 's:_check_pkg', ['freetype', 'freetype2', 'freetype'])
|
||||
call s:_regHandler('\m\<glade', 's:_check_pkg', ['glade', 'libglade-2.0', 'libglade'])
|
||||
call s:_regHandler('\m\<glib', 's:_check_pkg', ['glib', 'glib-2.0', 'glib'])
|
||||
call s:_regHandler('\m\<gtk', 's:_check_pkg', ['gtk', 'gtk+-2.0', 'gtk+', 'glib-2.0', 'glib'])
|
||||
call s:_regHandler('\m\<libsoup', 's:_check_pkg', ['libsoup', 'libsoup-2.4', 'libsoup-2.2'])
|
||||
call s:_regHandler('\m\<libxml', 's:_check_pkg', ['libxml', 'libxml-2.0', 'libxml'])
|
||||
call s:_regHandler('\m\<pango', 's:_check_pkg', ['pango', 'pango'])
|
||||
call s:_regHandler('\m\<SDL', 's:_check_pkg', ['sdl', 'sdl'])
|
||||
call s:_regHandler('\m\<opengl', 's:_check_pkg', ['opengl', 'gl'])
|
||||
call s:_regHandler('\m\<webkit', 's:_check_pkg', ['webkit', 'webkit-1.0'])
|
||||
call s:_registerHandler('\m\<cairo', 's:_checkPackage', ['cairo', 'cairo'])
|
||||
call s:_registerHandler('\m\<freetype', 's:_checkPackage', ['freetype', 'freetype2', 'freetype'])
|
||||
call s:_registerHandler('\m\<glade', 's:_checkPackage', ['glade', 'libglade-2.0', 'libglade'])
|
||||
call s:_registerHandler('\m\<glib', 's:_checkPackage', ['glib', 'glib-2.0', 'glib'])
|
||||
call s:_registerHandler('\m\<gtk', 's:_checkPackage', ['gtk', 'gtk+-2.0', 'gtk+', 'glib-2.0', 'glib'])
|
||||
call s:_registerHandler('\m\<libsoup', 's:_checkPackage', ['libsoup', 'libsoup-2.4', 'libsoup-2.2'])
|
||||
call s:_registerHandler('\m\<libxml', 's:_checkPackage', ['libxml', 'libxml-2.0', 'libxml'])
|
||||
call s:_registerHandler('\m\<pango', 's:_checkPackage', ['pango', 'pango'])
|
||||
call s:_registerHandler('\m\<SDL', 's:_checkPackage', ['sdl', 'sdl'])
|
||||
call s:_registerHandler('\m\<opengl', 's:_checkPackage', ['opengl', 'gl'])
|
||||
call s:_registerHandler('\m\<webkit', 's:_checkPackage', ['webkit', 'webkit-1.0'])
|
||||
|
||||
call s:_regHandler('\m\<php\.h\>', 's:_check_php', [])
|
||||
call s:_regHandler('\m\<Python\.h\>', 's:_check_python', [])
|
||||
call s:_regHandler('\m\<ruby', 's:_check_ruby', [])
|
||||
call s:_registerHandler('\m\<php\.h\>', 's:_checkPhp', [])
|
||||
call s:_registerHandler('\m\<Python\.h\>', 's:_checkPython', [])
|
||||
call s:_registerHandler('\m\<ruby', 's:_checkRuby', [])
|
||||
endfunction " }}}2
|
||||
|
||||
" return a handler dictionary object
|
||||
function! s:_regHandler(regex, function, args) " {{{2
|
||||
" register a handler dictionary object
|
||||
function! s:_registerHandler(regex, function, args) " {{{2
|
||||
let handler = {}
|
||||
let handler["regex"] = a:regex
|
||||
let handler["func"] = function(a:function)
|
||||
|
@ -117,8 +126,75 @@ function! s:_regHandler(regex, function, args) " {{{2
|
|||
call add(s:handlers, handler)
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find library with 'pkg-config'
|
||||
" search possible libraries from first to last given
|
||||
" argument until one is found
|
||||
function! s:_checkPackage(name, ...) " {{{2
|
||||
if executable('pkg-config')
|
||||
if !has_key(s:cflags, a:name)
|
||||
for pkg in a:000
|
||||
let pkg_flags = system('pkg-config --cflags ' . pkg)
|
||||
" since we cannot necessarily trust the pkg-config exit code
|
||||
" we have to check for an error output as well
|
||||
if v:shell_error == 0 && pkg_flags !~? 'not found'
|
||||
let pkg_flags = ' ' . substitute(pkg_flags, "\n", '', '')
|
||||
let s:cflags[a:name] = pkg_flags
|
||||
return pkg_flags
|
||||
endif
|
||||
endfor
|
||||
else
|
||||
return s:cflags[a:name]
|
||||
endif
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find PHP includes with 'php-config'
|
||||
function! s:_checkPhp() " {{{2
|
||||
if executable('php-config')
|
||||
if !has_key(s:cflags, 'php')
|
||||
let s:cflags['php'] = system('php-config --includes')
|
||||
let s:cflags['php'] = ' ' . substitute(s:cflags['php'], "\n", '', '')
|
||||
endif
|
||||
return s:cflags['php']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find the python headers with distutils
|
||||
function! s:_checkPython() " {{{2
|
||||
if executable('python')
|
||||
if !has_key(s:cflags, 'python')
|
||||
let s:cflags['python'] = system('python -c ''from distutils import ' .
|
||||
\ 'sysconfig; import sys; sys.stdout.write(sysconfig.get_python_inc())''')
|
||||
let s:cflags['python'] = substitute(s:cflags['python'], "\n", '', '')
|
||||
let s:cflags['python'] = ' -I' . s:cflags['python']
|
||||
endif
|
||||
return s:cflags['python']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find the ruby headers with 'rbconfig'
|
||||
function! s:_checkRuby() " {{{2
|
||||
if executable('ruby')
|
||||
if !has_key(s:cflags, 'ruby')
|
||||
let s:cflags['ruby'] = system('ruby -r rbconfig -e ' .
|
||||
\ '''puts RbConfig::CONFIG["rubyhdrdir"] || RbConfig::CONFIG["archdir"]''')
|
||||
let s:cflags['ruby'] = substitute(s:cflags['ruby'], "\n", '', '')
|
||||
let s:cflags['ruby'] = ' -I' . s:cflags['ruby']
|
||||
endif
|
||||
return s:cflags['ruby']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" }}}1
|
||||
|
||||
" Utilities {{{1
|
||||
|
||||
" resolve checker-related user variables
|
||||
function! s:_getCheckerVar(scope, filetype, subchecker, name, default) " {{{2
|
||||
function! s:_get_checker_var(scope, filetype, subchecker, name, default) " {{{2
|
||||
let prefix = a:scope . ':' . 'syntastic_'
|
||||
if exists(prefix . a:filetype . '_' . a:subchecker . '_' . a:name)
|
||||
return {a:scope}:syntastic_{a:filetype}_{a:subchecker}_{a:name}
|
||||
|
@ -130,10 +206,10 @@ function! s:_getCheckerVar(scope, filetype, subchecker, name, default) " {{{2
|
|||
endfunction " }}}2
|
||||
|
||||
" resolve user CFLAGS
|
||||
function! s:_getCflags(ft, ck, opts) " {{{2
|
||||
function! s:_get_cflags(ft, ck, opts) " {{{2
|
||||
" determine whether to parse header files as well
|
||||
if has_key(a:opts, 'header_names') && expand('%') =~? a:opts['header_names']
|
||||
if s:_getCheckerVar('g', a:ft, a:ck, 'check_header', 0)
|
||||
if has_key(a:opts, 'header_names') && expand('%', 1) =~? a:opts['header_names']
|
||||
if s:_get_checker_var('g', a:ft, a:ck, 'check_header', 0)
|
||||
let flags = get(a:opts, 'header_flags', '') . ' -c ' . syntastic#c#NullOutput()
|
||||
else
|
||||
" checking headers when check_header is unset: bail out
|
||||
|
@ -143,21 +219,21 @@ function! s:_getCflags(ft, ck, opts) " {{{2
|
|||
let flags = get(a:opts, 'main_flags', '')
|
||||
endif
|
||||
|
||||
let flags .= ' ' . s:_getCheckerVar('g', a:ft, a:ck, 'compiler_options', '') . ' ' . s:_getIncludeDirs(a:ft)
|
||||
let flags .= ' ' . s:_get_checker_var('g', a:ft, a:ck, 'compiler_options', '') . ' ' . s:_get_include_dirs(a:ft)
|
||||
|
||||
" check if the user manually set some cflags
|
||||
let b_cflags = s:_getCheckerVar('b', a:ft, a:ck, 'cflags', '')
|
||||
let b_cflags = s:_get_checker_var('b', a:ft, a:ck, 'cflags', '')
|
||||
if b_cflags == ''
|
||||
" check whether to search for include files at all
|
||||
if !s:_getCheckerVar('g', a:ft, a:ck, 'no_include_search', 0)
|
||||
if !s:_get_checker_var('g', a:ft, a:ck, 'no_include_search', 0)
|
||||
if a:ft ==# 'c' || a:ft ==# 'cpp'
|
||||
" refresh the include file search if desired
|
||||
if s:_getCheckerVar('g', a:ft, a:ck, 'auto_refresh_includes', 0)
|
||||
let flags .= ' ' . s:_searchHeaders()
|
||||
if s:_get_checker_var('g', a:ft, a:ck, 'auto_refresh_includes', 0)
|
||||
let flags .= ' ' . s:_search_headers()
|
||||
else
|
||||
" search for header includes if not cached already
|
||||
if !exists('b:syntastic_' . a:ft . '_includes')
|
||||
let b:syntastic_{a:ft}_includes = s:_searchHeaders()
|
||||
let b:syntastic_{a:ft}_includes = s:_search_headers()
|
||||
endif
|
||||
let flags .= ' ' . b:syntastic_{a:ft}_includes
|
||||
endif
|
||||
|
@ -169,7 +245,7 @@ function! s:_getCflags(ft, ck, opts) " {{{2
|
|||
endif
|
||||
|
||||
" add optional config file parameters
|
||||
let config_file = s:_getCheckerVar('g', a:ft, a:ck, 'config_file', '.syntastic_' . a:ft . '_config')
|
||||
let config_file = s:_get_checker_var('g', a:ft, a:ck, 'config_file', '.syntastic_' . a:ft . '_config')
|
||||
let flags .= ' ' . syntastic#c#ReadConfig(config_file)
|
||||
|
||||
return flags
|
||||
|
@ -177,7 +253,7 @@ endfunction " }}}2
|
|||
|
||||
" get the gcc include directory argument depending on the default
|
||||
" includes and the optional user-defined 'g:syntastic_c_include_dirs'
|
||||
function! s:_getIncludeDirs(filetype) " {{{2
|
||||
function! s:_get_include_dirs(filetype) " {{{2
|
||||
let include_dirs = []
|
||||
|
||||
if a:filetype =~# '\v^%(c|cpp|objc|objcpp)$' &&
|
||||
|
@ -195,7 +271,7 @@ endfunction " }}}2
|
|||
|
||||
" search the first 100 lines for include statements that are
|
||||
" given in the handlers dictionary
|
||||
function! s:_searchHeaders() " {{{2
|
||||
function! s:_search_headers() " {{{2
|
||||
let includes = ''
|
||||
let files = []
|
||||
let found = []
|
||||
|
@ -221,7 +297,7 @@ function! s:_searchHeaders() " {{{2
|
|||
" search included headers
|
||||
for hfile in files
|
||||
if hfile != ''
|
||||
let filename = expand('%:p:h') . syntastic#util#Slash() . hfile
|
||||
let filename = expand('%:p:h', 1) . syntastic#util#Slash() . hfile
|
||||
|
||||
try
|
||||
let lines = readfile(filename, '', 100)
|
||||
|
@ -250,69 +326,6 @@ function! s:_searchHeaders() " {{{2
|
|||
return includes
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find library with 'pkg-config'
|
||||
" search possible libraries from first to last given
|
||||
" argument until one is found
|
||||
function! s:_check_pkg(name, ...) " {{{2
|
||||
if executable('pkg-config')
|
||||
if !has_key(s:cflags, a:name)
|
||||
for pkg in a:000
|
||||
let pkg_flags = system('pkg-config --cflags ' . pkg)
|
||||
" since we cannot necessarily trust the pkg-config exit code
|
||||
" we have to check for an error output as well
|
||||
if v:shell_error == 0 && pkg_flags !~? 'not found'
|
||||
let pkg_flags = ' ' . substitute(pkg_flags, "\n", '', '')
|
||||
let s:cflags[a:name] = pkg_flags
|
||||
return pkg_flags
|
||||
endif
|
||||
endfor
|
||||
else
|
||||
return s:cflags[a:name]
|
||||
endif
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find PHP includes with 'php-config'
|
||||
function! s:_check_php() " {{{2
|
||||
if executable('php-config')
|
||||
if !has_key(s:cflags, 'php')
|
||||
let s:cflags['php'] = system('php-config --includes')
|
||||
let s:cflags['php'] = ' ' . substitute(s:cflags['php'], "\n", '', '')
|
||||
endif
|
||||
return s:cflags['php']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find the ruby headers with 'rbconfig'
|
||||
function! s:_check_ruby() " {{{2
|
||||
if executable('ruby')
|
||||
if !has_key(s:cflags, 'ruby')
|
||||
let s:cflags['ruby'] = system('ruby -r rbconfig -e ' .
|
||||
\ '''puts RbConfig::CONFIG["rubyhdrdir"] || RbConfig::CONFIG["archdir"]''')
|
||||
let s:cflags['ruby'] = substitute(s:cflags['ruby'], "\n", '', '')
|
||||
let s:cflags['ruby'] = ' -I' . s:cflags['ruby']
|
||||
endif
|
||||
return s:cflags['ruby']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find the python headers with distutils
|
||||
function! s:_check_python() " {{{2
|
||||
if executable('python')
|
||||
if !has_key(s:cflags, 'python')
|
||||
let s:cflags['python'] = system('python -c ''from distutils import ' .
|
||||
\ 'sysconfig; import sys; sys.stdout.write(sysconfig.get_python_inc())''')
|
||||
let s:cflags['python'] = substitute(s:cflags['python'], "\n", '', '')
|
||||
let s:cflags['python'] = ' -I' . s:cflags['python']
|
||||
endif
|
||||
return s:cflags['python']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" }}}1
|
||||
|
||||
" default include directories
|
||||
|
|
|
@ -61,11 +61,11 @@ endfunction " }}}2
|
|||
" @vimlint(EVL102, 0, l:OLD_VAR)
|
||||
|
||||
function! syntastic#log#debug(level, msg, ...) " {{{2
|
||||
if !s:isDebugEnabled(a:level)
|
||||
if !s:_isDebugEnabled(a:level)
|
||||
return
|
||||
endif
|
||||
|
||||
let leader = s:_logTimestamp()
|
||||
let leader = s:_log_timestamp()
|
||||
call s:_logRedirect(1)
|
||||
|
||||
if a:0 > 0
|
||||
|
@ -81,11 +81,11 @@ function! syntastic#log#debug(level, msg, ...) " {{{2
|
|||
endfunction " }}}2
|
||||
|
||||
function! syntastic#log#debugShowOptions(level, names) " {{{2
|
||||
if !s:isDebugEnabled(a:level)
|
||||
if !s:_isDebugEnabled(a:level)
|
||||
return
|
||||
endif
|
||||
|
||||
let leader = s:_logTimestamp()
|
||||
let leader = s:_log_timestamp()
|
||||
call s:_logRedirect(1)
|
||||
|
||||
let vlist = copy(type(a:names) == type("") ? [a:names] : a:names)
|
||||
|
@ -97,16 +97,16 @@ function! syntastic#log#debugShowOptions(level, names) " {{{2
|
|||
endfunction " }}}2
|
||||
|
||||
function! syntastic#log#debugShowVariables(level, names) " {{{2
|
||||
if !s:isDebugEnabled(a:level)
|
||||
if !s:_isDebugEnabled(a:level)
|
||||
return
|
||||
endif
|
||||
|
||||
let leader = s:_logTimestamp()
|
||||
let leader = s:_log_timestamp()
|
||||
call s:_logRedirect(1)
|
||||
|
||||
let vlist = type(a:names) == type("") ? [a:names] : a:names
|
||||
for name in vlist
|
||||
let msg = s:_formatVariable(name)
|
||||
let msg = s:_format_variable(name)
|
||||
if msg != ''
|
||||
echomsg leader . msg
|
||||
endif
|
||||
|
@ -116,7 +116,7 @@ function! syntastic#log#debugShowVariables(level, names) " {{{2
|
|||
endfunction " }}}2
|
||||
|
||||
function! syntastic#log#debugDump(level) " {{{2
|
||||
if !s:isDebugEnabled(a:level)
|
||||
if !s:_isDebugEnabled(a:level)
|
||||
return
|
||||
endif
|
||||
|
||||
|
@ -136,14 +136,14 @@ function! s:_isDebugEnabled_dumb(level) " {{{2
|
|||
return (g:syntastic_debug / a:level) % 2
|
||||
endfunction " }}}2
|
||||
|
||||
let s:isDebugEnabled = function(exists('*and') ? 's:_isDebugEnabled_smart' : 's:_isDebugEnabled_dumb')
|
||||
lockvar s:isDebugEnabled
|
||||
let s:_isDebugEnabled = function(exists('*and') ? 's:_isDebugEnabled_smart' : 's:_isDebugEnabled_dumb')
|
||||
lockvar s:_isDebugEnabled
|
||||
|
||||
function! s:_logRedirect(on) " {{{2
|
||||
if exists("g:syntastic_debug_file")
|
||||
if a:on
|
||||
try
|
||||
execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file))
|
||||
execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file, 1))
|
||||
catch /\m^Vim\%((\a\+)\)\=:/
|
||||
silent! redir END
|
||||
unlet g:syntastic_debug_file
|
||||
|
@ -154,11 +154,15 @@ function! s:_logRedirect(on) " {{{2
|
|||
endif
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_logTimestamp() " {{{2
|
||||
" }}}1
|
||||
|
||||
" Utilities {{{1
|
||||
|
||||
function! s:_log_timestamp() " {{{2
|
||||
return 'syntastic: ' . split(reltimestr(reltime(g:_SYNTASTIC_START)))[0] . ': '
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_formatVariable(name) " {{{2
|
||||
function! s:_format_variable(name) " {{{2
|
||||
let vals = []
|
||||
if exists('g:syntastic_' . a:name)
|
||||
call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name})))
|
||||
|
|
|
@ -30,7 +30,7 @@ endfunction " }}}2
|
|||
|
||||
function! syntastic#preprocess#checkstyle(errors) " {{{2
|
||||
let out = []
|
||||
let fname = expand('%')
|
||||
let fname = expand('%', 1)
|
||||
for err in a:errors
|
||||
if match(err, '\m<error\>') > -1
|
||||
let line = str2nr(matchstr(err, '\m\<line="\zs\d\+\ze"'))
|
||||
|
@ -59,6 +59,70 @@ function! syntastic#preprocess#cppcheck(errors) " {{{2
|
|||
return map(copy(a:errors), 'substitute(v:val, ''\v^\[[^]]+\]\zs( -\> \[[^]]+\])+\ze:'', "", "")')
|
||||
endfunction " }}}2
|
||||
|
||||
" @vimlint(EVL102, 1, l:true)
|
||||
" @vimlint(EVL102, 1, l:false)
|
||||
" @vimlint(EVL102, 1, l:null)
|
||||
function! syntastic#preprocess#flow(errors) " {{{2
|
||||
" JSON artifacts
|
||||
let true = 1
|
||||
let false = 0
|
||||
let null = ''
|
||||
|
||||
" A hat tip to Marc Weber for this trick
|
||||
" http://stackoverflow.com/questions/17751186/iterating-over-a-string-in-vimscript-or-parse-a-json-file/19105763#19105763
|
||||
try
|
||||
let errs = eval(join(a:errors, ''))
|
||||
catch
|
||||
let errs = {}
|
||||
endtry
|
||||
|
||||
let out = []
|
||||
if type(errs) == type({}) && has_key(errs, 'errors') && type(errs['errors']) == type([])
|
||||
for e in errs['errors']
|
||||
if type(e) == type({}) && has_key(e, 'message') && type(e['message']) == type([]) && len(e['message'])
|
||||
let m = e['message'][0]
|
||||
let t = e['message'][1:]
|
||||
|
||||
try
|
||||
let msg =
|
||||
\ m['path'] . ':' .
|
||||
\ m['line'] . ':' .
|
||||
\ m['start'] . ':' .
|
||||
\ (m['line'] ==# m['endline'] ? m['end'] . ':' : '') .
|
||||
\ ' ' . m['descr']
|
||||
|
||||
if len(t)
|
||||
let msg .= ' ' . join(map(t,
|
||||
\ 'v:val["descr"] . " (" . v:val["path"] . ":" . v:val["line"] . ":" . v:val["start"] . ' .
|
||||
\ '"," . (v:val["line"] !=# v:val["endline"] ? v:val["endline"] . ":" : "") . ' .
|
||||
\ 'v:val["end"] . ")"'))
|
||||
endif
|
||||
|
||||
let msg = substitute(msg, '\r', '', 'g')
|
||||
let msg = substitute(msg, '\n', ' ', 'g')
|
||||
|
||||
call add(out, msg)
|
||||
catch /\m^Vim\%((\a\+)\)\=:E716/
|
||||
call syntastic#log#warn('checker javascript/flow: unknown error format')
|
||||
let out = []
|
||||
break
|
||||
endtry
|
||||
else
|
||||
call syntastic#log#warn('checker javascript/flow: unknown error format')
|
||||
let out = []
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
else
|
||||
call syntastic#log#warn('checker javascript/flow: unknown error format')
|
||||
endif
|
||||
|
||||
return out
|
||||
endfunction " }}}2
|
||||
" @vimlint(EVL102, 0, l:true)
|
||||
" @vimlint(EVL102, 0, l:false)
|
||||
" @vimlint(EVL102, 0, l:null)
|
||||
|
||||
function! syntastic#preprocess#killEmpty(errors) " {{{2
|
||||
return filter(copy(a:errors), 'v:val != ""')
|
||||
endfunction " }}}2
|
||||
|
@ -67,7 +131,7 @@ function! syntastic#preprocess#perl(errors) " {{{2
|
|||
let out = []
|
||||
|
||||
for e in a:errors
|
||||
let parts = matchlist(e, '\v^(.*)\sat\s(.*)\sline\s(\d+)(.*)$')
|
||||
let parts = matchlist(e, '\v^(.*)\sat\s(.{-})\sline\s(\d+)(.*)$')
|
||||
if !empty(parts)
|
||||
call add(out, parts[2] . ':' . parts[3] . ':' . parts[1] . parts[4])
|
||||
endif
|
||||
|
@ -76,6 +140,9 @@ function! syntastic#preprocess#perl(errors) " {{{2
|
|||
return syntastic#util#unique(out)
|
||||
endfunction " }}}2
|
||||
|
||||
" @vimlint(EVL102, 1, l:true)
|
||||
" @vimlint(EVL102, 1, l:false)
|
||||
" @vimlint(EVL102, 1, l:null)
|
||||
function! syntastic#preprocess#prospector(errors) " {{{2
|
||||
" JSON artifacts
|
||||
let true = 1
|
||||
|
@ -125,6 +192,9 @@ function! syntastic#preprocess#prospector(errors) " {{{2
|
|||
|
||||
return out
|
||||
endfunction " }}}2
|
||||
" @vimlint(EVL102, 0, l:true)
|
||||
" @vimlint(EVL102, 0, l:false)
|
||||
" @vimlint(EVL102, 0, l:null)
|
||||
|
||||
function! syntastic#preprocess#rparse(errors) " {{{2
|
||||
let errlist = copy(a:errors)
|
||||
|
|
|
@ -47,6 +47,13 @@ function! syntastic#util#tmpdir() " {{{2
|
|||
else
|
||||
let tempdir = '/tmp/vim-syntastic-' . getpid()
|
||||
endif
|
||||
|
||||
try
|
||||
call mkdir(tempdir, 'p', 0700)
|
||||
catch /\m^Vim\%((\a\+)\)\=:E739/
|
||||
call syntastic#log#error(v:exception)
|
||||
let tempdir = '.'
|
||||
endtry
|
||||
endif
|
||||
|
||||
return tempdir
|
||||
|
@ -54,6 +61,11 @@ endfunction " }}}2
|
|||
|
||||
" Recursively remove a directory
|
||||
function! syntastic#util#rmrf(what) " {{{2
|
||||
" try to make sure we don't delete directories we didn't create
|
||||
if a:what !~? 'vim-syntastic-'
|
||||
return
|
||||
endif
|
||||
|
||||
if getftype(a:what) ==# 'dir'
|
||||
if !exists('s:rmrf')
|
||||
let s:rmrf =
|
||||
|
@ -141,14 +153,14 @@ endfunction " }}}2
|
|||
|
||||
" strwidth() was added in Vim 7.3; if it doesn't exist, we use strlen()
|
||||
" and hope for the best :)
|
||||
let s:width = function(exists('*strwidth') ? 'strwidth' : 'strlen')
|
||||
lockvar s:width
|
||||
let s:_width = function(exists('*strwidth') ? 'strwidth' : 'strlen')
|
||||
lockvar s:_width
|
||||
|
||||
function! syntastic#util#screenWidth(str, tabstop) " {{{2
|
||||
let chunks = split(a:str, "\t", 1)
|
||||
let width = s:width(chunks[-1])
|
||||
let width = s:_width(chunks[-1])
|
||||
for c in chunks[:-2]
|
||||
let cwidth = s:width(c)
|
||||
let cwidth = s:_width(c)
|
||||
let width += cwidth + a:tabstop - cwidth % a:tabstop
|
||||
endfor
|
||||
return width
|
||||
|
@ -166,7 +178,7 @@ function! syntastic#util#wideMsg(msg) " {{{2
|
|||
"convert tabs to spaces so that the tabs count towards the window
|
||||
"width as the proper amount of characters
|
||||
let chunks = split(msg, "\t", 1)
|
||||
let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - s:width(v:val) % &tabstop)'), '') . chunks[-1]
|
||||
let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - s:_width(v:val) % &tabstop)'), '') . chunks[-1]
|
||||
let msg = strpart(msg, 0, &columns - 1)
|
||||
|
||||
set noruler noshowcmd
|
||||
|
@ -212,7 +224,7 @@ function! syntastic#util#findInParent(what, where) " {{{2
|
|||
|
||||
let old = ''
|
||||
while here != ''
|
||||
let p = split(globpath(here, a:what), '\n')
|
||||
let p = split(globpath(here, a:what, 1), '\n')
|
||||
|
||||
if !empty(p)
|
||||
return fnamemodify(p[0], ':p')
|
||||
|
@ -249,8 +261,19 @@ function! syntastic#util#shescape(string) " {{{2
|
|||
endfunction " }}}2
|
||||
|
||||
" A less noisy shellescape(expand())
|
||||
function! syntastic#util#shexpand(string) " {{{2
|
||||
return syntastic#util#shescape(expand(a:string))
|
||||
function! syntastic#util#shexpand(string, ...) " {{{2
|
||||
return syntastic#util#shescape(a:0 ? expand(a:string, a:1) : expand(a:string, 1))
|
||||
endfunction " }}}2
|
||||
|
||||
" Escape arguments
|
||||
function! syntastic#util#argsescape(opt) " {{{2
|
||||
if type(a:opt) == type('') && a:opt != ''
|
||||
return [a:opt]
|
||||
elseif type(a:opt) == type([])
|
||||
return map(copy(a:opt), 'syntastic#util#shescape(v:val)')
|
||||
endif
|
||||
|
||||
return []
|
||||
endfunction " }}}2
|
||||
|
||||
" decode XML entities
|
||||
|
@ -311,16 +334,38 @@ function! s:_translateFilter(filters) " {{{2
|
|||
endfunction " }}}2
|
||||
|
||||
function! s:_translateElement(key, term) " {{{2
|
||||
if a:key ==? 'level'
|
||||
let ret = 'v:val["type"] !=? ' . string(a:term[0])
|
||||
elseif a:key ==? 'type'
|
||||
let ret = a:term ==? 'style' ? 'get(v:val, "subtype", "") !=? "style"' : 'has_key(v:val, "subtype")'
|
||||
elseif a:key ==? 'regex'
|
||||
let ret = 'v:val["text"] !~? ' . string(a:term)
|
||||
elseif a:key ==? 'file'
|
||||
let ret = 'bufname(str2nr(v:val["bufnr"])) !~# ' . string(a:term)
|
||||
let fkey = a:key
|
||||
if fkey[0] == '!'
|
||||
let fkey = fkey[1:]
|
||||
let not = 1
|
||||
else
|
||||
call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(a:key)))
|
||||
let not = 0
|
||||
endif
|
||||
|
||||
if fkey ==? 'level'
|
||||
let op = not ? ' ==? ' : ' !=? '
|
||||
let ret = 'v:val["type"]' . op . string(a:term[0])
|
||||
elseif fkey ==? 'type'
|
||||
if a:term ==? 'style'
|
||||
let op = not ? ' ==? ' : ' !=? '
|
||||
let ret = 'get(v:val, "subtype", "")' . op . '"style"'
|
||||
else
|
||||
let op = not ? '!' : ''
|
||||
let ret = op . 'has_key(v:val, "subtype")'
|
||||
endif
|
||||
elseif fkey ==? 'regex'
|
||||
let op = not ? ' =~? ' : ' !~? '
|
||||
let ret = 'v:val["text"]' . op . string(a:term)
|
||||
elseif fkey ==? 'file' || fkey[:4] ==? 'file:'
|
||||
let op = not ? ' =~# ' : ' !~# '
|
||||
let ret = 'bufname(str2nr(v:val["bufnr"]))'
|
||||
let mod = fkey[4:]
|
||||
if mod != ''
|
||||
let ret = 'fnamemodify(' . ret . ', ' . string(mod) . ')'
|
||||
endif
|
||||
let ret .= op . string(a:term)
|
||||
else
|
||||
call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(fkey)))
|
||||
let ret = "1"
|
||||
endif
|
||||
return ret
|
||||
|
@ -332,7 +377,11 @@ function! s:_rmrf(what) " {{{2
|
|||
endif
|
||||
|
||||
if getftype(a:what) ==# 'dir'
|
||||
for f in split(globpath(a:what, '*'), "\n")
|
||||
if filewritable(a:what) != 2
|
||||
return
|
||||
endif
|
||||
|
||||
for f in split(globpath(a:what, '*', 1), "\n")
|
||||
call s:_rmrf(f)
|
||||
endfor
|
||||
silent! call system(s:rmdir . ' ' . syntastic#util#shescape(a:what))
|
||||
|
|
|
@ -21,6 +21,7 @@ CONTENTS *syntastic-contents*
|
|||
|
||||
1.Intro........................................|syntastic-intro|
|
||||
1.1.Quick start............................|syntastic-quickstart|
|
||||
1.2.Recommended settings...................|syntastic-recommended|
|
||||
2.Functionality provided.......................|syntastic-functionality|
|
||||
2.1.The statusline flag....................|syntastic-statusline-flag|
|
||||
2.2.Error signs............................|syntastic-error-signs|
|
||||
|
@ -85,13 +86,35 @@ You can see the list of checkers available for the current filetype with the
|
|||
|
||||
You probably want to override the configured list of checkers for the
|
||||
filetypes you use, and also change the arguments passed to specific checkers
|
||||
to suit your needs. See |syntastic-checker-options| for details.
|
||||
to suit your needs. See |syntastic-checker-options| below for details.
|
||||
|
||||
Use |:SyntasticCheck| to manually check right now. Use |:Errors| to open the
|
||||
|location-list| window, and |:lclose| to close it. You can clear the error
|
||||
list with |:SyntasticReset|, and you can use |:SyntasticToggleMode| to switch
|
||||
between active (checking on writing the buffer) and passive (manual) checking.
|
||||
|
||||
You don't have to switch focus to the |location-list| window to jump to the
|
||||
different errors. Vim provides several built-in commands for this, for
|
||||
example |:lnext| and |:lprevious|. You may want to add shortcut mappings for
|
||||
these commands, or perhaps install a plugin such as Tim Pope's 'unimpaired'
|
||||
(see https://github.com/tpope/vim-unimpaired) that provides such mappings.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
1.2. Recommended settings *syntastic-recommended*
|
||||
|
||||
Syntastic has a large number of options that can be configured, and the
|
||||
defaults are not particularly well suitable for new users. It is recommended
|
||||
that you start by adding the following lines to your vimrc, and return to them
|
||||
later as needed: >
|
||||
set statusline+=%#warningmsg#
|
||||
set statusline+=%{SyntasticStatuslineFlag()}
|
||||
set statusline+=%*
|
||||
|
||||
let g:syntastic_always_populate_loc_list = 1
|
||||
let g:syntastic_auto_loc_list = 1
|
||||
let g:syntastic_check_on_open = 1
|
||||
let g:syntastic_check_on_wq = 0
|
||||
<
|
||||
==============================================================================
|
||||
2. Functionality provided *syntastic-functionality*
|
||||
|
||||
|
@ -163,8 +186,9 @@ Example: >
|
|||
You can use the |:Errors| command to display the errors for the current buffer
|
||||
in the |location-list|.
|
||||
|
||||
Note that when you use |:Errors|, the current location list is overwritten
|
||||
with Syntastic's own location list.
|
||||
Note that when you use |:Errors| the current location list is overwritten with
|
||||
Syntastic's own location list. The location list is also overwritten when
|
||||
|syntastic_auto_jump| is non-zero and the cursor has to jump to an issue.
|
||||
|
||||
By default syntastic doesn't fill the |location-list| with the errors found by
|
||||
the checkers, in order to reduce clashes with other plugins. Consequently, if
|
||||
|
@ -382,12 +406,17 @@ when saving or opening a file.
|
|||
When set to 0 the cursor won't jump automatically. >
|
||||
let g:syntastic_auto_jump = 0
|
||||
<
|
||||
When set to 1 the cursor will always jump to the first issue detected. >
|
||||
When set to 1 the cursor will always jump to the first issue detected,
|
||||
regardless of type. >
|
||||
let g:syntastic_auto_jump = 1
|
||||
<
|
||||
When set to 2 the cursor will jump to the first issue detected, but only if
|
||||
this issue is an error. >
|
||||
let g:syntastic_auto_jump = 2
|
||||
<
|
||||
When set to 3 the cursor will jump to the first error detected, if any. If
|
||||
all issues detected are warnings, the cursor won't jump. >
|
||||
let g:syntastic_auto_jump = 3
|
||||
<
|
||||
*'syntastic_auto_loc_list'*
|
||||
Default: 2
|
||||
|
@ -424,8 +453,9 @@ Default: {}
|
|||
Use this option to map non-standard filetypes to standard ones. Corresponding
|
||||
checkers are mapped accordingly, which allows syntastic to check files with
|
||||
non-standard filetypes: >
|
||||
let g:syntastic_filetype_map = { "latex": "tex",
|
||||
\ "gentoo-metadata": "xml" }
|
||||
let g:syntastic_filetype_map = {
|
||||
\ "latex": "tex",
|
||||
\ "gentoo-metadata": "xml" }
|
||||
<
|
||||
Composite filetypes can also be mapped to simple types, which disables the
|
||||
default behaviour of running both checkers against the input file: >
|
||||
|
@ -440,9 +470,10 @@ done).
|
|||
|
||||
The option should be set to something like: >
|
||||
|
||||
let g:syntastic_mode_map = { "mode": "active",
|
||||
\ "active_filetypes": ["ruby", "php"],
|
||||
\ "passive_filetypes": ["puppet"] }
|
||||
let g:syntastic_mode_map = {
|
||||
\ "mode": "active",
|
||||
\ "active_filetypes": ["ruby", "php"],
|
||||
\ "passive_filetypes": ["puppet"] }
|
||||
<
|
||||
"mode" can be mapped to one of two values - "active" or "passive". When set
|
||||
to "active", syntastic does automatic checking whenever a buffer is saved or
|
||||
|
@ -458,30 +489,49 @@ the "passive_filetypes" array ("active_filetypes" is ignored).
|
|||
If any of "mode", "active_filetypes", or "passive_filetypes" are left
|
||||
unspecified, they default to values above.
|
||||
|
||||
If local variable |'b:syntastic_mode'| is defined its value takes precedence
|
||||
over all calculations involving |'syntastic_mode_map'| for the corresponding
|
||||
buffer.
|
||||
|
||||
At runtime, the |:SyntasticToggleMode| command can be used to switch between
|
||||
active and passive modes.
|
||||
|
||||
*'b:syntastic_mode'*
|
||||
Default: unset
|
||||
Only the local form |'b:syntastic_mode'| is used. When set to either "active"
|
||||
or "passive", it takes precedence over |'syntastic_mode_map'| when deciding
|
||||
whether the corresponding buffer should be checked automatically.
|
||||
|
||||
*'syntastic_quiet_messages'*
|
||||
Default: {}
|
||||
Use this option to filter out some of the messages produced by checkers. The
|
||||
option should be set to something like: >
|
||||
let g:syntastic_quiet_messages = { "level": "warnings",
|
||||
\ "type": "style",
|
||||
\ "regex": '\m\[C03\d\d\]',
|
||||
\ "file": ['\m^/usr/include/', '\m\c\.h$'] }
|
||||
let g:syntastic_quiet_messages = {
|
||||
\ "!level": "errors",
|
||||
\ "type": "style",
|
||||
\ "regex": '\m\[C03\d\d\]',
|
||||
\ "file:p": ['\m^/usr/include/', '\m\c\.h$'] }
|
||||
<
|
||||
Each element turns off messages matching the patterns specified by the
|
||||
corresponding value. Values are lists, but if a list consist of a single
|
||||
element you can omit adding the brackets (e.g. you can write "style" instead
|
||||
of ["style"]). Elements with values [] or '' are ignored (this is useful for
|
||||
element you may omit the brackets (e.g. you may write "style" instead of
|
||||
["style"]). Elements with values [] or '' are ignored (this is useful for
|
||||
overriding filters, cf. |filter-overrides|).
|
||||
|
||||
"level" - takes one of two values, "warnings" or "errors"
|
||||
"type" - can be either "syntax" or "style"
|
||||
"regex" - is matched against the messages' text as a case insensitive
|
||||
|regular-expression|
|
||||
"file" - is matched against the filename the error refers to, as a case
|
||||
sensitive |regular-expression|.
|
||||
"file" - is matched against the filenames the messages refer to, as a
|
||||
case sensitive |regular-expression|.
|
||||
|
||||
If a key is prefixed by an exclamation mark "!", the corresponding filter is
|
||||
negated (i.e. the above example silences all messages that are NOT errors).
|
||||
|
||||
The "file" key may be followed by one or more filename modifiers (see
|
||||
|filename-modifiers|). The modifiers are applied to the filenames the messages
|
||||
refer to before matching against the value (i.e. in the above example the full
|
||||
path of the issues are matched against '\m^/usr/include/' and '\m\c\.h$').
|
||||
|
||||
If |'syntastic_id_checkers'| is set, filters are applied before error messages
|
||||
are labeled with the names of the checkers that created them.
|
||||
|
@ -685,8 +735,9 @@ options that can be set, these are usually documented in the wiki:
|
|||
In the same vein, 'g:syntastic_<filetype>_<checker-name>_quiet_messages' can
|
||||
be used to restrict message filters to messages produced by specific checkers.
|
||||
Example: >
|
||||
let g:syntastic_python_pylama_quiet_messages = { "type": "style",
|
||||
\ "regex": '\m\[C03\d\d\]' }
|
||||
let g:syntastic_python_pylama_quiet_messages = {
|
||||
\ "type": "style",
|
||||
\ "regex": '\m\[C03\d\d\]' }
|
||||
<
|
||||
See |syntastic_quiet_messages| for the syntax.
|
||||
|
||||
|
|
|
@ -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-148'
|
||||
lockvar g:_SYNTASTIC_VERSION
|
||||
|
||||
" Sanity checks {{{1
|
||||
|
@ -154,7 +154,7 @@ let s:modemap = g:SyntasticModeMap.Instance()
|
|||
" @vimlint(EVL103, 1, a:argLead)
|
||||