Vim在所有文件类型中运行autocmd,除了...

96

我有一个Vim autocmd,在写入文件之前会删除文件中的尾随空格。我希望这个功能几乎在所有情况下都使用,但是有一些文件类型我想要禁用它。传统做法是在以逗号分隔的列表中列出您想要自动命令运行的文件类型,例如:

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

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

有没有一种方法可以将自动命令模式与除匹配该模式的文件之外的所有文件进行匹配?我在文档中找不到相当于NOT匹配器的等效项。

6个回答

75

*.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
如果您想使vim配置更加模块化,可以在文件类型插件部分中添加设置let b:noStripWhitespace。例如,要禁用git提交的尾随空格删除,请将该行添加到~/.vim/ftplugin/gitcommit.vim文件中。 - flyingdutchman

67

另外一种一行代码的选择:

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

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


1
想指出这对我没有用(不确定是因为neovim还是我的vim版本)。但是我的建议如下确实有效。 - Steve Chavez
我非常确定它不起作用,因为在“做你喜欢的事情”之后还需要一个 | endif - Pillager225

18
一个好的方法是设置一个局部变量,将其中一个文件类型设置为true。然后设置automcommand,如果该变量为false(如果为其他所有内容设置),或者如果它存在(无需预设)。
autocmd BufWritePre *.foo let b:foo=true

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

根据评论更改变量前缀


9

您可以在相同的正则表达式上执行排除操作:

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

这将对除了.out.diffs文件扩展名之外的所有文件扩展名运行<your_command>命令。


3

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

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

1
我们的.vimrc配置文件只在启动时运行一次。因此,如果您在此时放置一个if测试,它将不起作用,因为当前没有正在编辑的python文件。
但是,您可以使用.vimrc设置自动行为:每次遇到特定条件时,vim都会执行某些操作。在您的情况下,条件可以是:“正在编辑新文件,并且其文件类型为“python””。请参见:h:au

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接