VIM + Syntastic:如何禁用检查器?

127

我正在使用Syntastic插件对我的HTML文件进行语法检查。由于启用了“validator w3”检查器的大型文件,GVIM或VIM在保存文件(:w)时变得非常缓慢。

是否可以在当前会话中暂时关闭Syntastic插件?


5
尝试输入 let g:syntastic_disabled_filetypes=['html'],该命令可禁用 Syntastic 插件在 HTML 文件中的语法检查。 - yakiang
10个回答

178

使用:SyntasticToggleMode可以将Syntastic切换到被动模式,这将禁用自动检查。您可以通过运行:SyntasticCheck来检查文件。

更多信息,请参见:help syntastic-commands

另外,如果您发现Syntastic速度较慢,请考虑尝试ale作为替代品。与Syntastic不同,它以异步方式运行,因此即使速度较慢,也不应该阻碍您的工作。


1
有没有办法创建一个单一的别名或将一个键映射为切换这个功能?即,:error 或 Ctrl+Shift/Alt+e 在 :SyntasticCheck:SyntasticToggleMode 之间切换。 - cintron
2
你可以在 .vimrc 中这样创建一个别名::command Sd SyntasticToggleMode 然后在 vi 中按下 :Sd,它将禁用 Syntastic。有关如何执行此操作的更多信息,请参见此处:https://dev59.com/Gm865IYBdhLWcg3wTc3h - Eric Leschinski
2
很好。这是一个映射到F6的代码,如果有人想使用它,可以这样做:silent! nmap <F6> :SyntasticToggleMode<CR> - lfender6445

97

我默认禁用了Syntastic,并使用以下内容在我的.vimrc文件中启用/禁用错误检查:

let g:syntastic_mode_map = { 'mode': 'passive', 'active_filetypes': [],'passive_filetypes': [] }
nnoremap <C-w>E :SyntasticCheck<CR>

当我需要使用错误检查时,我只需按下:ctrl-w E


4
我也已将此添加到我的.vimrc文件中。然而,如果我按下Ctrl-w E,Syntastic会弹出一秒钟然后消失。有什么想法是出了什么问题,或者如何跟踪解决这个问题? - Anticom
我认为映射不应该有:SyntasticToggleMode<CR>,删除它应该可以解决你的问题@Anticom。 - Achal Dave
@AchalDave 对我没有修复。 - Anticom
嗯,不知道。这是我的 Syntastic 设置的样子:https://github.com/achalddave/dotfiles/blob/622f991617887fc7dc95ac0e5018c92c6b9c871e/vim/.vimrc#L170 - Achal Dave
似乎e必须小写,否则它将无法工作。此外,在按下“e”之前,需要确保释放控制。 - lucidbrot
显示剩余2条评论

34

除了Jamie和gospes的答案之外,还可以通过以下方式指定检查器来完全禁用检查器

let g:syntastic_html_checkers=['']

同时确保 syntastic_check_on_open 没有设置为1,否则会抵消上面的行:
let g:syntastic_check_on_open = 0

11

你可以像Jamie Schembri所回答的那样,在整个会话中关闭Syntastic。但是,如果只是一个“非常大的文件”的问题,您可能希望仅禁用该缓冲区。

我在工作中处理的一些文件完全不符合PSR标准,但大多数文件都能正常工作。我正在寻找一种方法,只针对这些有问题的文件禁用Syntastic功能。主要贡献者提供的'SyntasticDisableToggle'解决方案的简化形式对我有用:

"disable syntastic on a per buffer basis (some work files blow it up)
function! SyntasticDisableBuffer()
    let b:syntastic_skip_checks = 1
    SyntasticReset
    echo 'Syntastic disabled for this buffer'
endfunction

command! SyntasticDisableBuffer call SyntasticDisableBuffer()

因为这不会影响其他缓冲区,所以我可以继续在我打开的任何其他(部分)兼容文件中使用这个很棒的插件。


