2011-06-27 38 views
59

我有一个Vim autocmd,在写入之前删除文件中的尾部空白。我几乎要100%的时间,但是有一些文件类型我想禁用它。传统的智慧是列出你想要自动命令可以在一个逗号分隔的列表对运行文件类型,例如:Vim在所有文件类型上运行autocmd除了

autocmd BufWritePre *.rb, *.js, *.pl 

但在这种情况下,这将是繁重的。

有没有办法将autocmd模式与所有文件进行匹配,除了那些匹配模式?我无法在文档中找到与NOT匹配器等效的内容。

回答

44

*.rb不是文件类型。这是一个文件模式。 ruby是文件类型,甚至可以在没有.rb扩展名的文件上设置。所以,最可能需要的是autocmd调用的函数,用于检查不应该对其执行操作的文件类型并删除空白。

fun! StripTrailingWhitespace() 
    " Don't strip on these filetypes 
    if &ft =~ 'ruby\|javascript\|perl' 
     return 
    endif 
    %s/\s\+$//e 
endfun 

autocmd BufWritePre * call StripTrailingWhitespace() 

大厦埃文的回答,您可以检查的缓冲区局部变量,并确定是否使用该做条。如果您决定不想剥离通常会剥离的文件类型的缓冲区,这也可以让您执行一次性禁用。

fun! StripTrailingWhitespace() 
    " Only strip if the b:noStripeWhitespace variable isn't set 
    if exists('b:noStripWhitespace') 
     return 
    endif 
    %s/\s\+$//e 
endfun 

autocmd BufWritePre * call StripTrailingWhitespace() 
autocmd FileType ruby,javascript,perl let b:noStripWhitespace=1 
+1

对,我希望能够排除某些文件扩展名的模式,并且绝对会滥用我描述中的术语。虽然我希望有一个单行程,但将函数中的逻辑包装起来并称之为简单。谢谢! – jerodsanto

10

最简单的方法是将一个文件类型的局部变量设置为true。然后设置automcommand(如果该变量为假)(如果设置为其他所有内容)或者它根本不存在(不需要预设它)。

autocmd BufWritePre *.foo let b:foo=true 

if !exists("b:foo") 
    autocmd ... 
endif 

改变基于评论

40

变量前缀之一行的方式另一种选择:

let blacklist = ['rb', 'js', 'pl'] 
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like 

然后,你可以做你喜欢的,除了那些在黑名单中的所有文件类型的东西。

相关问题