Vim除了在所有文件types上运行autocmd
我有一个Vim autocmd,在写入之前删除文件中的尾部空格。 我几乎想要100%的时间,但有一些文件types,我希望它被禁用。 传统的观点是列出你想要autocmd在逗号分隔的列表中运行的文件types,例如:
autocmd BufWritePre *.rb, *.js, *.pl
但在这种情况下,这将是繁重的。
有没有办法匹配所有文件的autocmd模式,除了匹配的模式? 我无法在文档中find与“不匹配器”等效的内容。
*.rb
不是文件types。 这是一个文件模式。 ruby
是文件types,甚至可以在没有.rb
扩展名的文件上设置。 所以,你最可能想要的是autocmd调用的一个函数,用于检查不应该被执行的文件types,并去除空白。
fun! StripTrailingWhitespace() " Don't strip on these filetypes if &ft =~ 'ruby\|javascript\|perl' return endif %s/\s\+$//e endfun autocmd BufWritePre * call StripTrailingWhitespace()
在evan的答案的基础上,你可以检查一个缓冲区局部variables,并确定是否使用该条。 这也可以让你做一次性禁用,如果你决定你不想剥离一个缓冲区,这是一个你通常会剥夺的文件types。
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
一种线路的另一种select:
let blacklist = ['rb', 'js', 'pl'] autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like
然后,除了黑名单中的文件types之外,您可以对所有文件types执行一些操作。
可能对你有帮助:)
最简单的方法是将一个文件types的局部variables设置为true。 然后设置automcommand,如果该variables是假的(如果设置为其他)或者它根本不存在(不需要预设)。
autocmd BufWritePre *.foo let b:foo=true if !exists("b:foo") autocmd ... endif
基于评论改变了可变前缀