【问题标题】:Vim run autocmd on all filetypes EXCEPTVim 在所有文件类型上运行 autocmd,除了
【发布时间】:2011-06-27 17:45:07
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: vim strip autocmd


    【解决方案1】:

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

    【讨论】:

    • 是的,我希望有一种模式可以排除某些文件扩展名,并且肯定会滥用我的描述中的术语。虽然我希望有一个单行,但将逻辑包装在一个函数中并调用它并不太破旧。谢谢!
    • 如果你想让你的 vim 配置更加模块化,你可以将设置 let b:noStripWhitespace 添加到文件类型插件部分的文件中。 F.x.要禁用 git 提交的尾随空格删除,请将行添加到 ~/.vim/ftplugin/gitcommit.vim
    【解决方案2】:

    单线方式的另一种选择:

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

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

    【讨论】:

    • 想指出这对我不起作用(不确定是因为 neovim 还是我的 vim 版本)。但我的below 建议确实奏效了。
    • 我很确定它不起作用,因为它还需要在“做你喜欢的事情”位之后添加一个| endif
    【解决方案3】:

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

    autocmd BufWritePre *.foo let b:foo=true
    
    if !exists("b:foo")
        autocmd ...
    endif
    

    根据评论更改变量前缀

    【讨论】:

      【解决方案4】:

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

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

      这将对除.out.diffs 之外的所有文件扩展名执行&lt;your_command&gt;

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-10-08
            • 1970-01-01
            • 2012-04-04
            • 2016-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多