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

时间:2011-06-27 17:45:08

标签: vim strip autocmd

我有一个Vim autocmd,可以在写入之前删除文件中的尾随空格。我几乎百分之百地想要这个,但是有一些我希望它禁用的文件类型。传统的做法是在逗号分隔列表中列出您希望autocmd运行的文件类型,例如:

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

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

有没有办法将autocmd模式与所有文件匹配除了那些匹配模式的文件?我在文档中找不到相应的NOT匹配器。

6 个答案:

答案 0 :(得分:55)

*.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 :(得分:48)

单行方式的另一种选择:

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

然后你可以为所有文件类型做一些你喜欢的事情,除了黑名单中的那些。

答案 2 :(得分:11)

最简单的方法是将一个文件类型的局部变量设置为true。然后设置automcommand如果该变量为false(如果为其他所有设置)或者它是否存在(不需要预设)。

autocmd BufWritePre *.foo let b:foo=true

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

根据评论

更改了变量前缀

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

你可以在同一个正则表达式上做except:

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

这将对除 <your_command>.out 之外的所有文件扩展名执行 .diffs