Vim对所有文件类型运行autocmd,除了

ux6nzvsh  于 2022-11-11  发布在  其他
关注(0)|答案(6)|浏览(146)

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

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

但在这种情况下,这将是繁重的。
是否有方法将autocmd模式与所有文件(匹配该模式的文件除外)进行匹配?我在文档中找不到与NOT匹配器等效的方法。

s5a0g9ez

s5a0g9ez1#

*.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的答案,您可以检查buffer局部变量,并确定是否使用该变量进行剥离。如果您决定不剥离通常会剥离的文件类型的缓冲区,这也允许您执行一次性禁用。

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
7eumitmz

7eumitmz2#

另一人选择行道:

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

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

bnl4lu3b

bnl4lu3b3#

一个好的方法是为一个文件类型设置一个本地变量为true,然后如果该变量为false(如果为其他所有文件类型设置)或者如果该变量存在(不需要预先设置),则设置automcommand。

autocmd BufWritePre *.foo let b:foo=true

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

已根据注解更改变量前缀

laximzn5

laximzn54#

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

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

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

qaxu7uf2

qaxu7uf25#

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

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

tjjdgumg6#

我们的.vimrc配置文件只在启动时运行一次,所以如果你在这个时候进行if测试,它将不会工作,因为此时没有python文件正在被编辑。
但您可以使用.vimrc设置自动行为:Vim在每次遇到特殊情况时都会做的事情。2在你的情况下,这种情况可能是:“正在编辑新文件,其文件类型为'python'"。请参阅:h:Au

相关问题