Vim在所有文件类型上运行autocmd


81

我有一个Vim autocmd,可以在写入之前删除文件中的尾随空格。我几乎需要100%的时间,但是有一些文件类型我希望将其禁用。常规做法是在逗号分隔的列表中列出要让autocmd运行的文件类型,例如:

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

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

除了那些匹配模式的文件,是否有办法将autocmd模式与所有文件匹配?我在文档中找不到等效于NOT匹配项的内容。

Answers:


66

*.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()

在evan的答案的基础上,您可以检查是否存在局部缓冲区变量,并确定是否使用该变量进行剥离。如果您决定不想剥离通常是要剥离的文件类型的缓冲区,这也可以一次性禁用。

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 2011年

如果要使vim配置更加模块化,可以将设置添加let b:noStripWhitespace到文件类型插件部分的文件中。Fx禁用git commit的尾随空格删除,将行添加到~/.vim/ftplugin/gitcommit.vim
flyingdutchman

58

单线方式的另一种选择:

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

然后,您可以对除黑名单中的所有文件类型执行所需的操作。


15

最简单的方法是将一个文件类型的本地变量设置为true。然后,如果该变量为false(如果为其他所有变量设置)或根本不存在(无需对其进行预设),则设置automcommand。

autocmd BufWritePre *.foo let b:foo=true

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

根据评论更改了变量前缀


1

这适用于Syntax自动命令,其中模式(<match>)只是文件类型。它不包括任何rst文件:

au Syntax *\(^rst\)\@<! …

1

我们的.vimrc配置文件在启动时仅运行一次。因此,如果您此时进行if测试,它将无法正常工作,因为当前未编辑任何python文件。

但是您可以使用.vimrc来设置自动行为:vim每次遇到特殊情况时都会执行的操作。根据您的情况,条件可能是:“正在编辑一个新文件,其文件类型为'python'”。见:h:au

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.