我有一个Vim autocmd,在写入之前删除文件中的尾部空白。我几乎要100%的时间,但是有一些文件类型我想禁用它。传统的智慧是列出你想要自动命令可以在一个逗号分隔的列表对运行文件类型,例如:Vim在所有文件类型上运行autocmd除了
autocmd BufWritePre *.rb, *.js, *.pl
但在这种情况下,这将是繁重的。
有没有办法将autocmd模式与所有文件进行匹配,除了那些匹配模式?我无法在文档中找到与NOT匹配器等效的内容。
我有一个Vim autocmd,在写入之前删除文件中的尾部空白。我几乎要100%的时间,但是有一些文件类型我想禁用它。传统的智慧是列出你想要自动命令可以在一个逗号分隔的列表对运行文件类型,例如:Vim在所有文件类型上运行autocmd除了
autocmd BufWritePre *.rb, *.js, *.pl
但在这种情况下,这将是繁重的。
有没有办法将autocmd模式与所有文件进行匹配,除了那些匹配模式?我无法在文档中找到与NOT匹配器等效的内容。
*.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
最简单的方法是将一个文件类型的局部变量设置为true。然后设置automcommand(如果该变量为假)(如果设置为其他所有内容)或者它根本不存在(不需要预设它)。
autocmd BufWritePre *.foo let b:foo=true
if !exists("b:foo")
autocmd ...
endif
改变基于评论
变量前缀之一行的方式另一种选择:
let blacklist = ['rb', 'js', 'pl']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like
然后,你可以做你喜欢的,除了那些在黑名单中的所有文件类型的东西。
对,我希望能够排除某些文件扩展名的模式,并且绝对会滥用我描述中的术语。虽然我希望有一个单行程,但将函数中的逻辑包装起来并称之为简单。谢谢! – jerodsanto