7
这并没有直接回答问题,但可以帮助当前会话以外的情况。如果您有一个必须经常编辑但知道您总是想禁用 Syntastic 的文件(例如它有成千上万的错误,您不打算修复它们,而保留它会导致用户界面减慢),那么永久地将其列入黑名单非常方便。
要做到这一点,请使用 syntastic_ignore_files 选项。虽然此功能有点难以找到,但您可以使用正则表达式来列入黑名单。
                                                    'syntastic_ignore_files'
Default: []
Use this option to specify files that syntastic should never check.  It's a
list of regular-expression patterns.  The full paths of files (see ::p) are
matched against these patterns, and the matches are case sensitive. Use \c
to specify case insensitive patterns.  Example:
    let g:syntastic_ignore_files = ['\m^/usr/include/', '\m\c\.h$']

1
做得很好!虽然不是问题所问的,但还是给你加1赞,因为很有用。 - bschlueter
谢谢,我使用这个来防止在使用C-X C-E编辑命令行时检查临时bash文件:let g:syntastic_ignore_files = ['\m^/tmp/bash-.*'] - Anthony Geoghegan

7
以下设置对我有效:

以下设置对我有效。

let g:syntastic_mode_map = { 'mode': 'passive', 'active_filetypes':   [],'passive_filetypes': [] }
noremap <C-w>e :SyntasticCheck<CR>
noremap <C-w>f :SyntasticToggleMode<CR>

Ctrl-w + e shall enable checking
Ctrl-w + f shall disable checking 

To disable warnings use: 
let g:syntastic_quiet_messages={'level':'warnings'}

6

与其他人提到的类似,这是一个vimrc片段,它默认关闭Syntastic,但映射了一个按钮(这里是F10)来检查当前文件,并使用相同的按钮作为切换以关闭检查。它有点慢,但有效。

let g:syntastic_check_on_open = 0                                                                                 
let g:syntastic_check_on_wq = 0
let g:syntastic_mode_map = {'mode':'passive'}
nnoremap <F10> :SyntasticCheck<CR> :SyntasticToggleMode<CR> :w<CR>

4
另一个关闭单个缓冲区(不考虑文件类型)检查的选项是使用:let b:syntastic_mode="passive"。由于它不是切换开关,所以即使缓冲区当前处于被动模式,它也能起作用。
如果您想暂时关闭所有缓冲区中所有文件类型的检查,您可以使用:bufdo let b:syntastic_mode="passive"。我已设置映射来关闭/打开所有缓冲区的检查。
nnoremap <leader>sN :bufdo let b:syntastic_mode="passive"<cr>
nnoremap <leader>sY :bufdo unlet b:syntastic_mode<cr>

当有很多打开的缓冲区时,使用:wqa特别有帮助。


0

我主要使用Ale和Syntastic,因为Rust Ale的支持还不太好。在我的情况下,我使用vim-plug软件包管理器,并进行设置,以使其不会自动启用任何这些插件。我使用了切换策略。

在我的情况下,我希望默认情况下使用Ale,并为Rust使用Syntastic

在vimrc的插件部分,我做了这个

Plug 'w0rp/ale', { 'on': 'ALEToggle' }
Plug 'vim-syntastic/syntastic', { 'on': 'SyntasticToggleMode' }

然后我设置了一个绑定来启用代码检查器(我使用 l 作为代码检查器的助记符)

nnoremap <leader>l :ALEToggle<CR>

对于Rust,我覆盖相同的绑定

au FileType rust noremap <buffer> <leader>l :SyntasticToggleMode<CR>

另外,我不得不从我的vimrc中删除statusline的内容,否则在禁用Syntastic时加载它会出现错误。

" Syntastic stuff
"set statusline+=%#warningmsg#
"set statusline+=%{SyntasticStatuslineFlag()}
"set statusline+=%*

let g:rustfmt_autosave = 1
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
" Syntastic stuff

敬礼


0
感谢Steven Lu,现在我可以忽略Ansible Roles的文件了。
" ignore files of Ansible Roles.
let g:syntastic_ignore_files = ['\m^roles/']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接