91

我有一个 Vim 自动命令,可以在写入之前删除文件中的尾随空格。我几乎 100% 的时间都想要这个,但是我希望禁用一些文件类型。传统的智慧是在逗号分隔的列表中列出您希望 autocmd 运行的文件类型,例如:

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

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

有没有办法将 autocmd 模式与除了匹配模式的文件之外的所有文件进行匹配?我在文档中找不到与 NOT 匹配器的等价物。

4

6 回答 6

70

*.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
于 2011-06-27T18:04:30.240 回答
64

单线方式的另一种选择:

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

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

于 2012-05-02T08:58:30.037 回答
17

一个好方法是将一个文件类型的局部变量设置为 true。如果该变量为假(如果为其他所有内容设置)或它根本存在(无需预设),则设置自动命令。

autocmd BufWritePre *.foo let b:foo=true

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

根据注释更改变量前缀

于 2011-06-27T18:13:14.593 回答
4

您可以在同一个正则表达式上执行 except:

autocmd BufWritePre *\(.out\|.diffs\)\@<! <your_command>

这将适用于除or<your_command>之外的所有文件扩展名。.out.diffs

于 2021-05-09T23:38:04.713 回答
1

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

au Syntax *\(^rst\)\@<! …
于 2020-03-07T12:28:06.217 回答
1

我们的 .vimrc 配置文件在启动时只运行一次。因此,如果您此时进行 if 测试,它将不起作用,因为当前没有正在编辑 python 文件。

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

于 2020-07-03T09:42:11.467 回答